【问题标题】:StreamBuilder Controls and Firestore PricingStreamBuilder 控件和 Firestore 定价
【发布时间】:2019-06-16 19:47:42
【问题描述】:

我有一个两部分的问题。通读 Firestore 定价后,它说根据您读取和写入的文档数量以及您执行的操作(例如删除)和其他一些因素向您收费。话虽如此,我正在使用StreamBuilder,无论数据库中是否有新数据,只要滚动列表,它就会不断刷新自身。现在,构建器正在从一个数据很少的集合中获取,但该集合可以变得更大。话虽如此,我的问题是:

  1. 每次StreamBuilder 刷新自身以显示新数据时,它实际上是从Firestore collection 再次获取所有文档还是只是寻找更改并更新它们?如果它再次从Firestore 获取文档,Firestore 是否认为这是在每次刷新时下载多个文档,还是只计算一次,如果获取的任何新文档有更新,则单独计算?

  2. 如果它每 2 秒或更少(如当前行为)一次又一次地获取所有文档,有没有办法将这种说法限制为每 30 秒或每次使用 RefreshIndicator 时以避免多次不必要的读取?我尝试使用StreamController,但stream 仍会在每次触摸列表时或每秒刷新一次。

【问题讨论】:

  • 一些允许重现的最小代码会很有帮助。

标签: firebase firebase-realtime-database dart flutter google-cloud-firestore


【解决方案1】:

好吧,我想这在一定程度上取决于您的代码。我认为有一些方法可以不断监听 Firestore 的变化。

但是,如果您使用最常见的查询,则情况并非如此。根据我的理解,这是我的推理:

Streambuilder:每次数据到达流的接收器时都会触发构建器功能。 Sink 是任何数据的输入通道。 Streams 立即返回数据并放入 sink。

Firestore:如果您执行 Firestore“查询”,它将逐个文档读取并在读取后返回。读取所有文档后,连接将关闭。

如果您现在将 firestore 查询作为流分配给您的构建器,如下例所示。读取文档时触发构建器。然后,您可能会在构建器中构建一个显示的小部件。 一旦 firestore 查询读取了所有文档,就不会将新数据推送到接收器中,因此不会再触发构建器。此查询随后将完成并且不再监听更改,因为连接将关闭。

因此,文档通常在流构建器的生命周期内只读取一次。

StreamBuilder<QuerySnapshot>(
    stream: Firestore.instance.collection('your collection').snapshots(),
    builder: (BuildContext context, 
              AsyncSnapshot<QuerySnapshot> snapshot) {
//Your own code to handle the data
})

我最近构建了一个应用程序,我在其中从 firestore 读取任务并通过 StreamBuilder 处理文档。测试文档阅读频率的一种简单方法是在构建器部分将文档打印到控制台。

我观察到的是,只要 Streambuilder 所在的 Widget 树没有重建,文档只会被读取一次。

所以回答你的问题:

  1. 我的理解是,如果 StreamBuilder 刷新或再次初始化,那么它会再次触发查询并读取数据。根据 firestore 文档,每次阅读该文档都计入您的限制和成本。所以我会说是的,它适用于您的查询中包含的所有文档。

  2. 我不确定您是如何不断刷新或初始化流构建器的,因此我无法给您一个明确的答案。如果在构建小部件树的过程中只使用一次类似于上面的代码,那么它应该只被读取一次......

如果没有更多细节,我无法提供更多信息。

【讨论】:

    猜你喜欢
    • 2019-12-11
    • 2020-10-01
    • 2019-05-29
    • 2019-06-17
    • 2019-10-29
    • 2021-03-03
    • 2019-10-28
    • 2018-03-26
    • 2020-05-28
    相关资源
    最近更新 更多