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
相关产品推荐
相关产品推荐

