微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用 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?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。