如何同步Firestore数据库与Firebase Authentication并获取认证用户数据
实现方案
1. 核心关联逻辑
Firebase身份认证成功后会返回用户的唯一不变标识UID,你只需要在注册用户的时候,将Firestore中存储的用户文档ID设置为该UID,或在用户文档中新增uid字段存储这个值,后续登录后直接用当前登录用户的UID去Firestore匹配对应文档即可,这是官方推荐的关联方案,不会出现邮箱修改、重复导致的匹配异常问题。
2. 前置操作:注册环节写入关联数据
如果你还没处理注册环节的逻辑,可以参考下面的示例在注册时就把用户数据和UID绑定:
// 注册环节示例代码 final newUserCredential = await _auth.createUserWithEmailAndPassword(email: 注册邮箱, password: 注册密码); if (newUserCredential.user != null) { // 拿到Auth生成的用户唯一UID String uid = newUserCredential.user!.uid; // 往Firestore的用户集合写入数据,文档ID直接用UID await FirebaseFirestore.instance.collection('users').doc(uid).set({ 'firstName': '名', 'lastName': '姓', 'balance': 0, 'email': 注册邮箱, // 其他你需要存储的用户字段 }); }
如果你的存量用户数据已经存在、没有用UID做文档ID,也可以给所有用户文档新增uid字段填入对应用户的Auth UID,或者临时用邮箱做查询匹配。
3. 修改现有登录逻辑,读取用户数据
首先安装cloud_firestore依赖到项目中,然后修改你现有LoginScreen中登录按钮的onPressed代码:
// 先导入Firestore包 import 'package:cloud_firestore/cloud_firestore.dart'; // 替换原onPressed中的try块代码 try { final userCredential = await _auth.signInWithEmailAndPassword( email: email!, password: password!); if (userCredential.user != null) { // 拿到当前登录用户的UID String currentUid = userCredential.user!.uid; // 去Firestore拉取对应用户的文档 DocumentSnapshot userDoc = await FirebaseFirestore.instance.collection('users').doc(currentUid).get(); if (userDoc.exists) { // 解析用户数据 Map<String, dynamic> userInfo = userDoc.data() as Map<String, dynamic>; String firstName = userInfo['firstName']; String lastName = userInfo['lastName']; num balance = userInfo['balance']; // 可以将数据通过构造函数传入CustomerScreen,也可以存入全局状态管理中 Navigator.push( context, MaterialPageRoute( builder: (context) => CustomerScreen( firstName: firstName, lastName: lastName, balance: balance, ), ), ); } } setState(() { showSpinner = false; // 原有代码这里写错成了true,会导致加载圈一直显示 }); } catch (e) { setState(() { showSpinner = false; }); print(e); }
补充:临时用邮箱匹配的方案
如果你暂时不想调整存量用户数据的结构,也可以用登录邮箱作为查询条件拉取用户数据:
QuerySnapshot queryRes = await FirebaseFirestore.instance.collection('users').where('email', isEqualTo: email!).limit(1).get(); if (queryRes.docs.isNotEmpty) { Map<String, dynamic> userInfo = queryRes.docs.first.data() as Map<String, dynamic>; // 后续数据解析、跳转逻辑同上 }
内容的提问来源于stack exchange,提问作者themmfa
相关产品推荐
相关产品推荐

