使用 Firebase 收听 Stream 的结果与 StreamBuilder 不同

问题描述

我正在使用 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 并成功获取数据,但我无法侦听错误。我做错了什么吗?

解决方法

hasErrorhasData 是定义在 AsyncSnapshot object 上的属性,仅当您在 StreamBuilder 内部时才存在,它本质上包装了异步的状态手术。当您在代码中调用 AsyncSnapshot.data 时,您会取回封装来自 Firebase 的数据的 QuerySnapshot

当您自己收听流时,没有 AsyncSnapshot,您从 QuerySnapshot 开始,它是定义为 here 的 Firestore 对象。如您所见,它没有 hasErrorhasData,因为它们的公开方式不同。

这在最初肯定会令人困惑,因为这里涉及多种类型的快照,因此我建议您查看 What is the difference between existing types of snapshots in Firebase?