为什么pushAndRemoveUntil无法移除同路径的原有路由?
原因分析
Navigator.pushAndRemoveUntil的执行逻辑是:从当前路由栈的栈顶开始逐一向外弹出旧路由,直到传入的路由判断函数返回true时停止弹出,最后再将新路由压入剩下的路由栈顶部。
你当前的代码使用ModalRoute.withName('/')作为终止判断条件,而你的应用初始首路由AllMessagesView本身就绑定了/的路由名称,所以完整执行流程如下:
- 调用
Navigator.of(context).pop()关闭侧边抽屉后,当前路由栈结构为[初始AllMessagesView(路由名称为/)] - 执行
pushAndRemoveUntil时,栈顶的初始AllMessagesView匹配到/的路由名,判断函数返回true,停止弹出旧路由 - 新的
AllMessagesView被压入栈顶,最终路由栈结构为[初始AllMessagesView(/), 新AllMessagesView]
此时按安卓返回键,会先弹出栈顶的新AllMessagesView回到初始的同页面,第二次按返回才会弹出初始路由退出应用,这就是你看到重复页面的原因。
修复方案
如果你需要清空所有旧路由,只保留新跳转的路由,直接把终止判断条件改为永远返回false即可:
Navigator.of(context).pop(); // 关闭侧边抽屉 Navigator.pushAndRemoveUntil( context, MaterialPageRoute(builder: (context) => AllMessagesView()), (route) => false, // 所有旧路由都需要弹出,无终止例外 );
如果你只是要替换当前栈顶的路由,不需要修改整个栈结构,也可以直接用pushReplacement方法:
Navigator.of(context).pop(); Navigator.pushReplacement( context, MaterialPageRoute(builder: (context) => AllMessagesView()), );
内容的提问来源于stack exchange,提问作者rozerro
相关产品推荐
相关产品推荐

