You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 22:40:23