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

对话框激活时context.pop未调用,计时器完成后页面无法跳转

问题分析与解决方案

核心问题

  1. 计时器监听逻辑错误:你在initState里判断_controller!.isCompleted,但initState仅在组件初始化时执行一次,计时器完成是后续的异步事件,这段代码根本不会在计时器结束时触发,和对话框是否打开无关。
  2. 对话框存在时的路由问题:当showExitPopup对话框弹出后,Navigator栈中新增了对话框的路由,此时直接调用context.pop()只会关闭对话框,无法退出当前页面。

解决方案

1. 正确监听计时器完成事件

不要在initState里做判断,改用计时器的whenComplete方法监听完成事件,确保计时器结束时执行退出逻辑:

@override
void initState() {
  super.initState();
  // 监听计时器完成事件
  _controller!.whenComplete(() {
    _handleTimerFinish();
  });
}

void _handleTimerFinish() {
  // 方式1:直接退出当前页面(忽略对话框,使用根Navigator)
  Navigator.of(context, rootNavigator: true).pop();
  
  // 方式2:先关闭所有弹窗,再退出当前页面
  // Navigator.of(context).popUntil((route) => route.isCurrent);
  // Navigator.of(context).pop();
  
  // 调用提交测试函数
}

2. 优化对话框退出逻辑

如果需要在用户操作对话框后处理页面退出,可在调用showExitPopup时根据返回值执行:

// 示例:在某个方法中调用对话框
Future<void> _showExitDialog() async {
  bool shouldExit = await showExitPopup("提示", "时间已到,是否退出?", "退出");
  if (shouldExit) {
    Navigator.of(context).pop();
  }
}

补充说明

  • Navigator.of(context, rootNavigator: true)会获取根导航器,调用pop()时会直接退出当前页面,跳过对话框的路由层级。
  • popUntil((route) => route.isCurrent)可以先关闭所有打开的弹窗,再执行页面退出操作,适合需要清理弹窗的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 07:17:25