路由导航用来管理所有页面的跳转,需要在入口函数中定义跳转名称对应的目标页面,方法如下:
class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: _MyHomePage(), routes: { '/login': (BuildContext context) => LoginPage(), '/user': (BuildContext context) => UserPage(), }, ); } }
一、push打开新页面
pushNamed
Navigator.of(context).pushNamed('/login');
- 说明:每次打开新的页面都会在栈顶重新创建,并且旧页面不会关闭
pushReplacementNamed
Navigator.of(context).pushReplacementNamed('/login');
- 说明:把当前页栈中的位置替换成目标页面
pushReplacement
Navigator.of(context).pushReplacement(context,new LoginPage());
- 说明:和pushReplacementNamed方法类似,不同点在于此方法可以直接new要跳转的页面,而pushReplacementNamed方法需要在routes中定义要跳转的目标页面名称
popAndPushNamed
Navigator.popAndPushNamed(context, '/login');
-说明:关闭当前页,打开目标页面
pushNamedAndRemoveUntil
1、Navigator.of(context).pushNamedAndRemoveUntil('/login', (Route<dynamic> route) => false);
2、Navigator.of(context).pushNamedAndRemoveUntil('/login', ModalRoute.withName('/'));
- 说明:
- 方法1:关闭所有页面,打开新页面。 (Route<dynamic> route) => false是否要关闭完所有页面再打开目标页面
- 方法2:/默认是主页,关闭除主页之外的其他页面,再打开目标页面
pushAndRemoveUntil
Navigator.pushAndRemoveUntil(context,MaterialPageRoute(builder: (BuildContext context) => LoginPage()),(Route<dynamic> route) => false,);
- 说明:和pushNamedAndRemoveUntil方法类似,该方法不需要在入口routes中定义路由映射,直接通过new打开
popUntil
Navigator.popUntil(context, ModalRoute.withName('/login'));
- 说明:有些应用场景下,用户可能不得不填写一个由三部分组成的长表单,该表单可能在移动应用程序的三个连续屏幕中显示。现在在表单的第三个页面,用户决定取消填写表单。用户单击Cancel,就会弹出所有之前的与表单相关的屏幕,并将用户带回主屏幕,从而丢失所有与表单相关的数据(在这种情况下,这是我们想要的)。我们不会在这里推出任何新东西,只是回到以前的路线。。
二、pop
maybePop
Navigator.of(context).maybePop();
-说明:会自动进行判断,如果当前页面pop后,会显示其他页面,不会出现问题,则将执行当前页面的pop操作 否则将不执行
canPop
bool canPop=Navigator.of(context).canPop();
-说明:判断当前页面能否进行pop操作,并返回bool值
pop
Navigator.of(context).pop();
-说明:直接pop当前页面
传递参数
MaterialPageRoute传参
String params;
Navigator.push(context, new MaterialPageRoute(builder: (BuildContext context) => new mainPage(params)));
//接收参数
class mainPage extends StatelessWidget {
final String userName;
mainPage(this.userName);
@override
Widget build(BuildContext context) {
print(userName);
}
带返回值的页面跳转
String userName = "hhh";
Navigator.push(
context,
new MaterialPageRoute(
builder: (BuildContext context) =>
new LoginPage(userName))).then((data){
result =data;
print(result);
});
//在LoginPage页面使用 Navigator.of(context).pop('params');
网友评论