【问题标题】:Listen to firestore document changes inside a streambuilder在流构建器中收听 Firestore 文档更改
【发布时间】:2021-12-06 18:24:17
【问题描述】:

Flutter 让通过 StreamBuilder 小部件实时收听文档更改变得非常容易。我试图计算文档下载到客户端的频率,但是当我使用StreamBuilder 时我不能这样做,因为它不提供此功能。我尝试通过在构建功能上增加一个计数器来作弊,但只要屏幕上的某些内容发生变化,它就会增加计数器,即使没有文档更改也是如此。

有没有办法统计文档的下载量?

非常感谢。

【问题讨论】:

  • 只是猜测...您可以通过 Firebase 的 Cloud Functions 实现这一目标吗?
  • 我没有得到你想要准确计算的内容。是全局还是本地统计特定文档的api调用次数?
  • @MatthewTrent 是的,这是可能的,但通过使用写入增加计数器来跟踪读取是可能的,但它会非常矫枉过正。我想在客户端使用它。
  • @CrimsonFoot 我想计算每次下载文档时的文档读取操作数。 StreamBuilder 读取的更改也算作读取操作。这样,我希望跟踪每个grouptag 或我与之关联的任何实体的使用情况。换句话说,我想对某些成本进行一些计算。
  • @Albert 看来您需要一些分析。你为什么不参考这个文档? firebase.google.com/docs/functions/writing-and-viewing-logs

标签: firebase flutter google-cloud-firestore


【解决方案1】:

我不知道是否可以准确计算 Firestore API 的使用量。但是您可以将快照流隐藏在来自rxdartBehaviorSubject 后面,以便在重建StreamBuilders 时使用BehaviorSubject 存储的值,而无需触及snapshot。然后就可以在snapshot上使用doOnData的方法了。

final Stream<QuerySnapshot<Map<String, dynamic>>> _firestoreSnapshots =
      FirebaseFirestore.instance
          .collection("myCollection")
          .snapshots()
          .doOnData((event) {
    print(event);
});


/// Wrapper around the Firestore snapshot, to be able to
/// remember the latest value and subscribe multiple times.
BehaviorSubject<QuerySnapshot<Map<String, dynamic>>>
      behaviorFirestoreCollection = BehaviorSubject();

FirestoreRepository() {
    // Expose the snapshot on the behavior subject
    behaviorFirestoreCollection.addStream(_firestoreSnapshots);
}

您的StreamBuilder 将订阅行为主题。在重建 StreamBuilder 时(由于新发射值以外的原因),print 不会发生。

如果没有行为主题,这是否可行,我不确定。你可以先试试。

【讨论】:

  • 您好,谢谢您的回答。 Flutter 说 snapshots() 没有 doOnData 方法:/
  • 嗨,对不起,我应该提到您从 rxdart 包中获得该方法。它是包给出的Stream 上的extension
  • 我在实现这一点时遇到了一些麻烦。你能提供一些示例实现吗?
  • 如果你在 GitHub 上分享你的尝试,我可以看看并做 PR。
猜你喜欢
  • 2020-01-07
  • 1970-01-01
  • 2019-05-24
  • 1970-01-01
  • 2019-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
相关资源
最近更新 更多