使用Google登录时如何将用户邮箱与姓名存入数据库?
解决方法
你可以通过两个渠道获取用户信息:一是Google登录返回的googleUser对象,二是Firebase Auth认证后的用户对象。以下是修改后的代码,直接将用户信息写入Firestore数据库:
Future<void> signUpWithGoogle( BuildContext context, bool mounted, ) async { final googleSignIn = GoogleSignIn(); final googleUser = await googleSignIn.signIn(); if (googleUser == null) return; final googleAuth = await googleUser.authentication; final credential = GoogleAuthProvider.credential( accessToken: googleAuth.accessToken, idToken: googleAuth.idToken, ); try { // 完成Firebase认证,获取用户凭证 final userCredential = await FirebaseAuth.instance.signInWithCredential(credential); final firebaseUser = userCredential.user; if (firebaseUser == null) return; // 将用户信息写入Firestore await FirebaseFirestore.instance .collection('users') .doc(firebaseUser.uid) .set({ 'uid': firebaseUser.uid, 'name': googleUser.displayName ?? firebaseUser.displayName, 'email': googleUser.email ?? firebaseUser.email, 'photoUrl': googleUser.photoUrl ?? firebaseUser.photoURL, 'createdAt': FieldValue.serverTimestamp(), // 记录账号创建时间 'lastLoginAt': FieldValue.serverTimestamp(), // 记录本次登录时间 }, SetOptions(merge: true)); // 启用merge,避免覆盖用户后续补充的自定义字段 if (!mounted) return; InfoBox.show(context, InfoBox.success, "使用Google登录成功"); } on Exception catch (e) { if (!mounted) return; InfoBox.show(context, InfoBox.error, e.toString()); // 修正原代码错误:异常时应显示错误提示 } }
关键细节说明
- 信息来源优先级:优先使用
googleUser返回的信息(Google直接提供的字段更完整),若某字段为空,再用Firebase Auth的firebaseUser字段兜底,避免写入空值。 - 时间字段:用
FieldValue.serverTimestamp()获取服务器端时间,避免客户端时间不一致导致的记录偏差。 - merge模式:添加
SetOptions(merge: true)后,用户再次登录时不会覆盖已存在的自定义字段(比如用户后续补充的个人资料)。 - 空值处理:通过
??运算符处理可能为空的字段,保证数据库数据的完整性。
内容的提问来源于stack exchange,提问作者Suhail Thakrani
相关产品推荐
相关产品推荐

