Flutter中CupertinoTabScaffold分tab独立导航如何避免重复推送相同路由
问题根因
你之前的写法不生效的核心原因是:pushNamedAndRemoveUntil 的路由过滤参数仅用于控制新路由入栈后需要保留哪些旧路由,无论过滤条件怎么写,这个方法都会先将新的目标路由压入栈中,所以就算当前已经处于根路由,还是会重复推入根路由实例。
正确实现方案
推荐优先用popUntil实现回到根路由的逻辑,不需要创建新的路由实例,性能更好,同时可以避免重复推送的问题:
// 点击对应Tab时执行的逻辑 final navigatorState = yourTabNavKey.currentState; if (navigatorState == null) return; // 已经在根路由时,canPop返回false,直接跳过操作 if (navigatorState.canPop()) { // 弹出所有路由直到栈底根路由 navigatorState.popUntil((route) => route.isFirst); }
如果你的根路由有自定义命名、或者存在栈底路由不是根路由的特殊场景,可以加一层路由名校验:
final navigatorState = yourTabNavKey.currentState; if (navigatorState == null) return; bool isAtRoot = false; // 遍历路由栈判断当前是否已在根路由 navigatorState.popUntil((route) { if (route.isFirst && route.settings.name == '/') { isAtRoot = true; } // 返回true表示不执行实际pop操作,仅遍历路由栈 return true; }); if (!isAtRoot) { // 不在根路由时才执行回到根的操作 navigatorState.popUntil((route) => route.isFirst && route.settings.name == '/'); }
注意事项
- 你当前每个TabPage用独立
MaterialApp的实现需要保证每个navigatorKey全局唯一 - 如果你自定义了根路由的命名,需要把代码中的
/替换为你实际的根路由名称
内容的提问来源于stack exchange,提问作者FetFrumos
相关产品推荐
相关产品推荐

