如何从Firestore获取当前用户UID并将数据存入对应用户子集合
问题修复方案
核心错误原因
- 你在
saveInSubcollectionToRemote方法中给doc()传了固定字符串'uid',相当于硬编码了文档ID为字符串"uid",自然会新建一个叫uid的文档,没有使用当前登录用户的真实uid值 - 额外问题:你当前
UserManager.userWeights的结构是{'weights': []},不存在data['userWeight']字段,用它作为子集合文档ID会导致异常,还可能出现同体重数据覆盖的问题
修复步骤
1. 完善UserManager存储逻辑
你登录成功后已经把用户数据存入UserManager.userdata,可以直接从里面取uid,也可以单独增加静态uid字段方便调用:
class UserManager { static Map<String, dynamic> userWeights = {'weights': []}; static Map<String, dynamic>? userdata; // 新增字段存当前用户uid static String? currentUid; }
登录成功时给currentUid赋值:
// 谷歌登录逻辑的已注册分支里 else { print(value.docs[0].data().toString()), UserManager.userdata = value.docs[0].data(), // 新增这行保存uid UserManager.currentUid = userdata.id.toString(), Navigator.pushAndRemoveUntil( context, MaterialPageRoute( builder: (context) { return NavBar(); }, ), (route) => false, ), }
2. 修正子集合保存方法
Future saveInSubcollectionToRemote() async{ Map<String, dynamic> data = UserManager.userWeights; // 判空避免空异常 if (UserManager.currentUid == null) return; return await FirebaseFirestore.instance.collection('users') // 用实际的用户uid代替硬编码的'uid' .doc(UserManager.currentUid) .collection('weights') // 建议用add方法自动生成文档ID,避免同值覆盖问题 // 如果需要自定义ID可以替换为你自己的逻辑 .add(data); }
额外安全提示
不要在Firestore中明文存储用户密码,生产环境下这是严重的安全漏洞,Firebase Authentication已经托管了用户的身份凭证,不需要你自行存储密码。
内容的提问来源于stack exchange,提问作者Dalon
相关产品推荐
相关产品推荐

