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

Flutter中如何保证AlertDialog每次使用正确上下文自动消失

修复方案

优化后完整代码

showAlertDialogTMPCoinsAdded(BuildContext context, String title, String content) {
  Timer? timer;
  showDialog(
    barrierDismissible: false,
    context: context,
    // 统一使用根导航挂载弹窗,避免路由栈混乱
    useRootNavigator: true,
    builder: (BuildContext dialogContext) {
      timer = Timer(const Duration(milliseconds: 1000), () {
        // 关闭前先校验弹窗是否还存在,避免抛出异常
        if (dialogContext.mounted) {
          Navigator.of(dialogContext).pop();
        }
      });
      return AlertDialog(
        title: Text(title),
        content: Image.asset('assets/images/coins.gif'),
      );
    },
  // 弹窗任意方式关闭时都取消定时器,避免无效执行
  ).then((_) => timer?.cancel());
}

核心优化点

  • 改用弹窗专属的dialogContext执行关闭:showDialog的builder参数提供的context仅属于当前弹窗路由,完全不会受外层Widget的生命周期影响,也不会出现误关其他页面、找不到匹配路由的问题
  • 增加挂载状态校验:执行pop前先判断dialogContext.mounted,如果弹窗已经被提前关闭,就跳过关闭逻辑,彻底避免路由匹配异常
  • 统一根导航配置:showDialog时指定useRootNavigator: true,保证弹窗始终挂载在根导航栈,和后续关闭操作的Navigator实例完全匹配

低版本Flutter兼容

如果你的项目使用的Flutter版本低于3.7,不支持context.mounted属性,可以将定时器内的判断逻辑替换为:

if (ModalRoute.of(dialogContext)?.isCurrent ?? false) {
  Navigator.of(dialogContext).pop();
}

内容的提问来源于stack exchange,提问作者Petro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:36:04