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

Flutter中如何实现Firebase用户UID与Firestore users集合文档ID匹配

问题解决方案

核心问题原因

  • UserProvider 类中的 _userId 字段全程未被赋值,导致构造 NayyaaUser 实例时 uid 始终为 null
  • Firestore 的 doc() 方法传入 null 时会自动生成随机文档ID,同时 toMap() 方法中映射的 userId 字段也同步为 null,完全符合你遇到的报错表现
  • saveUserProfile 方法的逻辑分支错误,_userId 为 null 时本不该执行存储操作,原代码反而优先走了这个分支

修复步骤

1. 给UserProvider新增uid赋值方法

修改user_provider.dart,新增设置uid的方法:

// 新增:同步当前登录用户的Firebase UID
void setLoginUserUid(String uid) {
  _userId = uid;
  notifyListeners();
}

2. 注册/登录成功后同步UID

在你调用注册、登录方法的业务页面,拿到返回的NayyaaUser实例后,把uid传给UserProvider:

// 注册逻辑示例
ElevatedButton(
  onPressed: () async {
    // 调用注册接口
    NayyaaUser? newUser = await AuthService().signUp(_emailController.text, _passwordController.text);
    if (newUser != null) {
      // 同步UID到UserProvider
      Provider.of<UserProvider>(context, listen: false).setLoginUserUid(newUser.uid!);
      // 赋值其他用户信息
      Provider.of<UserProvider>(context, listen: false).changeName(_nameController.text);
      Provider.of<UserProvider>(context, listen: false).changePhone(_phoneController.text);
      // 执行保存到Firestore操作
      Provider.of<UserProvider>(context, listen: false).saveUserProfile();
    }
  },
  child: Text("注册")
)

3. 修正saveUserProfile的错误逻辑

删除原有的无用分支,只保留_uid有值时的存储逻辑:

saveUserProfile() {
  // 仅当UID存在时执行存储
  if (_userId != null) {
    NayyaaUser userProfile = NayyaaUser(
      uid: _userId,
      name: name ?? '',
      email: email ?? '',
      phone: phone ?? ''
    );
    firestoreService.saveUserDataToFirestore(userProfile);
  }
}

4. 可选优化:自动同步登录状态

在UserProvider的构造方法中监听Firebase Auth的状态变化,应用冷启动时自动同步已登录用户的UID:

UserProvider() {
  authService.userAuthStatus.listen((loginUser) {
    if (loginUser != null) {
      _userId = loginUser.uid;
      notifyListeners();
    }
  });
}

内容的提问来源于stack exchange,提问作者Saw Tha Wah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 22:15:09