Flutter中使用WillPopScope后返回按钮仍可关闭弹窗问题
问题原因
你当前的实现错误点非常明确:
- 你包裹在
Scaffold外层的WillPopScope,仅能拦截绑定在当前页面路由上的系统返回事件。而showDialog弹出的对话框属于独立压入路由栈的模态路由,和外层页面是两个独立的路由节点,外层的返回拦截逻辑根本不会作用到弹窗路由上。 - 你设置的
barrierDismissible: false仅能禁止用户点击弹窗外部的半透明遮罩关闭弹窗,对系统实体/虚拟返回键的事件没有拦截效果。
修复方法
只需要给弹窗组件单独包裹WillPopScope,拦截弹窗路由自身的返回事件即可,修改你的_showAlertDialog方法中弹窗构建部分的代码:
// showDialog 部分修改为如下实现 showDialog( barrierDismissible: false, context: context, builder: (BuildContext context) { // 给弹窗单独加返回拦截 return WillPopScope( onWillPop: () async => false, child: alert, ); }, );
补充说明
- 上述修改完成后,弹窗展示时点击系统返回键将不会关闭弹窗,你可以在弹窗的按钮点击事件中通过
Navigator.pop(context)主动控制弹窗关闭,该调用不受拦截逻辑影响。 - 如果你原本包裹在
Scaffold外层的WillPopScope是为了实现「弹窗显示时整个页面都不能按返回退出」,可以保留原有逻辑;如果需要弹窗关闭后允许用户按返回键退出当前页面,建议新增一个布尔类型的状态位标记弹窗是否处于展示状态,外层WillPopScope的返回值根据这个状态位动态判断即可。
内容的提问来源于stack exchange,提问作者Texter
相关产品推荐
相关产品推荐

