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

Flutter使用FutureBuilder读取Firestore用户文档为何始终提示不存在

问题根因与修复方案

1. 代码逻辑错误(首要问题)

逻辑判断顺序错误

你在尚未判断snapshot.connectionState是否完成、也未判断snapshot.hasData是否为真的情况下,直接强制解包snapshot.data!访问exists属性,存在空崩溃风险,同时判断顺序颠倒导致分支触发逻辑异常。

条件运算符使用错误

你当前的文档不存在判断用了&&逻辑与:

if (!snapshot.hasData && !snapshot.data!.exists)

该条件仅在「无快照数据 且 文档不存在」两个条件同时满足时才触发,而你实际的场景是「有快照数据 但 文档不存在」,正常不会触发该分支。如果你实际确实进入了该分支,说明在代码执行到该判断时,snapshot.hasData为false,此时强制访问snapshot.data!已经触发了隐式的异常捕获,导致逻辑跳转异常。

2. 底层文档不存在问题排查

如果修复逻辑后仍提示文档不存在,按以下顺序排查:

  • 确认Firestore控制台users集合下,是否存在ID与FirebaseAuth.instance.currentUser!.uid完全一致的文档,注意大小写、前后空格完全匹配
  • 确认用户数据写入逻辑是否正确将文档ID设为用户UID,而非Firestore自动生成的随机ID
  • 检查Firebase安全规则是否开放了对应文档的读权限,权限不足时Firestore会统一返回「文档不存在」的结果,避免泄露数据存在性

修复后参考代码

CollectionReference users = FirebaseFirestore.instance.collection('users');

return FutureBuilder<DocumentSnapshot>(
  future: users.doc(FirebaseAuth.instance.currentUser!.uid).get(),
  builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
    // 先判断错误
    if (snapshot.hasError) {
      return const Text("Something went wrong");
    }
    // 再判断连接状态,加载中直接返回进度动画
    if (snapshot.connectionState == ConnectionState.waiting) {
      return const CircularProgressIndicator();
    }
    // 连接完成后判断是否有数据、文档是否存在
    if (!snapshot.hasData || !snapshot.data!.exists) {
      return const Text("Document does not exist");
    }
    // 正常读取数据
    Map<String, dynamic> data = snapshot.data!.data() as Map<String, dynamic>;
    return Text("User Name: ${data['userName']}");
  },
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:27:03