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,
          );
        },
      );