Flutter 颤振中OnGeneratorOute和routes的差异

Flutter 颤振中OnGeneratorOute和routes的差异,flutter,dart,Flutter,Dart,OnGeneratorOute和颤振路径的优点或使用案例是什么 在我的应用程序的第一页MaterialApp中,我们可以为我们的应用程序定义路由,与使用onGenerateRoute定义路由相同 两者都用于命名 我有一个疑问,在哪种情况下我需要使用路由,在哪种情况下我需要使用onGenerateRoute?根据文档(我将链接放在下面),如果路由不包含请求的路由,则使用onGenerateRoute NB(见下面的评论答案): 没有bug,只是问题报告者使用不当这是因为他没有将设置对象传递给onG

OnGeneratorOute
和颤振路径的优点或使用案例是什么

在我的应用程序的第一页
MaterialApp
中,我们可以为我们的应用程序定义路由,与使用
onGenerateRoute
定义路由相同

两者都用于命名


我有一个疑问,在哪种情况下我需要使用路由,在哪种情况下我需要使用
onGenerateRoute

根据文档(我将链接放在下面),如果路由不包含请求的路由,则使用onGenerateRoute

NB(见下面的评论答案): 没有bug,只是问题报告者使用不当这是因为他没有将设置对象传递给onGenerateRoute方法返回的新MaterialPage路由(请参见本期的最终评论)。[……]


最初的答案提到了一个“bug”: 在不深入任何细节的情况下,这两个属性做了相同的事情,但正如@Alireza所指出的,
routes
首先被检查

此外,使用
onGenerateRoute
可以在推送新路由(页面)之前为您添加自定义业务逻辑。例如,如果您想进行一些初始化

使用Navigator.pushNamed推送命名路由时,路由名称 是在这张地图上查到的。如果名称存在,则关联的 WidgetBuilder用于构造执行以下操作的MaterialPage路由 适当的过渡,包括英雄动画,到新的 路线

将应用程序导航到指定位置时使用的路由生成器回调 路线。 ... 如果路由不包含请求的路由,则使用此选项

重要提示: 您真正想知道的是一个in
onGenerateRoute
属性

问题是,如果使用
onGenerateRoute
创建命名路由,则无法从页面中的RouteSettings对象获取该路由的名称。(不过,附加到设置对象的参数也可以) 换言之:

Widget build(BuildContext context) {
    ModalRoute.of(context).settings.name == null;       //bug
    ModalRoute.of(context).settings.arguments != null;  //ok
    ...
如果您想知道当前路线的名称,这可能会影响您。 例如,如果要弹出一些屏幕:

navigator.popUntil(ModalRoute.withName('/login'));

因此,在解决此问题之前,我建议使用
路由:
属性。

我的解决方案是重新分配MaterialPage路由的设置

例如: //配置路由

final routes = {
  '/': (context) => MainPage(),
};
//统一处理

var onGenerateRoute = (RouteSettings settings) {
    final String name = settings.name;
      final Function pageContentBuilder = routes[name];
      if (pageContentBuilder != null) {
        if (settings.arguments != null) {
          final Route route = MaterialPageRoute(
              settings: settings,
              builder: (context) => pageContentBuilder(context, arguments: settings.arguments));
          return route;
        } else {
          final Route route =
              MaterialPageRoute(settings: settings,
                  builder: (context) => pageContentBuilder(context));
          return route;
        }
      }
    };



   

routes
是静态的,不提供向小部件传递参数、实现不同的
PageRoute
等功能,这就是存在
onGenerateRoute
的原因

在给定的代码中,您将发现如何使用
onGenerateRoute
属性解析参数并将其发送过来,这在简单的
路由
中是不可能的

FooPage
通过
routes
BarPage
通过
ongeneraterout
导航


MaterialApp
中进行初始设置

void main(){
runApp(
材料聚丙烯(
路线:{
“/”:(\u)=>HomePage(),//您还可以使用MaterialApp的“home”属性而不是“/”属性
“/foo”:()=>FooPage(),//无法将参数传递给FooPage。
},
onGenerateRoute:(设置){
如果(settings.name=='/bar'){
final value=settings.arguments as int;//检索值。
返回MaterialPage路由(生成器:()=>BarPage(值));//将其传递给BarPage。
}
return null;//让`onUnknownRoute`处理此行为。
},
),
);
}
home.dart

类主页扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(标题:文本(“主页”),
正文:中(
子:列(
儿童:[
升降按钮(
onPressed:()=>Navigator.pushNamed(上下文“/foo”),
子项:文本(“转到页面”),
),
升降按钮(
onPressed:()=>Navigator.pushNamed(上下文,/bar',参数:42),//传递参数
子项:文本(“转到BarPage”),
),
],
),
),
);
}
}
foo.dart

class FooPage扩展了无状态小部件{
@凌驾
小部件构建()=>Scaffold(appBar:appBar(标题:Text('FooPage'));
}
bar.dart

class BarPage扩展了无状态小部件{
最终整数值;
BarPage(该值);
@凌驾
小部件构建()=>Scaffold(appBar:appBar(标题:Text('BarPage,value=$value'));
}

屏幕截图(供参考)


谢谢你的回答,兄弟。我有一个疑问。也就是说,当我们为应用程序编写代码时,我们可以知道应用程序中哪些页面可用。所以我们可以在routes中提及所有内容。那为什么我们需要onGenerateroute属性呢?你提到的那个bug不是bug,只是问题报告者的错误使用。这是因为他没有将设置对象传递给onGenerateRoute方法返回的新MaterialPage路由(请参阅问题的最终注释)。我刚刚用颤振1.12.13测试了它,它工作得很好。除此之外,与您所说的相反,在该问题中,settings.arguments也为null,而不仅仅是settings.name。考虑更改您的答案,而不是提及bug,提醒需要将设置传递到由OnGeaTeaTouTE返回的新的材质PraveRouTE。