Flutter封装为独立函数的退出确认对话框无法关闭应用问题求解
问题产生原因
_onWillPop作为返回拦截的回调,要求返回Future<bool>类型的结果,告诉系统是否允许执行返回操作。你当前的实现中直接调用exitdialog(),既没有await等待对话框的选择结果,也没有将结果返回给回调,系统无法收到确认退出的信号,因此只会关闭对话框,不会触发后续的应用退出逻辑。- 之前额外添加
Navigator.of(context).pop(true)导致黑屏的原因是重复弹出路由:对话框的按钮已经通过pop方法关闭了对话框自身的路由,额外的pop会直接弹出应用的根页面路由,导致页面栈为空,出现黑屏。
修复方案
只需调整两处代码即可:
- 给
exitdialog明确声明返回类型为Future<bool?>,和showDialog自带的返回类型匹配 - 在
_onWillPop中await拿到对话框的返回结果,处理空值(用户点击系统返回键关闭对话框的场景)后将结果返回给回调
修复后的完整代码如下:
Future<bool> _onWillPop() async { // 等待对话框返回结果,空值默认返回false(不退出) bool? exitConfirm = await exitdialog(); return exitConfirm ?? false; } // 明确声明返回类型为Future<bool?>,和showDialog的返回类型匹配 Future<bool?> exitdialog() { return showDialog<bool>( context: context, builder: (context) => AlertDialog( title: const Text("Exit App?"), content: const Text("Are you sure?"), actions: <Widget>[ TextButton( onPressed: () => Navigator.of(context).pop(false), child: const Text("NO"), ), TextButton( onPressed: () => Navigator.of(context).pop(true), child: const Text("YES"), ), ], ), ); }
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

