MaterialPageRoute:
MaterialPageRoute({
WidgetBuilder builder, //回调函数,返回值是一个widget,通过这个返回新路由
RouteSettings settings, //路由配置信息,包含路由名称,是否初始路由
bool maintainState = true, //默认true保存在内存中,false为用的时候释放资源
bool fullscreenDialog = false, //true为底部滑出,false类似ios中push
})
Navigator:
Future push(BuildContext context, Route route)和
bool pop(BuildContext context, [ result ])
将栈顶路由出栈,result为页面关闭时返回给上一个页面的数据
//注册路由表
routes:{
"new_page":(context) => NewRoute(),
"/":(context) => MyHomePage(title: 'Flutter Demo Home Page'), //注册首页路由
}
通过路由名打开新路由页:
onPressed: () {
Navigator.pushNamed(context, "new_page");
//Navigator.push(context,
// MaterialPageRoute(builder: (context) {
// return NewRoute();
//}));
},
命名路由参数传递:
先注册一个路由:
routes:{
"new_page":(context) => EchoRoute(),
} ,
在路由页通过RouteSetting对象获取路由参数:
class EchoRoute extends StatelessWidget {
@override
Widget build(BuildContext context) {
//获取路由参数
var args=ModalRoute.of(context).settings.arguments;
//...省略无关代码
}
}
在打开路由时传递参数:
Navigator.of(context).pushNamed("new_page", arguments: "hi");
全局的路由跳转前置处理逻辑:
MaterialApp有一个onGenerateRoute属性用来判断登录状态,实现权限控制。
MaterialApp(
... //省略无关代码
onGenerateRoute:(RouteSettings settings){
return MaterialPageRoute(builder: (context){
String routeName = settings.name;
// 如果访问的路由页需要登录,但当前未登录,则直接返回登录页路由,
// 引导用户登录;其它情况则正常打开路由。
}
);
}
);注意,onGenerateRoute只会对命名路由生效。