我有一个两部分的问题。仔细阅读Firestore的价格后,它说您将根据读取和写入的文档数量以及执行的操作(例如删除)和其他一些因素向您收取费用。话虽如此,我使用的StreamBuilder
会在列表滚动时不断刷新自身,无论数据库中是否有新数据。目前,构建者正在从数据很少的集合中获取数据,但是该集合可能会变得更大。话虽如此,我的问题是:
每次StreamBuilder
刷新以显示新数据时,实际上是从Firestore collection
重新获取所有文档还是仅在寻找更改并更新它们?如果它是从Firestore
再次获取文档,Firestore
是否将此视为每次刷新时都下载多个文档,或者仅计数一次,并且如果获取的任何新文档有更新,则为分开算?
如果它按照当前行为每隔2秒钟甚至更少一次来获取所有文档,是否有办法将其限制为每30秒或每RefreshIndicator
是为了避免多次不必要的读取?我尝试使用StreamController
,但是stream
仍然会在每次触摸列表或每秒刷新一次。
答案 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所在的小部件树,文档就只能读取一次。
所以回答您的问题:
我的理解是,如果StreamBuilder刷新或再次初始化,则它将再次触发查询并读取数据。根据Firestore文档,每次阅读文档都将计入您的限额和费用。因此,我想说是的,它对您查询中包含的所有文档都有效。
我不确定您如何不断刷新或初始化streambuilder,因此无法给您明确的答案。如果您仅在构建小部件树的过程中使用与上面类似的代码一次,则应仅读取一次...
没有更多细节,我无法提供更多信息。