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

Flutter应用登录页面无限加载问题排查与修复求助

Flutter登录页面无限加载问题修复方案

问题根源分析

从代码和现象来看,导致无限加载的核心原因有以下几点:

  • 登录成功后未及时关闭加载对话框,后续流程异常时也未处理对话框关闭逻辑
  • Firestore数据查询未添加错误捕获,网络或权限问题会导致流程中断,对话框持续显示
  • sharedPreferences直接使用非空断言,未确保实例已初始化,空指针异常会阻断流程

修复步骤及代码修改

1. 重构登录逻辑,确保对话框全路径关闭

修改loginNow()方法,使用try-catch替代then-catchError,确保登录成功/失败时都能正确关闭加载对话框:

loginNow() async
{
  showDialog(
      context: context,
      barrierDismissible: false, // 禁止用户手动关闭对话框
      builder: (c)
      {
        return LoadingDialog(
          message: "Checking Credentials",
        );
      }
  );

  User? currentUser;
  try {
    final authResult = await firebaseAuth.signInWithEmailAndPassword(
      email: emailController.text.trim(),
      password: passwordController.text.trim(),
    );
    currentUser = authResult.user;
    Navigator.pop(context); // 登录成功,先关闭加载对话框

    if(currentUser != null)
    {
      await readDataAndSetDataLocally(currentUser);
    }
  } catch (error) {
    Navigator.pop(context); // 登录失败,关闭对话框
    showDialog(
        context: context,
        builder: (c)
        {
          return ErrorDialog(
            message: error.toString(),
          );
        }
    );
  }
}

2. 完善用户数据查询的错误处理

修改readDataAndSetDataLocally()方法,添加Firestore查询的异常捕获,同时确保sharedPreferences初始化安全:

Future readDataAndSetDataLocally(User currentUser) async
{
  // 重新显示加载对话框,用于数据加载提示
  showDialog(
      context: context,
      barrierDismissible: false,
      builder: (c)
      {
        return LoadingDialog(
          message: "Loading User Data",
        );
      }
  );

  try {
    final snapshot = await FirebaseFirestore.instance.collection("riders")
        .doc(currentUser.uid)
        .get();

    if(snapshot.exists){
      // 确保获取sharedPreferences实例,避免空指针
      final prefs = await SharedPreferences.getInstance();
      await prefs.setString("uid", currentUser.uid);
      await prefs.setString("email", snapshot.data()!["riderEmail"]);
      await prefs.setString("name", snapshot.data()!["riderName"]);
      await prefs.setString("photoUrl", snapshot.data()!["riderAvatarUrl"]);

      Navigator.pop(context);
      // 使用pushReplacement避免返回登录页
      Navigator.pushReplacement(context, MaterialPageRoute(builder: (c)=> const HomeScreen()));
    }
    else{
      await firebaseAuth.signOut();
      Navigator.pop(context);
      Navigator.pushReplacement(context, MaterialPageRoute(builder: (c)=> const AuthScreen()));

      showDialog(
          context: context,
          builder: (c)
          {
            return ErrorDialog(
              message: "No Record Exists",
            );
          }
      );
    }
  } catch (error) {
    Navigator.pop(context);
    await firebaseAuth.signOut();
    showDialog(
        context: context,
        builder: (c)
        {
          return ErrorDialog(
            message: "Failed to load user data: ${error.toString()}",
          );
        }
    );
    Navigator.pushReplacement(context, MaterialPageRoute(builder: (c)=> const AuthScreen()));
  }
}

3. 额外检查项

  • 确认Firebase Firestore权限规则允许已登录用户读取riders集合中的自身文档,示例规则:
    rules_version = '2';
    service cloud.firestore {
      match /databases/{database}/documents {
        match /riders/{userId} {
          allow read, write: if request.auth != null && request.auth.uid == userId;
        }
      }
    }
    
  • 检查设备网络连接状态,确保可以正常访问Firebase服务
  • 确保全局sharedPreferences已在应用启动时完成初始化

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 11:30:22