Flutter中Navigator导航函数的最佳用法及回退异常问题咨询
问题分析
你用的pushReplacement只会替换当前栈顶的路由,原来的初始页面仍然留在导航栈里,所以点击返回键会回到它。
解决方案
要实现跳转后无法返回初始页面,得把导航栈里之前的所有路由都清掉,推荐用这两种方式:
方式一:用pushAndRemoveUntil
这个方法会把新页面推入栈,同时移除所有之前的路由,直接彻底切断返回初始页的路径:
Navigator.of(context).pushAndRemoveUntil( MaterialPageRoute(builder: (c) => widget.user ? Dashboard() : Login()), (Route<dynamic> route) => false, // 清除栈内所有旧路由 );
如果你的初始页面是路由栈的根路由(比如命名为/),也可以指定只保留根路由(根据需求选):
Navigator.of(context).pushAndRemoveUntil( MaterialPageRoute(builder: (c) => widget.user ? Dashboard() : Login()), ModalRoute.withName('/'), );
方式二:用命名路由(更规范)
如果你的项目已经配置了命名路由,用pushNamedAndRemoveUntil会更清晰:
先在MaterialApp里配置路由表:
MaterialApp( initialRoute: '/initial', // 你的初始页面路由 routes: { '/dashboard': (context) => Dashboard(), '/login': (context) => Login(), }, );
跳转时就这么写:
final targetRoute = widget.user ? '/dashboard' : '/login'; Navigator.of(context).pushNamedAndRemoveUntil( targetRoute, (route) => false, );
补充提醒
pushReplacement只适合替换当前页面的场景(比如登录成功替换登录页,但如果之前还有启动页,返回还是会回到启动页),清除路由栈的操作要在确定用户不需要再回到之前页面时用,比如登录后进入主页、启动页跳转到首页这类场景。
内容的提问来源于stack exchange,提问作者kapil tk
相关产品推荐
相关产品推荐

