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(); // 登出后同步更新状态 } }
额外检查项:
- 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; } } }
- Google认证配置:检查Firebase控制台是否正确配置了Google登录的OAuth客户端ID,Android和iOS的SHA-1指纹是否已添加。
- 基础权限:确认测试设备有网络权限,且Firestore服务已在控制台启用。
内容的提问来源于stack exchange,提问作者sun
相关产品推荐
相关产品推荐

