如何从Firebase集合中通过ID获取DocumentSnapshot?
解决方案
如果你只需要获取指定ID的文档,推荐直接查询单个文档的流,这样更高效,不需要拉取整个集合的数据:
方法一:直接查询指定文档(推荐)
修改你的流方法,改为返回单个文档的快照流:
Stream<DocumentSnapshot> streamDocument(String docId) => collectionRef.doc(docId).snapshots();
然后对应的StreamBuilder使用这个流:
return StreamBuilder<DocumentSnapshot>( stream: auth.streamDocument("目标文档ID"), // 替换成你要找的文档ID builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) { if (snapshot.hasData && snapshot.data!.exists) { DocumentSnapshot doc = snapshot.data!; print(doc.id); // 在这里处理文档数据 } else if (snapshot.hasError) { print("获取文档出错: ${snapshot.error}"); } return Container(color: Colors.white); } );
方法二:从集合快照中过滤文档(仅当需要保留整个集合流时使用)
如果必须保持整个集合的流,再在客户端过滤目标文档,你之前用where失败是因为它返回的是可迭代对象而非单个文档,改用firstWhere即可:
return StreamBuilder<QuerySnapshot>( stream: auth.streamState(), builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot){ if (snapshot.hasData){ const targetDocId = "目标文档ID"; // 替换成你要找的文档ID try { DocumentSnapshot doc = snapshot.data!.docs.firstWhere( (document) => document.id == targetDocId ); print(doc.id); // 处理文档数据 } catch (e) { // 处理找不到文档的情况 print("未找到ID为$targetDocId的文档"); } } else if (snapshot.hasError) { print("获取集合快照出错: ${snapshot.error}"); } return Container(color: Colors.white); } );
额外优化
如果不想处理异常,可以导入collection包后使用firstWhereOrNull:
DocumentSnapshot? doc = snapshot.data!.docs.firstWhereOrNull( (document) => document.id == targetDocId ); if (doc != null) { print(doc.id); } else { print("未找到目标文档"); }
内容的提问来源于stack exchange,提问作者Abdulrahman
相关产品推荐
相关产品推荐

