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

Google登录后无法将用户数据保存至Firestore,寻求技术支持

问题排查与修复方案

代码里的几个关键问题:

  • 重复调用认证接口:你连续调用了两次signInWithCredential,冗余操作可能导致后续获取的userCredential状态异常,只需要保留一次调用并获取结果即可。
  • 状态通知位置错误:notifyListeners()放在了return result之后,函数执行到return就会终止,导致状态更新无法通知到UI。
  • 空值强制解包风险:userCredential.additionalUserInfo!.isNewUser用!强制解包,如果additionalUserInfo为空会直接崩溃,应该先做非空判断。
  • 用户信息可能为空:displayName和photoURL可能为null,直接存入Firestore会导致数据异常,需要处理空值情况。

修正后的代码:

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:google_sign_in/google_sign_in.dart';

class GoogleSignProvider extends ChangeNotifier{
  final googleSignIn = GoogleSignIn();
  GoogleSignInAccount? _user;
  GoogleSignInAccount? get user => _user;
  final FirebaseAuth _auth = FirebaseAuth.instance;
  bool result = false;

  Future googleLogin() async {
    try {
      final googleUser = await googleSignIn.signIn();
      if (googleUser == null) return;
      _user = googleUser;
      final FirebaseFirestore _firestore = FirebaseFirestore.instance;
      final googleAuth = await googleUser.authentication;
      final credential = GoogleAuthProvider.credential(
        accessToken: googleAuth.accessToken,
        idToken: googleAuth.idToken, // 补充idToken,避免认证参数不全
      );
      // 仅调用一次认证,获取用户凭证
      UserCredential userCredential = await _auth.signInWithCredential(credential);
      User? user = userCredential.user;
      
      if (user != null && userCredential.additionalUserInfo != null) {
        if (userCredential.additionalUserInfo!.isNewUser) {
          await _firestore.collection('users').doc(user.uid).set({
            'username': user.displayName ?? '匿名用户', // 处理空昵称
            'uid': user.uid,
            'profilePhoto': user.photoURL ?? '', // 处理空头像地址
          });
          result = true; // 标记登录成功
        }
      }
      notifyListeners(); // 提前到return之前,确保状态更新生效
      return result;
    } catch (e) {
      print('登录或存储用户数据出错:${e.toString()}');
      result = false;
      notifyListeners();
      return result;
    }
  }

  Future logout() async {
    await googleSignIn.disconnect();
    await FirebaseAuth.instance.signOut();
    _user = null;
    notifyListeners(); // 登出后同步更新状态
  }
}

额外检查项:

  1. Firestore安全规则:确保规则允许新用户创建自己的文档,示例规则如下:
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      allow create: if request.auth != null && request.auth.uid == userId;
      allow read, update: if request.auth != null && request.auth.uid == userId;
    }
  }
}
  1. Google认证配置:检查Firebase控制台是否正确配置了Google登录的OAuth客户端ID,Android和iOS的SHA-1指纹是否已添加。
  2. 基础权限:确认测试设备有网络权限,且Firestore服务已在控制台启用。

内容的提问来源于stack exchange,提问作者sun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 15:10:25