Flutter应用Google登录成功后无法跳转首页如何解决
Flutter Google登录后无法跳转首页修复方案
根因分析
- controlSignIn方法的未登录分支修改
isSignedIn变量时未包裹setState,无法触发UI重绘更新页面 saveUserInfoToFireStore方法无异常捕获逻辑,执行过程中如果出现报错(如用户从注册页返回导致username为空、Firestore权限不足、User模型解析失败等),会直接中断流程,导致后续更新登录状态的setState逻辑无法执行- 未添加
mounted判断,页面销毁时调用setState会触发异常,打断正常逻辑 - 未做Google登录用户非空校验,空对象调用会触发崩溃
修复步骤
1. 修正controlSignIn方法的状态更新逻辑
增加异常捕获、mounted判断,所有修改isSignedIn的操作都用setState包裹:
controlSignIn(GoogleSignInAccount signInAccount) async { if (signInAccount != null) { try { await saveUserInfoToFireStore(); // 仅页面挂载时更新状态 if(mounted) { setState(() { isSignedIn = true; }); } } catch (e) { debugPrint("登录处理异常:$e"); if(mounted) { setState(() { isSignedIn = false; }); } } } else { if(mounted) { setState(() { isSignedIn = false; }); } } }
2. 优化saveUserInfoToFireStore逻辑
增加用户取消注册的判断,避免空username写入引发后续异常:
saveUserInfoToFireStore() async { final GoogleSignInAccount gCurrentUser = gSignIn.currentUser; if(gCurrentUser == null) throw Exception("Google登录用户信息为空"); DocumentSnapshot documentSnapshot = await usersReference.doc(gCurrentUser.id).get(); if(!documentSnapshot.exists){ final username = await Navigator.push(context,MaterialPageRoute(builder: (context) => CreateAccountPage())); // 注册页返回空值说明用户主动取消注册,登出并终止流程 if(username == null || username.toString().trim().isEmpty) { await gSignIn.signOut(); throw Exception("用户主动取消注册"); } await usersReference.doc(gCurrentUser.id).set({ "id": gCurrentUser.id, "profileName": gCurrentUser.displayName, "username": username, "url": gCurrentUser.photoUrl, "email": gCurrentUser.email, "bio": "", "timestamp": timestamp, }); documentSnapshot = await usersReference.doc(gCurrentUser.id).get(); } currentUser = User.fromDocument(documentSnapshot); }
3. 确认基础配置正确
- 检查main函数中是否已完成Firebase初始化:
void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); runApp(const MyApp()); }
- 检查Firestore权限规则是否开放了users集合的读写权限,测试阶段可临时使用以下规则:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /users/{userId} { allow read, write: if request.auth != null && request.auth.uid == userId; } } }
内容的提问来源于stack exchange,提问作者Vikas Hansdak
相关产品推荐
相关产品推荐

