【Flutter之旅】路由管理
环境介绍以及参考文献
本示例是在 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之旅】路由管理相关推荐
- Flutter系列-flutter路由管理
Flutter路由管理 初识路由概念 一.路由管理 1.1.Route 1.2.MaterialPageRoute 1.3.Navigator 1.4.路由传值 1.5 命名路由 1.6.命名路由参数 ...
- Flutter路由管理代码这么长长长长长,阿里工程师怎么高效解决?(实用)
背景: 在flutter的业务开发过程中,flutter侧会逐渐丰富自己的路由管理.一个轻量的路由管理本质上是页面标识(或页面路径)与页面实例的映射.本文基于dart注解提供了一个轻量路由管理方案. ...
- Flutter 全能型选手GetX —— 路由管理
使用篇 简介 依赖管理 路由管理 状态管理 主题配置 多语言配置 离线缓存 网络请求 原理篇 从源码看Getx的依赖原理 一.Getx 路由基本使用 1.普通路由 Get.to(SecondP ...
- flutter之路由管理
路由管理 路由(Route)在移动开发中通常指页面(Page),这跟web开发中单页应用的Route概念意义是相同的,Route在Android中通常指一个Activity,在iOS中指一个ViewC ...
- Flutter路由管理和页面参数的传递(获取返回)
前言 在做 Flutter 开发的时候所有的页面以及页面上的元素都变成了 Widget ,创建一个页面或者视图直接 new 一个新的 widget 就可以,相关的参数我们可以直接通过构造函数直接传递. ...
- flutter中的路由表和路由管理
查看更多flutter资料 MaterialPageRoute MaterialPageRoute继承自PageRoute类,PageRoute类是一个抽象类,表示占有整个屏幕空间的一个模态路由页面, ...
- Flutter路由管理和接收页面的返回值
Flutter使用Navigator进行路由管理. 跳转页面 使用Navigator的push方法进行跳转.可以看到总共有6个push方法 1.push(route) 通过路由跳转 通过路由进行跳转 ...
- Bolt 的 Flutter 路由管理实践(页面解耦,流程控制、功能拓展等)
在各大移动开发框架(Android.iOS.Flutter.React Native-)中,路由管理始终是 UI 架构最具热议的话题之一. 一大原因就是应用程序的页面会 不可避免的多,我们可以使用 B ...
- Flutter路由管理和页面参数的传递(源码分析)
前言 上一篇 Flutter路由管理和页面参数的传递(获取&返回) 文章中我们讲述了这么用代码实现 Flutter 中页面参数的传递,这一篇我们用源码分析一下 Navigator 为什么可以进 ...
- Flutter开发之路由跳转与传参(七)
参考练习:https://book.flutterchina.club/chapter2/flutter_router.html 路由(Route)在移动开发中通常指页面(Page),这跟web开发中 ...
最新文章
- 重装IDEA再也不愁了,一招搞定同步个人配置!
- 10进制转换成16进制
- 微信小微商户获取申请状态
- N - 畅通工程再续 - hdu 1875
- Android—EventBus使用与源码分析
- mellanox 网卡驱动_收购Mellanox之后 NVIDIA发布全球首款25G安全智能网卡
- 查看硬件配置的Linux命令,LINUX 查看硬件配置命令的教程
- jquer案例2:改变元素的样式、复选框、下拉框 省份的选择
- js-权威指南学习笔记4
- 玩客云安装mysql_玩客云的使用经验总结
- 如何使用docker容器中的redis
- U3D -- 一些知识点和优秀博客收藏
- 使用Floyd-Warshall算法求出两点之间的最短路径
- python子列表_关于python:创建子列表
- 分词工具与方法:jieba、spaCy等
- 【厚积薄发系列】读书笔记4—《伙伴教练:转化团队高效能的关键力量》小记
- Discuz!教程之论坛编辑器默认勾选HTML代码的修改方法
- 悬垂指针(Dangling pointer)和野指针(Wild pointer)
- node.js安装及环境配置
- EasyExcel大批量数据导出OOM,个人案例和解决办法
热门文章
- iOS UINavigationController导航条背景透明
- 日语语音识别_日语语音识别软件_日语语音识别在线 - 云+社区 - 腾讯云
- 基于btest.so的策略测试方案
- linux4 系统下载,syslinux下载|
- 322. Coin Change
- 捷太格特PC10G与三菱MR-J4的SSCNETⅢ通讯
- java nio wakeup_Java NIO的wakeup剖析
- GY-BMP280-3.3 高精度大气压强传感器模块
- treeset可以重复吗_社保和商业医疗险可以重复报销吗?报销攻略请收好
- selenium:表单frame切换和句柄窗口切换