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

Flutter如何判断Firestore中指定ID的文档是否存在

问题原因
  • 写入与查询逻辑不匹配:你写入数据时直接将当前用户UID作为文档ID存入doc_folder集合,但是查询逻辑是用where匹配文档里的userId字段,除非你写入的data中主动包含了userId字段且值为对应用户UID,否则该查询本身就无法匹配到正确文档。且该场景下你已经可以直接确定文档ID,不需要走条件查询,直接查询指定ID的文档性能更好。
  • 存在判断逻辑错误:Firestore的get()方法返回的快照对象就算没有匹配到任何文档,本身也不会为null,所以你用snap != null作为判断条件永远返回真,自然会出现文档不存在也提示存在的问题。
修复方案

方式1(推荐):直接查询指定ID的文档

先修正Crud类的查询方法,直接获取对应用户UID为ID的文档:

class Crud {
  Future<DocumentSnapshot> getUserDoc() async {
    return await FirebaseFirestore.instance
        .collection('doc_folder')
        .doc(currentUser!.uid)
        .get();
  }
}

调整页面逻辑,通过快照的exists属性判断文档是否存在:

// 页面内定义存储文档快照的变量
DocumentSnapshot? userDocSnap;

@override
void initState() {
  super.initState();
  crud.getUserDoc().then((snap) {
    setState(() {
      userDocSnap = snap;
    });
  });
}

@override
Widget build(BuildContext context){
  return Container(
    child: userDocSnap != null
        ? (userDocSnap!.exists 
            ? /* 文档存在,在此处渲染你的用户专属数据 */ 
            : const Text("no data to show"))
        : const CircularProgressIndicator(), // 未加载完成时显示加载态
  );
}

方式2:保留where条件查询的修正方案

如果你确实需要保留where条件查询的实现,不要判断快照是否为null,要判断返回的文档列表是否为空:

// initState调整为如下逻辑
@override
void initState() {
  super.initState();
  crud.getData().then((result) {
    setState(() {
      // 判断查询到的文档列表是否非空
      bool docExists = result.docs.isNotEmpty;
    });
  });
}

内容的提问来源于stack exchange,提问作者Code With Bishal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:48:04