StreamBuilder控件和Firestore定价

时间:2019-01-23 09:07:20

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

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

  1. 每次StreamBuilder刷新以显示新数据时,实际上是从Firestore collection重新获取所有文档还是仅在寻找更改并更新它们?如果它是从Firestore再次获取文档,Firestore是否将此视为每次刷新时都下载多个文档,或者仅计数一次,并且如果获取的任何新文档有更新,则为分开算?

  2. 如果它按照当前行为每隔2秒钟甚至更少一次来获取所有文档,是否有办法将其限制为每30秒或每RefreshIndicator是为了避免多次不必要的读取?我尝试使用StreamController,但是stream仍然会在每次触摸列表或每秒刷新一次。

1 个答案:

答案 0 :(得分:0)

嗯,我想这取决于您的代码。我认为有一些方法可以不断听取Firestore的变化。

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

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

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
})

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

我观察到,只要不重建Streambuilder所在的小部件树,文档就只能读取一次。

所以回答您的问题:

  1. 我的理解是,如果StreamBuilder刷新或再次初始化,则它将再次触发查询并读取数据。根据Firestore文档,每次阅读文档都将计入您的限额和费用。因此,我想说是的,它对您查询中包含的所有文档都有效。

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

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