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

Flutter延时5秒弹出对话框时无法关闭加载指示器如何解决

问题原因

你的代码存在3个核心逻辑错误,导致加载指示器无法关闭:

  • showDialog 是Flutter的路由方法,调用后会向当前导航栈推入一个独立的dialog路由,它的显隐由导航栈的入栈/出栈操作控制,和你定义的_isLoading布尔变量没有任何绑定关系。你最后调用setState把_isLoading设为false,只是修改了一个普通状态变量,根本没有执行弹出dialog路由的逻辑,加载框自然会一直留在页面上。
  • 你写的三目判断逻辑是同步执行的:第一次setState把_isLoading改为true后,三目判断立刻执行弹出加载框,后续再修改_isLoading的值时,这段三目代码不会重新运行,完全起不到控制加载框关闭的作用。
  • 延迟5秒后你先执行了弹出信息提示框的逻辑,此时导航栈的栈顶是新弹出的提示框,就算你后续调用Navigator.pop,也只会关闭最上层的提示框,根本触达不到下层的加载框。
修正方法

调整执行顺序,严格按照「弹加载框→等待5秒→关加载框→弹提示框」的流程写逻辑,加载框的关闭必须显式调用Navigator.pop,不要靠布尔值控制。修正后的代码如下:

setState(() {
  _isLoading = true;
});
// 弹出全屏加载指示器
showDialog(
  context: context,
  barrierDismissible: false,
  builder: (BuildContext context) {
    return WillPopScope(
      onWillPop: () async => false,
      child: Center(
        child: CircularProgressIndicator(
          color: Apptheme.primaryColor,
        ),
      ),
    );
  }
);
// 等待5秒
await Future.delayed(const Duration(seconds: 5));
// 先关闭加载框,必须在弹提示框之前执行
if (context.mounted) Navigator.pop(context);
// 再弹出信息提示
if (context.mounted) {
  AppDialogs().showInfoDialogue(context, "Sorry all drivers are busy!", () {
    Navigator.pop(context);
  });
}
setState(() {
  _isLoading = false;
});

额外说明

  • 路由操作前加context.mounted判断是为了避免等待5秒期间组件已经销毁,导致context失效报错,适配Flutter 3.0及以上版本的规范要求。
  • 如果_isLoading没有关联其他页面UI的渲染逻辑,这个变量可以直接删除,不需要保留。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 07:18:16