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

Posted

技术标签:

【中文标题】使用 Firebase 收听 Stream 的结果与 StreamBuilder 不同【英文标题】:Listening to Stream doesn't get same result as StreamBuilder with Firebase 【发布时间】:2021-08-28 17:26:31 【问题描述】:

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

【问题讨论】:

【参考方案1】:

hasErrorhasData 是在AsyncSnapshot object 上定义的属性,并且仅在您位于StreamBuilder 内部时才存在,它实质上包装了异步操作的状态。当您在代码中调用 AsyncSnapshot.data 时,您会返回封装 Firebase 数据的 QuerySnapshot

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

这绝对是一开始的困惑,因为这里涉及到很多类型的快照,所以我建议查看What is the difference between existing types of snapshots in Firebase?

【讨论】:

使用 firebase 已经一年了,它仍然令人困惑! ...我要做的是从只有 Bloc 可以访问的 Repository 类中获取数据,并将数据提供给可用的小部件。 QuerySnapshot 是可行的,但我现在看不出有什么办法来处理这些错误。是否可以这样做,或者我应该从小部件中获取数据,并将它们与 Bloc 同步? 当您自己收听流时,处理错误的方式会有所不同。据我所知,您可以使用handleError 检查错误:api.dart.dev/stable/2.13.1/dart-async/Stream/handleError.html 我添加了这个...snapshots().handleError( (e) =&gt; print("11111 $e"),但该函数永远不会执行。我猜firebase会在内部处理错误(这就是AsyncSnapshot中hasError的方式)并且不会重新抛出它以供handleError收听。 我对这部分不太熟悉,但这就是它的实现方式(对于 android,但所有平台的工作方式几乎相同):github.com/FirebaseExtended/flutterfire/blob/… 然后在 Flutter 方面:@ 987654326@

以上是关于使用 Firebase 收听 Stream 的结果与 StreamBuilder 不同的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中基于 Future 结果构建 Stream?

如何使用 Stream Builder 从多个 firebase 集合中获取数据

火力基地。如何在 Node JS 中收听集合并获取最新修改文档的 ID?

使用 Flutter 在 Firebase 中使用 Stream<QuerySnapshot> 检索数据

Flutter & Firebase 将 10 多个 Firebase 文档放入 Stream<List<Map>>

使用Provider for DI时如何根据Firebase Auth流修改Flutter Firebase Stream监听器?