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

如何同步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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 21:48:02