Firebase获取指定Document Snapshot转Map报错,如何修复?
修复Firebase DocumentSnapshot无'docs'属性的错误
错误原因
你之前的代码监听的是Firestore集合的快照(QuerySnapshot类型),这类快照包含多个文档,所以有docs属性可以遍历;但修改后你监听的是单个文档的快照(DocumentSnapshot类型),它只对应一个具体文档,根本不存在docs属性,这就是报错的核心原因。
修复方案
既然你要获取单个文档,直接读取该文档的数据,转换成writeTime实例后,包装成一个单元素列表返回即可(因为你的方法返回类型是Stream<List<writeTime>>)。修改后的代码如下:
Stream<List<writeTime>> readDataStream() { final monthData = dateTimeNow('yyyyMMdd'); print(monthData); final path = APIPath.rdatapath(user); final reference = FirebaseFirestore.instance.collection(path).doc(monthData); final snapshots = reference.snapshots(); return snapshots.map((documentSnapshot) { // 先判断文档是否存在 if (!documentSnapshot.exists) { return []; // 文档不存在时返回空列表,也可根据需求抛出异常 } // 将单个文档数据转成writeTime,再包装成列表 final writeTimeInstance = writeTime.fromMap(documentSnapshot.data()!); return [writeTimeInstance]; }); }
补充说明
- 务必用
documentSnapshot.exists判断文档是否存在,避免data()返回null触发fromMap里的断言错误; - 如果业务上需要处理文档不存在的场景,可将返回空列表的逻辑替换为抛出异常、返回默认
writeTime实例等; - 保持
writeTime.fromMap的空值校验逻辑,避免传入null导致程序崩溃。
内容的提问来源于stack exchange,提问作者Dineth Siriwardana
相关产品推荐
相关产品推荐

