Flutter Google登录导航异常:新老用户跳转逻辑不符预期
Flutter Google登录导航逻辑错误与重复登录问题修复
问题根源
- 登录页导航逻辑漏洞:无论Firestore中用户文档是否存在,代码最终都会执行跳转
SignUpGoogle的逻辑,直接覆盖了老用户跳转到主页的分支。 - 注册页重复登录冗余:用户已通过Google登录进入补充信息页面,却再次执行完整的Google登录流程,完全没必要。
修复方案
1. 修复登录页的导航逻辑
修改signingoogle函数,确保老用户直接进入主页,新用户才跳转补充信息页,同时避免后续代码干扰:
Future<User?> signingoogle() async { try { final GoogleSignInAccount? googleaccount = await GoogleSignIn().signIn(); if (googleaccount == null) { return null; } print('Creating Google Auth'); final GoogleSignInAuthentication googleAuth = await googleaccount.authentication; final AuthCredential credential = GoogleAuthProvider.credential( accessToken: googleAuth.accessToken, idToken: googleAuth.idToken, ); final UserCredential userCredential = await FirebaseAuth.instance.signInWithCredential(credential); final User? user = userCredential.user; if (user != null) { final CollectionReference users = FirebaseFirestore.instance.collection('users'); final DocumentSnapshot emailDocument = await users.doc(user.uid).get(); if (emailDocument.exists) { // 老用户直接跳主页,用pushReplacement避免返回登录页 Navigator.pushReplacement( context, MaterialPageRoute(builder: (context) => btmNavBar())); // 提前返回,阻止后续代码执行 return user; } else { await users.doc(user.uid).set({'email': user.email}); final AuthCredential emailAuthCredential = EmailAuthProvider.credential( email: user.email.toString(), password: 'google password'); await userCredential.user!.linkWithCredential(emailAuthCredential); // 新用户跳补充信息页 Navigator.pushReplacement( context, MaterialPageRoute(builder: (context) => SignUpGoogle())); } } return user; } catch (e) { print('$e'); } return null; }
核心修改:
- 老用户分支添加
return user,直接终止函数,避免后续跳转代码执行 - 改用
pushReplacement跳转,优化用户返回逻辑 - 将新用户的跳转逻辑严格限制在else分支内
2. 移除注册页的重复Google登录逻辑
直接使用当前已登录用户的信息保存补充数据,无需重复登录:
SecondayBtn( onPressed: () async { var userContact = contactController.text.trim(); var storeName = storeNameController.text.trim(); var userAddress = addressController.text.trim(); if (formKey.currentState!.validate()) { try { // 直接获取当前已登录用户 User? currentUser = FirebaseAuth.instance.currentUser; if (currentUser != null) { // 保存补充数据到Firestore await saveUserData( currentUser.uid, currentUser.email!, userContact, storeName, userAddress ); // 跳主页并销毁当前页面 Navigator.pushReplacement( context, MaterialPageRoute(builder: (context) => btmNavBar()), ); } } catch (e) { print('Error saving data: $e'); } } }, btntxt: 'Complete Sign Up', // 按钮文本适配当前操作 ),
核心修改:
- 删除所有Google登录相关代码,直接调用
FirebaseAuth.instance.currentUser获取用户信息 - 调整按钮文本为更贴合操作的表述
- 保留异常捕获,方便排查数据保存问题
内容的提问来源于stack exchange,提问作者Syed Mujtaba Ali kazmi
相关产品推荐
相关产品推荐

