我有以下代码:
class RadialMenu extends StatefulWidget {
@override
_RadialMenuState createState() => _RadialMenuState();
}
class _RadialMenuState extends State<RadialMenu>
with SingleTickerProviderStateMixin {
AnimationController controller;
@override
void initState() {
super.initState();
controller = AnimationController(
duration: Duration(milliseconds: 900),
vsync: this,
);
}
@override
Widget build(BuildContext context) {
return RadialAnimation(controller: controller);
}
}
class RadialAnimation extends StatelessWidget {
RadialAnimation({Key key, this.controller})
:
super(key: key);
final AnimationController controller;
final Animation<double> scale;
final Animation<double> translation;
final Animation<double> rotation;
build(context) {
return AnimatedBuilder(
animation: controller,
builder: (currentContext, builder) {
return Transform.rotate(
angle: radians(rotation.value),
child: Stack(
alignment: Alignment.center,
children: <Widget>[
_buildButton(currentContext, 0, 'Train Arrivals',
color: Colors.red, icon: FontAwesomeIcons.personBooth),
Transform.scale(
scale: scale.value - 1.5,
child: FloatingActionButton(
child: Icon(FontAwesomeIcons.timesCircle),
onPressed: _close,
backgroundColor: Colors.red,
),
),
Transform.scale(
scale: scale.value,
child: FloatingActionButton(
child: Icon(FontAwesomeIcons.train),
onPressed: _open,
backgroundColor: Colors.black,
),
),
],
),
);
},
);
}
_open() {
controller.forward();
}
_close() {
controller.reverse();
}
_buildButton(
final BuildContext context,
double angle,
String text, {
Color color,
IconData icon,
}) {
final double rad = radians(angle);
return Transform(
transform: Matrix4.identity()
..translate(
(translation.value) * cos(rad),
(translation.value) * sin(rad),
),
child: FloatingActionButton(
child: Icon(icon),
backgroundColor: color,
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (anotherContext) {
return SecondRoute();
}),
);
},
tooltip: text,
),
);
}
}
class SecondRoute extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Title'),
),
body: Center(
child: Text('Data'),
),
);
}
}
在_buildButton
部分中,我希望包含一个Navigator.push
实例,以便在单击该按钮时需要转到另一个路由。
但目前这是不可能的,因为根据我的理解,Navigator.push
需要一个buildcontext,而我不会在这里传递。
请帮助我在这里传递正确的上下文,或者有什么我可以做的事情来解决这个问题?
发布于 2019-03-15 04:05:56
因为您是在builder: (context, builder)
方法内部创建按钮,所以此方法提供给您的上下文与您可以通过参数传递给_buildButton(BuildContext context, ...)
函数并在Navigator.push
方法中使用相同的上下文并转到另一条路径的上下文相同。
更新我之前所说的所有答案都是正确的,但在您的情况下,出现黑屏是因为您在屏幕上有许多FAB,您需要在每个FAB中为tagHero
属性提供一个唯一的值。代码中的更改是在onPress
特性之前的FloatActionButton
构造函数中进行的。我将只把源代码的主要部分放在这里。
build(context) {
return AnimatedBuilder(
animation: controller,
builder: (currentContext, builder) {
return Transform.rotate(
angle: radians(rotation.value),
child: Stack(
alignment: Alignment.center,
children: <Widget>[
_buildButton(currentContext, 0, 'Train Arrivals',
color: Colors.red, icon: FontAwesomeIcons.personBooth),
_buildButton(currentContext, 45, 'Train Fare Enquiry',
color: Colors.green, icon: FontAwesomeIcons.moneyBill),
_buildButton(currentContext, 90, 'Live Train Status',
color: Colors.cyan[400], icon: FontAwesomeIcons.hourglass),
_buildButton(currentContext, 135, 'Train Between Statios',
color: Colors.blue, icon: FontAwesomeIcons.landmark),
_buildButton(currentContext, 180, 'Train Route',
color: Colors.yellow[900], icon: FontAwesomeIcons.route),
_buildButton(currentContext, 225, 'Train Name/Number',
color: Colors.purple, icon: FontAwesomeIcons.train),
_buildButton(currentContext, 270, 'PNR Status',
color: Colors.teal, icon: FontAwesomeIcons.infoCircle),
_buildButton(currentContext, 315, 'Seat Availability',
color: Colors.pinkAccent, icon: FontAwesomeIcons.chair),
Transform.scale(
scale: scale.value - 1.5,
child: FloatingActionButton(
child: Icon(FontAwesomeIcons.timesCircle),
heroTag: "close", /// Unique tag for this FAB
onPressed: _close,
backgroundColor: Colors.red,
),
),
Transform.scale(
scale: scale.value,
child: FloatingActionButton(
child: Icon(FontAwesomeIcons.train),
heroTag: "open", /// Unique tag for this FAB
onPressed: _open,
backgroundColor: Colors.black,
),
),
],
),
);
},
);
}
_buildButton(
final BuildContext context,
double angle,
String text, {
Color color,
IconData icon,
}) {
final double rad = radians(angle);
return Transform(
transform: Matrix4.identity()
..translate(
(translation.value) * cos(rad),
(translation.value) * sin(rad),
),
child: FloatingActionButton(
child: Icon(icon),
backgroundColor: color,
heroTag: text, /// HERE I'am using the text as unique tag fot this FAB.
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (anotherContext) {
return SecondRoute();
}),
);
},
tooltip: text,
),
);
}
发布于 2019-12-04 10:22:28
您是否尝试过为_buildButton
传递onPressed
_buildButton(
final BuildContext context,
double angle,
String text, {
Color color,
IconData icon,
onPressed
})
_buildButton(currentContext, 0, 'Train Arrivals',
color: Colors.red, icon: FontAwesomeIcons.personBooth, onPressed() {
Navigator.of(context).pushNamed( '/route');})
https://stackoverflow.com/questions/55170261
复制相似问题