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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:15:01