美文网首页
路由跳转和传值(命名路由)

路由跳转和传值(命名路由)

作者: Eyes_cc | 来源:发表于2022-06-29 23:00 被阅读0次

一、命名路由

所谓“命名路由”(Named Route)即有名字的路由,我们可以先给路由起一个名字,然后就可以通过路由名字直接打开新的路由了,这为路由管理带来了一种直观、简单的方式。

1、路由表

我们必须先提供并注册一个路由表(routing table),这样应用程序才知道哪个名字与哪个路由组件相对应。其实注册路由表就是给路由起名字,路由表的定义如下:

Map<String, WidgetBuilder> routes;

它是一个Mapkey为路由的名字,是个字符串;value是个WidgetBuilder回调函数,用于生成相应的路由widget。我们在通过路由名字打开新路由时,应用会根据路由名字在路由表中查找到对应的WidgetBuilder回调函数,然后调用该回调函数生成路由widget并返回。

2、注册路由表

路由表的注册方式很简单,在MyApp类的build方法中找到MaterialApp,添加routes属性,代码如下:

MaterialApp(
  title: 'Flutter Demo',
  theme: ThemeData(
    primarySwatch: Colors.blue,
  ),
  //注册路由表
  routes:{
   "new_page":(context) => NewRoute(),
    ... // 省略其它路由注册信息
  } ,
  home: MyHomePage(title: 'Flutter Demo Home Page'),
);

上面的代码中home路由并没有使用命名路由,如果我们也想将home注册为命名路由应该怎么做呢?其实很简单,直接看代码:

return MaterialApp(
  title: 'Flutter Demo',
  theme: ThemeData(
    primarySwatch: Colors.blue,
  ),
  //注册路由表
  routes:{
    "new_page":(context) => const TipRoute(text: ''),
    "/":(context) => const MyHomePage(title: 'Flutter Demo Home Page'), //注册首页路由
  } 
);

可以看到,我们只需在路由表中注册一下MyHomePage路由,然后将其名字写为"/"即可,就不再需要home:参数了。应用的初始路由页即是MyHomePage路由。

3、通过路由名进行跳转

要通过路由名称来打开新路由,可以使用NavigatorpushNamed方法。还有pushReplacementNamed等其他管理命名路由的方法,读者可以自行查看API文档。

onPressed: () {
  Navigator.pushNamed(context, "new_page"); // 或者 Navigator.of(context).pushNamed("new_page");

  //Navigator.push(context,
  //  MaterialPageRoute(builder: (context) {
  //  return NewRoute();
  //}));  
},

4、命名路由参数传递和获取

下面展示命名路由如何传递并获取路由参数:

1、我们先注册一个路由:

routes:{
   "new_page":(context) => EchoRoute(),
  } ,

2、在打开路由时传递参数

Navigator.of(context).pushNamed("new_page", arguments: "hi");
或者
Navigator.pushNamed(context, "new_page", arguments: "hi");

3、在路由页通过RouteSetting对象获取路由参数:

class EchoRoute extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    //获取路由参数  
    var args = ModalRoute.of(context).settings.arguments;
    //...省略无关代码
  }
}
适配

如果我们也想将前面《路由传值(非命名路由)》示例中的TipRoute路由页注册到路由表中,以便也可以通过路由名来打开它。但是,由于TipRoute接受一个text 参数,我们如何在不改变TipRoute源码的前提下适配这种情况?其实很简单:

答案:

MaterialApp(
  ... //省略无关代码
  routes: {
   "tip2": (context){
     return TipRoute(text: ModalRoute.of(context).settings.arguments);
   },
 }, 
);

二、总结

建议读者最好统一使用命名路由的管理方式,这将会带来如下好处:
1、语义化更明确。
2、代码更好维护;如果使用匿名路由,则必须在调用Navigator.push的地方创建新路由页,这样不仅需要import新路由页的dart文件,而且这样的代码将会非常分散。
3、可以通过onGenerateRoute做一些全局的路由跳转前置处理逻辑。

另外,还有一些关于路由管理的内容我们没有介绍,比如 MaterialApp 中还有navigatorObserversonUnknownRoute两个回调属性,前者可以监听所有路由跳转动作,后者在打开一个不存在的命名路由时会被调用,由于这些功能并不常用,而且也比较简单,我们便不再花费篇幅来介绍了,读者可以自行查看API文档。

相关文章

  • 路由跳转(非命名路由)

    单纯跳转: 路由传值跳转: 路由传值返回跳转:

  • 路由跳转和传值(命名路由)

    一、命名路由 所谓“命名路由”(Named Route)即有名字的路由,我们可以先给路由起一个名字,然后就可以通过...

  • 八、Flutter路由

    目录一、基本路由二、基本路由传参三、命名路由四、命名路由传参五、替换路由六、返回到根路由 一、基本路由 跳转到De...

  • ionic4-传递参数

    环境 路由传值 方式一(单个值) 路由定义 跳转 或者 接收 方式二(多个值) 跳转 接收 组件间传值 父 -> ...

  • 2018-09-28

    1.vue 路由跳转传值 -------- 最好用vuex,bus不适合在路由跳转中传值,因为需要初始化组件 2....

  • Vue路由

    一、Vue路由基础用法: 二、Vue路由配置的抽出 三、路由动态传值: 四、路由的跳转方式: 五、路由的hash模...

  • flutter页面跳转 Route 使用汇总

    一、push方式直接跳转 普通跳转 带参数跳转和接收参数 构造函数直接传参 跳转后携带参数返回 二、命名路由跳转 ...

  • 2018-11-29 路由

    Flutter有两种跳转方式:静态路由,在创建时就已经明确知道了要跳转的页面和值动态路由,跳转传入的目标地址和要传...

  • flutter下使用命名路由实现页面跳转

    之前使用普通路由实现了页面跳转,和可以带参数跳转,今天使用另一种路由方式:命名路由,将页面与路径做映射,起到命名作...

  • 路由传值(非命名路由)

    一、简介 很多时候,在路由跳转时我们需要带一些参数,比如打开商品详情页时,我们需要带一个商品id,这样商品详情页才...

网友评论

      本文标题:路由跳转和传值(命名路由)

      本文链接:https://www.haomeiwen.com/subject/jshrcrtx.html