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
相关产品推荐
相关产品推荐

