StreamBuilder 控件和 Firestore 定价

Uma*_*Uma 8 dart firebase firebase-realtime-database flutter google-cloud-firestore

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

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

  2. 如果它像当前行为那样每 2 秒或更短的时间一遍又一遍地获取所有文档,是否有办法将这种说法限制为每 30 秒或RefreshIndicator使用每个 a以避免多次不必要的读取?我尝试使用 aStreamControllerstream每次触摸列表或每秒都会刷新。

小智 0

好吧,我想这有点取决于你的代码。我认为有一些方法可以不断地监听 firestore 的变化。

但是,如果您使用最常见的查询,那么情况就不应该如此。根据我的理解,我的推理如下:

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

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

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

因此,在 Streambuilder 的生命周期中,这些文档通常只被读取一次。

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

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

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

所以回答你的问题:

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

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

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


归档时间:

查看次数:

560 次

最近记录:

5 年,4 月 前