Flutter 使用onGenerateRoute在屏幕之间进行条件退出转换
我正在通过Flutter 使用onGenerateRoute在屏幕之间进行条件退出转换,flutter,flutter-animation,Flutter,Flutter Animation,我正在通过onGenerateRoute设置路线和过渡动画,这非常有效,只是我希望根据条件(例如在选择路径上)设置不同的过渡动画: 导入“包装:颤振/材料.省道”; void main()=>runApp(MyApp()); 类MyApp扩展了无状态小部件{ @凌驾 小部件构建(构建上下文){ 返回材料PP( initialRoute:“/”, onGenerateRoute:(路由设置){ 如果(settings.name=='/')){ 返回页路由生成器( pageBuilder:(构建上下
onGenerateRoute
设置路线和过渡动画,这非常有效,只是我希望根据条件(例如在选择路径上)设置不同的过渡动画:
导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
initialRoute:“/”,
onGenerateRoute:(路由设置){
如果(settings.name=='/')){
返回页路由生成器(
pageBuilder:(构建上下文、动画、,
动画辅助动画)=>
第1页(),
转换生成器:(
构建上下文上下文,
动画,,
动画二级动画,
孩子,
) {
返回幻灯片转换(
位置:吐温(
开始:Offset.zero,
结束:常数偏移(-1.0,0.0),
).animate(secondaryAnimation),//这里我想要不同的过渡
孩子:孩子,
);
},
);
}else if(settings.name=='/second'){
返回页路由生成器(
pageBuilder:(构建上下文、动画、,
动画辅助动画)=>
第2页(),
转换生成器:(
构建上下文上下文,
动画,,
动画二级动画,
孩子,
) {
返回幻灯片转换(
位置:吐温(
开始:常量偏移量(1.0,0.0),结束:偏移量.0)
.制作动画(动画),
子:幻灯片转换(
位置:吐温(
开始:Offset.zero,
结束:常数偏移(0.0,1.0),
).制作动画(第二动画),
孩子:孩子,
));
},
);
}else if(settings.name=='/third'){
返回页路由生成器(
pageBuilder:(构建上下文、动画、,
动画辅助动画)=>
第3页(),
转换生成器:(
构建上下文上下文,
动画,,
动画二级动画,
孩子,
) {
返回幻灯片转换(
位置:吐温(
开始:常量偏移量(0.0,1.0),结束:偏移量.0)
.制作动画(动画),
子:幻灯片转换(
位置:吐温(
开始:Offset.zero,
结束:常数偏移(0.0,1.0),
).制作动画(第二动画),
孩子:孩子,
));
},
);
}否则{
返回null;
}
},
);
}
}
类Page1扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(标题:文本(“第1页”),背景颜色:Colors.blue),
背景颜色:Colors.blue,
正文:专栏(
儿童:[
居中(
孩子:升起按钮(
onPressed:()=>Navigator.pushNamed(上下文“/second”),
子项:文本(“转到第2页,退出过渡幻灯片向左”),
),
),
居中(
孩子:升起按钮(
onPressed:()=>Navigator.pushNamed(上下文“/third”),
子项:文本(“转到带过渡滑盖的第3页”),
),
),
],
),
);
}
}
类Page2扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(标题:文本(“第2页”),背景颜色:Colors.green),
背景颜色:Colors.green,
正文:中(
孩子:升起按钮(
onPressed:()=>Navigator.of(context.pop(),
子项:文本(“返回第1页”),
);
}
}
类Page3扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(标题:文本(“第3页”),背景颜色:Colors.yellow),
背景颜色:Colors.yellow,
正文:中(
孩子:升起按钮(
onPressed:()=>Navigator.of(context.pop(),
子项:文本(“返回第1页”),
);
}
}
由于退出过渡动画(通过secondaryAnimation
)是在屏幕显示之前设置的,因此我无法根据单击的按钮动态更改动画。我如何才能做到这一点?(路由设置){
(RouteSettings settings) {
final transition = settings.arguments as String;
if (settings.name == '/') {
return PageRouteBuilder<dynamic>(
pageBuilder: (BuildContext context, Animation<double> animation,
Animation<double> secondaryAnimation) =>
Page1(),
transitionsBuilder: (
BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
Widget child,
) {
switch (transition) {
case 'firstTransition':
secondaryAnimation = //first animation
break;
case 'secondTransition':
secondaryAnimation = //second animation
break;
}
return SlideTransition(
position: Tween<Offset>(
begin: Offset.zero,
end: const Offset(-1.0, 0.0),
).animate(secondaryAnimation), // Here I want to have differents transitions
child: child,
);
},
);
最终转换=设置。参数为字符串;
如果(settings.name=='/')){
返回页路由生成器(
pageBuilder:(构建上下文、动画、,
动画辅助动画)=>
第1页(),
转换生成器:(
构建上下文上下文,
动画,,
动画二级动画,
孩子,
) {
开关(转换){
案例“第一次过渡”:
secondaryAnimation=//第一个动画
打破
“第二次过渡”案例:
secondaryAnimation=//第二个动画
打破
}
返回幻灯片转换(
位置:吐温(
开始:Offset.zero,
结束:常数偏移(-1.0,0.0),
).animate(secondaryAnimation),//这里我想要不同的过渡
孩子:孩子,
);
},
);
c
(RouteSettings settings) {
final transition = settings.arguments as String;
if (settings.name == '/') {
return PageRouteBuilder<dynamic>(
pageBuilder: (BuildContext context, Animation<double> animation,
Animation<double> secondaryAnimation) =>
Page1(),
transitionsBuilder: (
BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
Widget child,
) {
switch (transition) {
case 'firstTransition':
secondaryAnimation = //first animation
break;
case 'secondTransition':
secondaryAnimation = //second animation
break;
}
return SlideTransition(
position: Tween<Offset>(
begin: Offset.zero,
end: const Offset(-1.0, 0.0),
).animate(secondaryAnimation), // Here I want to have differents transitions
child: child,
);
},
);