You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter封装为独立函数的退出确认对话框无法关闭应用问题求解

问题产生原因

  • _onWillPop 作为返回拦截的回调,要求返回 Future<bool> 类型的结果,告诉系统是否允许执行返回操作。你当前的实现中直接调用 exitdialog(),既没有 await 等待对话框的选择结果,也没有将结果返回给回调,系统无法收到确认退出的信号,因此只会关闭对话框,不会触发后续的应用退出逻辑。
  • 之前额外添加 Navigator.of(context).pop(true) 导致黑屏的原因是重复弹出路由:对话框的按钮已经通过 pop 方法关闭了对话框自身的路由,额外的 pop 会直接弹出应用的根页面路由,导致页面栈为空,出现黑屏。

修复方案

只需调整两处代码即可:

  1. 给 exitdialog 明确声明返回类型为 Future<bool?>,和 showDialog 自带的返回类型匹配
  2. 在 _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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:54:06