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

Flutter中如何在Firestore的.doc()方法中使用当前用户UID获取数据

解决方案

问题根源

  • 集合名称大小写不匹配:你写入用户数据时用的集合名是Users(首字母大写),但查询时用的是users(全小写),Firestore集合名称大小写敏感,会直接导致查不到对应文档
  • UID获取逻辑和Firestore查询逻辑没有做异步串联:你封装的inputData是异步方法,没有等它返回UID就直接查询Firestore,自然拿不到有效uid参数
  • 后续更新的代码中FutureBuilder逻辑顺序错误:先判断snapshot.hasData就直接返回加载状态,后续取值逻辑完全无法执行

修正代码

方案1:复用Provider封装的inputData方法(推荐,避免强制解包风险)

两层FutureBuilder嵌套,先获取UID再查询用户数据:

// 先获取你的AuthProvider实例,根据你实际的Provider类型调整
final authProvider = Provider.of<AuthProvider>(context, listen: false);

return FutureBuilder<String>(
  future: authProvider.inputData(),
  builder: (context, uidSnapshot) {
    // 还在获取UID
    if (uidSnapshot.connectionState != ConnectionState.done) {
      return const Text("加载中...");
    }
    // 拿到UID后查询Firestore
    final uid = uidSnapshot.data!;
    return FutureBuilder<DocumentSnapshot>(
      future: FirebaseFirestore.instance
          .collection('Users') // 这里要和写入时的集合名一致,首字母大写
          .doc(uid)
          .get(),
      builder: (context, userSnapshot) {
        if (userSnapshot.connectionState == ConnectionState.waiting) {
          return const Text("加载中...");
        }
        if (userSnapshot.hasError) {
          return const Text("加载失败");
        }
        if (!userSnapshot.hasData || !userSnapshot.data!.exists) {
          print('数据库中不存在对应文档');
          return const Text("未找到用户信息");
        }
        // 拿到用户数据返回
        Map<String, dynamic> userData = userSnapshot.data!.data() as Map<String, dynamic>;
        return Text(userData['displayName']);
      },
    );
  },
);

方案2:直接使用FirebaseAuth currentUser(需保证用户已登录)

如果你确认页面渲染时用户一定已登录,可以简化为单层FutureBuilder,同时修正原逻辑错误:

return FutureBuilder<DocumentSnapshot>(
  future: FirebaseFirestore.instance
      .collection('Users') // 修正集合名大小写
      .doc(FirebaseAuth.instance.currentUser!.uid)
      .get(),
  builder: (context, snapshot) {
    // 优先判断加载状态
    if (snapshot.connectionState == ConnectionState.waiting) {
      return const Text("加载中...");
    }
    // 判断错误
    if (snapshot.hasError) {
      return const Text("加载失败");
    }
    // 判断文档是否存在
    if (!snapshot.hasData || !snapshot.data!.exists) {
      print('数据库中不存在对应文档');
      return const Text("未找到用户信息");
    }
    // 正常返回昵称
    Map<String, dynamic> userData = snapshot.data!.data() as Map<String, dynamic>;
    return Text(userData['displayName']);
  },
);

参考截图

你上传的Firestore文档结构如下,可确认集合名确实为首字母大写的Users:
Firestore文档截图

内容的提问来源于stack exchange,提问作者kernelrpc_mach_vm_protect

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:30:03