Flutter--Route和Navigator(二)

Navigator的各种跳转方式
我们已经知道如何简单在路由栈中 push、pop 实例,然而,当遇到一些特殊的情况,这显然不能满足需求。学习 Android 的同学知道 Activity 的各种启动模式可以完成相应需求,Flutter 当然也有类似的可以解决各种业务需求的实现方式

方法 说明
Navigator.pop() 销毁当前页面
Navigator.popAndPushNamed() 销毁当前页面,并跳转到指定页面
1--push-->2--popAndPushNamed-->3
栈内有1,3
Navigator.popUntil() 直接回退到指定页面并销毁其余页面
1--push-->2--push-->3--push-->4
4点击按钮调用Navigator.popUntil(context, ModalRoute.withName("/page1")),会销毁页面4,3,2,跳转到页面1
栈内只有1
Navigator.push() 跳转到指定页面
1--push--2
1跳转到2,1不会销毁
栈内有1,2
Navigator.pushNamed() 命名路由跳转到指定页面
1--pushNamed--2
1跳转到2,1不会销毁
栈内有1,2
Navigator.pushReplacement() 新的页面替换当前页面
1--push-->2--push-->3--pushReplacement-->4
栈内有1,2,4
Navigator.pushReplacementNamed() 新的页面替换当前页面
1--push-->2--push-->3--pushReplacementNamed-->4
栈内有1,2,4
Navigator.pushNamedAndRemoveUntil() 跳转到新的页面,并且删除新页面和底部页面之间所有页面
1--push-->2--push-->3--pushNamedAndRemoveUntil-->4
Navigator.pushNamedAndRemoveUntil(context, "/page4", ModalRoute.withName("/page1"));
栈内有1,4
Navigator.pushAndRemoveUntil() 跳转到新的页面,并且删除新页面和底部页面之间所有页面
1--push-->2--push-->3--pushAndRemoveUntil-->4
Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (context) => MyPage4()), ModalRoute.withName('/page1'));
栈内有1,4
Navigator.removeRoute() 从Navigator中删除路由,同时执行Route.dispose释放Route自身资源,路由的生命周期结束
Navigator.removeRouteBelow() 从Navigator中删除路由,同时执行Route.dispose操作,要替换的路由是传入参数anchorRouter里面的路由
Navigator.replace() Navigator中的路由替换成一个新路由
Navigator.replaceRouteBelow() 将Navigator中的路由替换成一个新路由,要替换的路由是是传入参数anchorRouter里面的路由
Navigator.canPop() 判断当前页面能否被弹出栈,栈内只有一个页面时为false,别的时候为true
Navigator.maybePop() 为canPop()的升级版,当前页面能在栈内能被弹出时就弹出栈,如果不能弹出则什么都不做
1--push-->2(maybePop),当前栈内只有1
1(maybePop),当前栈内只有1

注意:

1、Navigator.popUntil(context, ModalRoute.withName("/page1"))调用黑屏的问题,就算配置了路由也是黑屏

final routes = {
  "/":(content,{arguments})=>RouteStudy(),
  '/page1': (content) => MyPage1(),
  '/page2': (content) => MyPage2(),
  '/page3': (content) => MyPage3(),
  '/page4': (content) => MyPage4()
};

解决方案:在添加1页面的时候添加一下代码

 Navigator.push(
      context,
      MaterialPageRoute(
        settings: RouteSettings(name:"/page1"),
        builder: (context) => MyPage1(),
      ),
    );

再调用

Navigator.popUntil(context, ModalRoute.withName("/page1"))

2、Navigator.pushAndRemoveUntil()和Navigator.pushNamedAndRemoveUntil(),调用缺少底线页面
例如:1-->2-->3-->4(页面跳转顺序)

页面3调用Navigator.pushNamedAndRemoveUntil

Navigator.pushNamedAndRemoveUntil(
                context, "/page4", ModalRoute.withName("/page1"));


或页面3调用Navigator.pushAndRemoveUntil

Navigator.pushAndRemoveUntil(
                  context, MaterialPageRoute(builder: (context) => MyPage4()),
                  ModalRoute.withName('/page1'));


page1如果未配置settings,那么栈内只有新添加的页面,没有别的页面,即只有page4

 Navigator.push(
      context,
      MaterialPageRoute(
        settings: RouteSettings(name:"/page1"),
        builder: (context) => MyPage1(),
      ),
    );

你可能感兴趣的:(Flutter--Route和Navigator(二))