问题描述
我正在使用 firebase 并且我有这个:
Stream<QuerySnapshot> qs = FirebaseFirestore.instance
.collection("$mypath")
.orderBy(order)
.limit(10)
.startAfterDocument(lastDoc)
.snapshots();
当我将 qs
传递给 StreamBuilder 时,返回的快照可以执行 snapshot.hasError
。
StreamBuilder(
stream: qs,builder: (BuildContext context,AsyncSnapshot<QuerySnapshot> snapshot) {
if (snapshot.hasError) ... // hasError works
},)
然而,当我听流时,诸如 hasError、hasData ... 之类的东西不再被识别
qs.listen((event) {
if (event.hasError) // error: The getter 'hasError' isn't defined for the type 'QuerySnapshot<Object?>'.
});
我仍然可以执行 event.docs
并成功获取数据,但我无法侦听错误。我做错了什么吗?
解决方法
hasError
和 hasData
是定义在 AsyncSnapshot
object 上的属性,仅当您在 StreamBuilder
内部时才存在,它本质上包装了异步的状态手术。当您在代码中调用 AsyncSnapshot.data
时,您会取回封装来自 Firebase 的数据的 QuerySnapshot
。
当您自己收听流时,没有 AsyncSnapshot
,您从 QuerySnapshot
开始,它是定义为 here 的 Firestore 对象。如您所见,它没有 hasError
或 hasData
,因为它们的公开方式不同。
这在最初肯定会令人困惑,因为这里涉及多种类型的快照,因此我建议您查看 What is the difference between existing types of snapshots in Firebase?