Flutter登录后CircularProgressIndicator未自动消失问题修复咨询
问题解决方法
你的问题核心出在对话框关闭逻辑可靠性不足、context使用不当,以及缺失错误处理分支上,以下是具体修复方案:
核心问题分析
- 使用外部context调用
maybePop(),但对话框拥有独立的context层级,可能导致无法正确触发关闭 - 未处理登录失败场景,一旦登录出错,加载对话框会一直停留在界面上
pushReplacement()会替换当前页面栈,可能导致原context提前失效,无法完成对话框关闭操作
修改后的代码
SquareTile( onTap: () async { // 显示加载对话框,禁止手动关闭避免流程混乱 showDialog( context: context, barrierDismissible: false, builder: (context) { return const Center( child: CircularProgressIndicator(), ); }, ); try { // 执行谷歌登录 await AuthService().signInWithGoogle(); FirebaseAuth auth = FirebaseAuth.instance; User? user = auth.currentUser; if (user != null && mounted) { // 先关闭加载对话框 Navigator.of(context).pop(); // 替换页面栈跳转到主页 Navigator.pushReplacement( context, MaterialPageRoute(builder: (context) => const MyHomePage()), ); } } catch (e) { // 登录失败时也必须关闭对话框 if (mounted) { Navigator.of(context).pop(); } // 可添加错误提示: // ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('登录失败:$e'))); } }, )
关键修改说明
- 将
barrierDismissible设为false,防止用户在登录过程中手动关闭对话框,保证流程完整性 - 添加
try-catch块,覆盖登录成功和失败的所有场景,确保对话框都会被关闭 - 调整操作顺序:先关闭对话框,再执行页面跳转,避免页面栈替换后原context失效导致无法关闭对话框
- 保留
mounted判断,确保当前widget仍在组件树中时才执行context相关操作,避免报错
内容的提问来源于stack exchange,提问作者Tevel
相关产品推荐
相关产品推荐

