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

Flutter登录后CircularProgressIndicator未自动消失问题修复咨询

问题解决方法

你的问题核心出在对话框关闭逻辑可靠性不足、context使用不当,以及缺失错误处理分支上,以下是具体修复方案:

核心问题分析

  1. 使用外部context调用maybePop(),但对话框拥有独立的context层级,可能导致无法正确触发关闭
  2. 未处理登录失败场景,一旦登录出错,加载对话框会一直停留在界面上
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:22:36