环境介绍以及参考文献

本示例是在 Linux 16.04.1-Ubuntu 搭配 VS Code 使用。

《Flutter实战》电子书
Flutter中文网

简单示例

在上一个示例中添加代码如下:

简单的路由切换

新建一个新路由

class NewRoute extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("New route"),),body: Center(child: Text("This is new route"),),);}
}

添加点击跳转事件,在 children: <Widget>[ 内部添加

children: <Widget>[// ... 两个 Text 组件// 添加按钮TextButton(child: Text("open new route"),style: TextButton.styleFrom(backgroundColor: Colors.blue, primary: Colors.white),onPressed: () {// Navigator 是一个路由管理的组件,它提供了打开和退出路由页方法。Navigator 通过一个栈来管理活动路由集合// Future push(BuildContext context, Route route) // 将给定的路由入栈(即打开新的页面),返回值是一个Future对象,用以接收新路由出栈(即关闭)时的返回数据。// bool pop(BuildContext context, [ result ])// 将栈顶路由出栈,result为页面关闭时返回给上一个页面的数据。// Navigator.push(BuildContext context, Route route) 等价于 Navigator.of(context).push(Route route)// MaterialPageRoute 是 Material 组件库提供的组件,它可以针对不同平台,实现与平台页面切换动画风格一致的路由切换动画。// Android,打开时从底部滑到顶部,关闭时从顶部滑到底部// IOS,打开从右侧滑到左侧,关闭时则相反Navigator.push(context, MaterialPageRoute(builder: (context) {return NewRoute();}));},),
],

带有参数的路由切换

新建一个 TipRoute 路由,接受一个文本参数,并且返回上一个路由时带上一个返回参数

class TipRoute extends StatelessWidget {TipRoute({Key? key,required this.text,}) : super(key: key);final String text;@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("Tips"),),body: Padding(padding: EdgeInsets.all(18),child: Center(child: Column(children: <Widget>[Text(text),ElevatedButton(onPressed: () => Navigator.of(context).pop(Text("return data")),child: Text("back"),)],),),),);}
}

添加点击跳转事件

children: <Widget>[//...    ElevatedButton(onPressed: () async {// 打开`TipRoute`,并等待返回结果var result = await Navigator.of(context).push(MaterialPageRoute(builder: (context) {return TipRoute(text: "set the value to tips route",);},),);print("return value: $result");},child: Text("open TipsRoute"),),
],

命名路由

通过给路由起一个名字,然后就可以通过路由的名字直接打开新的路由。

路由表的定义其实就是一个 map,key 为路由的名字,类型为字符串,value 是个 builder 回调函数,用来生成相应的路由 widget。

Map<String, WidgetBuilder> routes;

注册路由表

MaterialApp(title: 'Flutter Demo',initialRoute:"/", //名为"/"的路由作为应用的home(首页)theme: ThemeData(primarySwatch: Colors.blue,),// 注册路由表routes:{"new_page":(context) => NewRoute(),"/":(context) => MyHomePage(title: 'Flutter Demo Home Page'), //注册首页路由}
);

通过路由名打开新路由

Navigator.pushNamed(context, "new_page");

命名路由参数传递

有两种方法可以实现:

需要注意的是,在测试的时候 ModalRoute.of(context).settings.arguments; 这样写已经会报编译错误了显示为 The property 'settings' can't be unconditionally accessed because the receiver can be 'null'.,所以需要修改写法如下:

var args = ModalRoute.of(context)?.settings.arguments;

方法一:在路由的 build 方法获取参数

// 注册路由
routes:{
"tip1":(context) => EchoRoute(),
}
// 在 build 函数获取参数
class EchoRoute extends StatelessWidget {@overrideWidget build(BuildContext context) {var args = ModalRoute.of(context)?.settings.arguments;return Scaffold(appBar: AppBar(title: Text("New route"),),body: Center(child: Text("This is EchoRoute, received: $args"),),);}
}
// 通过名字启动带参数的路由
Navigator.of(context).pushNamed("tip1", arguments: "hi");

方法二:在路由的构造函数中获取参数

需要注意的事情是 text: ModalRoute.of(context)?.settings.arguments会报错The argument type 'Object?' can't be assigned to the parameter type 'String',需要修改如下:

text: ModalRoute.of(context)?.settings.arguments as String
// 注册路由
routes: {
"tip2": (context){return TipRoute(text: ModalRoute.of(context)?.settings.arguments as String);
},
// 在构造函数中获取参数
class TipRoute extends StatelessWidget {TipRoute({Key? key,required this.text,}) : super(key: key);final String text;
}
// 通过名字启动带参数的路由
Navigator.of(context).pushNamed("tip2", arguments: "hi");

路由生成钩子

onGenerateRoute,它在打开命名路由时可能会被调用,之所以说可能,是因为当调用 Navigator.pushNamed(…) 打开命名路由时,如果指定的路由名在路由表中已注册,则会调用路由表中的 builder 函数来生成路由组件;如果路由表中没有注册,才会调用 onGenerateRoute 来生成路由。

MaterialApp(// ... 省略无关代码onGenerateRoute: (RouteSettings settings) {String routeName = settings.name as String;print("Open page: $routeName");switch (routeName) {case "/":return MaterialPageRoute(builder: (context) {return MyHomePage(title: 'Flutter Demo Home Page');});case "new_page":return MaterialPageRoute(builder: (context) {return NewRoute();});case "tip1":case "tip2":return MaterialPageRoute(builder: (context) {return TipRoute(text: settings.arguments as String);});default:return MaterialPageRoute(builder: (BuildContext context) {return Scaffold(body: Center(child: Text("Page not found"),));});}}
);

【Flutter之旅】路由管理相关推荐

  1. Flutter系列-flutter路由管理

    Flutter路由管理 初识路由概念 一.路由管理 1.1.Route 1.2.MaterialPageRoute 1.3.Navigator 1.4.路由传值 1.5 命名路由 1.6.命名路由参数 ...

  2. Flutter路由管理代码这么长长长长长,阿里工程师怎么高效解决?(实用)

    背景: 在flutter的业务开发过程中,flutter侧会逐渐丰富自己的路由管理.一个轻量的路由管理本质上是页面标识(或页面路径)与页面实例的映射.本文基于dart注解提供了一个轻量路由管理方案.  ...

  3. Flutter 全能型选手GetX —— 路由管理

    使用篇   简介 依赖管理 路由管理 状态管理 主题配置 多语言配置 离线缓存 网络请求  原理篇 从源码看Getx的依赖原理  一.Getx 路由基本使用 1.普通路由 Get.to(SecondP ...

  4. flutter之路由管理

    路由管理 路由(Route)在移动开发中通常指页面(Page),这跟web开发中单页应用的Route概念意义是相同的,Route在Android中通常指一个Activity,在iOS中指一个ViewC ...

  5. Flutter路由管理和页面参数的传递(获取返回)

    前言 在做 Flutter 开发的时候所有的页面以及页面上的元素都变成了 Widget ,创建一个页面或者视图直接 new 一个新的 widget 就可以,相关的参数我们可以直接通过构造函数直接传递. ...

  6. flutter中的路由表和路由管理

    查看更多flutter资料 MaterialPageRoute MaterialPageRoute继承自PageRoute类,PageRoute类是一个抽象类,表示占有整个屏幕空间的一个模态路由页面, ...

  7. Flutter路由管理和接收页面的返回值

    Flutter使用Navigator进行路由管理. 跳转页面 使用Navigator的push方法进行跳转.可以看到总共有6个push方法 1.push(route) 通过路由跳转 通过路由进行跳转 ...

  8. Bolt 的 Flutter 路由管理实践(页面解耦,流程控制、功能拓展等)

    在各大移动开发框架(Android.iOS.Flutter.React Native-)中,路由管理始终是 UI 架构最具热议的话题之一. 一大原因就是应用程序的页面会 不可避免的多,我们可以使用 B ...

  9. Flutter路由管理和页面参数的传递(源码分析)

    前言 上一篇 Flutter路由管理和页面参数的传递(获取&返回) 文章中我们讲述了这么用代码实现 Flutter 中页面参数的传递,这一篇我们用源码分析一下 Navigator 为什么可以进 ...

  10. Flutter开发之路由跳转与传参(七)

    参考练习:https://book.flutterchina.club/chapter2/flutter_router.html 路由(Route)在移动开发中通常指页面(Page),这跟web开发中 ...

最新文章

  1. 重装IDEA再也不愁了,一招搞定同步个人配置!
  2. 10进制转换成16进制
  3. 微信小微商户获取申请状态
  4. N - 畅通工程再续 - hdu 1875
  5. Android—EventBus使用与源码分析
  6. mellanox 网卡驱动_收购Mellanox之后 NVIDIA发布全球首款25G安全智能网卡
  7. 查看硬件配置的Linux命令,LINUX 查看硬件配置命令的教程
  8. jquer案例2:改变元素的样式、复选框、下拉框 省份的选择
  9. js-权威指南学习笔记4
  10. 玩客云安装mysql_玩客云的使用经验总结
  11. 如何使用docker容器中的redis
  12. U3D -- 一些知识点和优秀博客收藏
  13. 使用Floyd-Warshall算法求出两点之间的最短路径
  14. python子列表_关于python:创建子列表
  15. 分词工具与方法:jieba、spaCy等
  16. 【厚积薄发系列】读书笔记4—《伙伴教练:转化团队高效能的关键力量》小记
  17. Discuz!教程之论坛编辑器默认勾选HTML代码的修改方法
  18. 悬垂指针(Dangling pointer)和野指针(Wild pointer)
  19. node.js安装及环境配置
  20. EasyExcel大批量数据导出OOM,个人案例和解决办法

热门文章

  1. iOS UINavigationController导航条背景透明
  2. 日语语音识别_日语语音识别软件_日语语音识别在线 - 云+社区 - 腾讯云
  3. 基于btest.so的策略测试方案
  4. linux4 系统下载,syslinux下载|
  5. 322. Coin Change
  6. 捷太格特PC10G与三菱MR-J4的SSCNETⅢ通讯
  7. java nio wakeup_Java NIO的wakeup剖析
  8. GY-BMP280-3.3 高精度大气压强传感器模块
  9. treeset可以重复吗_社保和商业医疗险可以重复报销吗?报销攻略请收好
  10. selenium:表单frame切换和句柄窗口切换