Flutter使用CupertinoTabBar时如何避免根页面按安卓返回键直接退出应用
解决方案
你现有代码的问题在于:当当前Tab的导航栈处于根页面时,maybePop()会返回false,此时你返回!false = true,相当于允许系统处理返回事件,就会直接关闭应用。
你可以通过导航状态的canPop()方法直接判断当前是否处于对应Tab的根页面,按需调整返回逻辑即可:
方案1:根页面禁止直接退出应用
直接修改WillPopScope的onWillPop回调代码如下:
onWillPop: () async { final currentNavState = listOfKeys[tabController.index].currentState; // 当前导航栈存在可返回页面,先执行返回操作 if (currentNavState?.canPop() ?? false) { currentNavState?.pop(); // 返回false表示当前返回事件已处理,不会触发系统默认的关闭应用逻辑 return false; } // 已到达当前Tab的根页面,返回false拦截系统返回,不关闭应用 return false; }
方案2:根页面按返回弹出二次确认退出弹窗
如果需要保留退出应用的能力,只是避免误触,可使用如下逻辑:
onWillPop: () async { final currentNavState = listOfKeys[tabController.index].currentState; if (currentNavState?.canPop() ?? false) { currentNavState?.pop(); return false; } // 根页面弹出二次确认 bool? confirmExit = await showDialog( context: context, builder: (context) => AlertDialog( title: const Text("退出提示"), content: const Text("确定要退出应用吗?"), actions: [ TextButton( onPressed: () => Navigator.pop(context, false), child: const Text("取消"), ), TextButton( onPressed: () => Navigator.pop(context, true), child: const Text("确定"), ), ], ), ); // 用户确认退出才返回true,允许系统关闭应用 return confirmExit ?? false; }
原理说明
NavigatorState的canPop()方法会直接返回当前导航栈是否存在可返回的上层页面,返回false即代表当前处于导航栈最底层的根页面,完全符合你的检测需求。你预先为每个Tab配置独立的NavigatorKey的写法是正确的,可以直接通过当前选中的Tab下标拿到对应导航栈的状态做判断。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

