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

