什么是Flutter的路由与导航,如何完成不同页面跳转?,如何获取路由跳转的返回值?
要在Flutter中切换屏幕,我们可以访问路由以绘制新的Widget,管理多个屏幕有两个核心概念和类:Route(路由) 和 Navigator(导航)。
Route(路由):
Route是应用程序的“屏幕”或“页面”的抽象(可以认为是Activity,也可以粗略地把一个路由对应到一个 UIViewController)。
Navigator(导航):
Navigator是管理Route的Widget。Navigator可以通过push和poproute以实现页面切换(Navigator的工作原理和 iOS 中 UINavigationController 非常相似,当你想跳转到新页面或者从新页面返回时,它可以 push() 和 pop() 路由。)。
路由根据声明的时机可以分为静态路由和动态路由。
静态路由
静态路由使用时要求我们在MaterialApp中的routes中提前注册路由,可以接收下一页面的返回数据。
//声明
routes: <String, WidgetBuilder>{
'/a': (BuildContext context) => RouteHome(title: 'page A'),
'/b': (BuildContext context) => RouteHome(title: 'page B'),
'/c': (BuildContext context) => RouteHome(title: 'page C'),
},
//使用
Navigator.of(context).pushNamed('/b');
比如从A页面打开B页面
一级页面代码:
RaisedButton(
child: Text('Route'),
onPressed: () {
Navigator.of(context)
.pushNamed('/b');
},
二级页面代码:
floatingActionButton: new FloatingActionButton(
onPressed: () {
Navigator.of(context).pop("StaticNavPage 返回值");
},
child: new Text("返回"),
)
动态路由
动态路由不需要提前注册 ,但是需要,Navigator.push的时候传递一个MaterialPageRoute 对象。 可以向下一个页面传递参数,同样也可以接收新页面回传回来的数据。
一级页面代码:
RaisedButton(
child: Text('动态路由传参'),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => DynamicNavPage(
username: 'zhangsan',
password: '121'
))).then((onValue) {//then 接收回传的数据
showDialog(
context: context,
child: new AlertDialog(
content: new Text(onValue),
));
});
},
),
二级页面代码:
new MaterialButton(
onPressed: () {
Navigator.pop(context, " 回传的数据 aaa");
},
child: new Text("点我返回"),
color: Colors.lightGreen,
),
完整的代码在这里,我学习Flutter过程中的一个Demo,会持续更新Demo的内容,对Flutter 有兴趣的朋友可以一起学习。
https://github.com/CodingForAndroid/flutter_new