[TOC]
导航控制
MaterialPageRoute
继承自PageRoute类,PageRoute类是一个抽象类,表示占有整个屏幕空间的一个模态路由页面,不同平台,实现与平台页面切换动画风格一致的路由切换动画。
MaterialPageRoute({
WidgetBuilder builder,
RouteSettings settings,
bool maintainState = true,
bool fullscreenDialog = false,
})
-
builder
:WidgetBuilder
类型的回调函数,返回新路由的实例。 -
settings
:包含路由的配置信息,如路由名称、是否初始路由(首页)。 -
maintainState
:默认true,将原有的路由保存在内存中,如果设置false,则在路由没有用的时候释放资源。 -
fullscreenDialog
:默认false,对应不同平台的push风格,如果设置true,在iOS平台是从下到上模态推出一个新的视图。
Navigator
push
推出一个新的视图
- 方法定义
Future push(BuildContext context, Route route)
- 方法使用
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => NewRoute(), fullscreenDialog: false));
pop
推出当前视图
- 方法定义
bool pop(BuildContext context, [ result ])
result
为页面关闭时返回给上一个页面的数据
- 方法使用
Navigator.pop(context, "我是返回值")
pushNamed
根据路由表中注册的名称,来打开新的界面。
- 方法使用
Navigator.pushNamed(context, "new_page");
of-pushNamed
也是通过路由表中注册的路由名称,来打开新的界面,这种写法可以携带参数。
- 方法使用
Navigator.of(context).pushNamed("echo_page", arguments: "push 参数来了!!!");
路由表
路由表是 MaterialApp
维持的一个 map属性。
routes: {
"new_page": (context) => NewRoute(),
"/": (context) => MyHomePage(
title: "首页",
), // 注册路由首页
"echo_page": (context) => EchoRoute(), //注册一个新的路由
"tip_page": (context) {
// 在注册路由表时,携带参数,可以直接通过pushname打开页面
return TipRoute(text: ModalRoute.of(context).settings.arguments);
},
"not_found_page": (context) => NotFoundPage()
},
-
"/": (context)...
:表示注册路由首页,注册之后,可以省略home
属性的设置。 -
"new_page": (context) => NewRoute()
,注册之后,可以通过pushNamed
方法打开页面。 -
"tip_page" (context)...
:在注册的时候可以将上个界面传来的参数透传到下一个界面,而不需要改变当前类的代码。
onGenerateRoute
MaterialApp
维持的一个回调方法,当通过pushname打开页面,没有找到路由表的时候触发。一般可以用来返回登录界面、网络异常等界面。
onGenerateRoute: (RouteSettings settings) {
// ignore: missing_return
return MaterialPageRoute(builder: (context) {
String routeName = settings.name;
print("异常路由: $routeName");
Navigator.pushNamed(context, "not_found_page");
});
},
例如,在执行Navigator.pushNamed(context, "tip_page---");
方法之后会触发这个回调。