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
相关产品推荐
相关产品推荐

