路由跳转在flutter中是一个非常重要的概念 。我们在开发中不可避免的需要涉及到页面之间的交互,传参,出参等操作 。
这就引出了我们的路由,在flutter中,有两种实现路由的方式,分别是 基本路由和router命名路由。
本节针对路由做一次系统的梳理和记录
1. navigator 基本路由
使用很简单的,
首先新建一个页面 widget 例如
class TextDemo extends StatefulWidget {
······
······
}
假如说我们的页面中有一个按钮被触发的时候,我们通过如下代码即可 跳转至 TextDemo页面
1 2
| Navigator.push( context, new MaterialPageRoute(builder: (context) => TextDemo()));
|
2. route 命名路由
1. 首先新建routes列表,我们已经创建了 HomeTabs,和SearchTabs两个页面
1 2 3 4
| var routes = { '/home':(context,{arguments}) => HomeTabs(arguments:arguments),= '/search':(context) => SearchTabs(),= };
|
2. MaterialApp 通过重写 routes属性,进行route注册
1 2 3 4 5
| MaterialApp( title: 'Flutter Demo', home: MyHomePage(title: 'Flutter Demo Home Page'), routes: routes, )
|
3. 最后就是在触发的时候进行跳转.一行代码搞定
1
| Navigator.pushNamed(context, "/home");
|
3. 替换路由
在当前页面加载目标页面,用目标页面替换当前
1
| Navigator.pushReplacementNamed(context, "/home"
|
4. 返回根路由
在 A widget打开多个页面以后,返回 A
1. 参考替换路由
2.
1 2 3 4 5
| Navigator.pop(context,"result from route"), Navigator.of(context).pushAndRemoveUntil( MaterialPageRoute( builder: (context) => MyApp(), ), (routes) => routes == null)
|
5. router 传参
route传参的做法和上一步基本类似
1. 首先定义route列表,参考上一步做法
2. MaterialApp 通过重写 onGenerateRoute,进行route接管。 基本是固定写法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| MaterialApp( onGenerateRoute: (RouteSettings settings) { final String name = settings.name; final Function pageBuilder = this.routes[name]; if (pageBuilder != null) { if (settings.arguments != null) { final Route route = MaterialPageRoute( builder: (context) => pageBuilder(context,arguments: settings.arguments), ); return route; } else { final Route route = MaterialPageRoute( builder: (context) => pageBuilder(context), ); return route; } } return null; },
|
3. 最后就是在触发的时候进行跳转
1 2 3
| Navigator.pushNamed(context, "/home",arguments: { "id" : "11sasdfasdfasdfadfafdafasdfadfafdasdfafa", })
|
4. 在目标页面接收传入的参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| class HomeTabs extends StatefulWidget {
final arguments;
HomeTabs({this.arguments});
@override State<StatefulWidget> createState() { // TODO: implement createState return HomTabsState(); } }
class HomTabsState extends State<HomeTabs> {
@override Widget build(BuildContext context) {
var argu = widget.arguments;
var va = "";
if (argu != null) { va = argu["id"]; }
return Text("home = $va " ); }
}
|
6. 接收返回值
1. 开启一个新的页面(widget),当目标页面被关闭,我们需要接收返回值的时候,
1 2 3 4 5
| void toRouteDemo(BuildContext context) async { final result = await Navigator.push(context,MaterialPageRoute(builder:(context) => RouteDemo() ));
Fluttertoast.showToast(msg: result); }
|
2. 目标页面关闭,并返回值
1
| Navigator.pop(context,"result from route"),
|
代码
https://github.com/kongxs/flutter_demp
参考:
https://api.flutter.dev/flutter/widgets/Navigator-class.html