Flutter集成Firebase谷歌登录异常:用户未同步且未自动导航
解决Flutter Firebase谷歌登录的两个问题:用户数据不显示&登录后不跳转
我仔细看了你的代码,发现两个问题的根源都在几个关键逻辑的缺失和小的拼写/语法错误上,咱们一步步来修复:
问题1:Firebase控制台看不到用户数据
原因分析
- 创建用户的函数未被调用:你写了
createUserInFireStore函数,但登录成功后没有触发这个函数,导致Firestore里根本没有写入用户数据 - 拼写错误:函数里的
userRef应该是你之前定义的usersRef;另外userNAme拼写错误,应该是userName
修复代码
首先在登录成功后调用createUserInFireStore,同时修正拼写错误:
void handleSignIn(GoogleSignInAccount account) { if (account != null) { setState(() { isAuth = true; }); // 新增:登录成功后触发创建用户逻辑 createUserInFireStore(); } else { setState(() { isAuth = false; }); } } Future<void> createUserInFireStore() async { final GoogleSignInAccount user = googleSignIn.currentUser; DocumentSnapshot doc = await usersRef.document(user.id).get(); if (!doc.exists) { String userName; userName = await Navigator.of(context) .push(MaterialPageRoute(builder: (context) => CreateAccount())); // 修正:userRef -> usersRef;userNAme -> userName usersRef.document(user.id).setData({ "id": user.id, "userName": userName, "photoUrl": user.photoUrl, "email": user.email, "displayName": user.displayName, "bio": "", "timeStamp": timestamp }); } }
问题2:登录成功后未自动跳转到CreateAccount页面
原因分析
- 缺少跳转触发逻辑:之前的
handleSignIn只更新了isAuth状态,没有调用createUserInFireStore(上面已经修复了这一点) - 提交按钮语法错误:在CreateAccount页面中,
onTap: submit()会导致页面加载时立即执行submit函数,而不是点击按钮时执行,应该去掉括号
修复代码
修正CreateAccount页面的提交按钮:
GestureDetector( // 修正:submit() -> submit onTap: submit, child: Container( decoration: BoxDecoration( color: Colors.blue, borderRadius: BorderRadius.circular(7.0) ), child: Center( child: Text("Submit", style: TextStyle( color: Colors.white, fontSize: 15.0, )), ), ), )
额外小优化建议
- 给
dispose方法加上@override注解,符合Flutter的生命周期规范:
@override void dispose() { pageController.dispose(); super.dispose(); }
- 给CreateAccount的表单加验证逻辑,确保用户名符合要求:
TextFormField( onSaved: (val)=> userName = val, validator: (val) { if (val == null || val.length < 8) { return "用户名至少需要8个字符"; } return null; }, decoration: InputDecoration( border: OutlineInputBorder(), labelText: "username", labelStyle: TextStyle(fontSize: 15.0), hintText: "must have 8 char"), ),
同时在submit函数里先验证表单:
submit() { if (_formKey.currentState.validate()) { _formKey.currentState.save(); Navigator.pop(context, userName); } }
这样修改后,登录成功后会自动跳转到CreateAccount页面,提交用户名后用户数据会写入Firestore,你就能在Firebase控制台看到用户信息了。
内容的提问来源于stack exchange,提问作者rahul shah
相关产品推荐
相关产品推荐

