Flutter使用persistent_bottom_nav_bar包时如何返回上一屏幕
这个包默认给每个底部tab维护独立的导航栈,直接用全局Navigator操作会出现返回逻辑异常,对应场景的实现方法如下:
1. 常规tab内页面返回
直接用包提供的静态pop方法操作当前tab的独立导航栈,不会隐藏底部导航栏,也不会切换tab,和普通页面返回逻辑完全一致:
// 无参数返回上一页 PersistentNavBarNavigator.pop(context); // 携带返回参数给上一页 PersistentNavBarNavigator.pop(context, yourReturnValue);
2. 适配安卓物理返回键/全局返回手势
直接用根导航的pop会直接退出整个底部导航容器,需要先判断当前tab导航栈是否可返回,适配代码如下:
@override Widget build(BuildContext context) { return WillPopScope( onWillPop: () async { final tabNavState = PersistentNavBarNavigator.of(context)?.navigatorState; // 当前tab栈内存在可返回页面时,优先返回栈内页 if (tabNavState != null && await tabNavState.maybePop()) { return false; } // 已经到tab根页面时,响应系统返回退出应用/上一级容器 return true; }, child: Scaffold( // 你的PersistentTabView相关配置 ) ); }
常见踩坑说明
- 禁止直接调用
Navigator.of(context).pop():该方法拿到的是App根导航栈,调用后会直接销毁整个底部导航容器,跳转到挂载底部栏之前的页面,不符合tab内返回的预期。 - 如果你调用
pushNewScreen跳转页面时设置了withNavBar: false(即新页面隐藏底部导航栏),上述pop方法依然生效,会正常回到带底部栏的tab页面。 - 如果需要操作非当前选中tab的导航栈返回,先通过
PersistentTabController获取对应tab的上下文,再调用上述pop方法即可。
内容的提问来源于stack exchange,提问作者Abdelrahman Tareq
相关产品推荐
相关产品推荐

