Flutter Navigator跳转同页面时如何移除旧实例保持路由栈符合预期?
解决方案
你当前使用pushReplacement未达到预期,大概率是操作了嵌套导航的子Navigator实例,或者该API的行为不符合你的场景需求,可以用以下两种方式实现目标:
方案1:无命名路由快速实现
先弹出当前旧C页面实例,再压入新的C实例,路由栈会自动保持A > B > C结构:
// 先移除当前旧的C实例,路由栈变为A > B Navigator.of(context).pop(); // 压入新的C实例,路由栈变为A > B > C Navigator.of(context).push( MaterialPageRoute( builder: (context) => C(param: myParam), ), );
注:该方式会先后触发pop和push两次页面动画,如果追求更流畅的过渡效果,推荐使用命名路由方案。
方案2:命名路由更优实现(推荐)
首先在MaterialApp中注册C页面的路由规则:
MaterialApp( routes: { // 其他路由注册 '/page_c': (context) => C(), }, );
在C页面执行如下代码即可一步完成替换,仅触发一次过渡动画:
Navigator.of(context).popAndPushNamed( '/page_c', arguments: myParam, // 传递参数 );
如果操作后仍然不符合预期,可以明确指定操作根导航器,避免嵌套路由干扰:
Navigator.of(context, rootNavigator: true).popAndPushNamed( '/page_c', arguments: myParam, );
内容的提问来源于stack exchange,提问作者sosnus
相关产品推荐
相关产品推荐

