Flutter路由导航

路由导航用来管理所有页面的跳转,需要在入口函数中定义跳转名称对应的目标页面,方法如下:

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 route) => false);
2、Navigator.of(context).pushNamedAndRemoveUntil('/login', ModalRoute.withName('/'));
  • 说明:
  • 方法1:关闭所有页面,打开新页面。 (Route route) => false是否要关闭完所有页面再打开目标页面
  • 方法2:/默认是主页,关闭除主页之外的其他页面,再打开目标页面

pushAndRemoveUntil

Navigator.pushAndRemoveUntil(context,MaterialPageRoute(builder: (BuildContext context) => LoginPage()),(Route 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');

你可能感兴趣的:(Flutter路由导航)