我有一个由两部分组成的问题。在阅读 Firestore 定价后,它说根据您读写的文档数量以及您执行的操作(例如删除和其他一些因素)向您收费。话虽如此,我正在使用 StreamBuilder
无论数据库中是否有新数据,只要滚动列表,它就会不断刷新自身。现在,构建器正在从数据很少的集合中获取数据,但该集合可能会变得更大。话虽如此,我的问题是:
StreamBuilder
刷新自身以显示新数据,它实际上是否再次从 Firestore collection
中获取所有文档?或者它只是寻找更改并更新它们?如果它再次从 Firestore
获取文档, 做 Firestore
将此视为每次刷新时下载多个文档,还是仅计算一次,如果获取的任何新文档有更新,则单独计算? RefreshIndicator
一次。是为了避免多次不必要的读取?我尝试使用 StreamController
但stream
每次触摸列表或每秒都会刷新。 最佳答案
好吧,我想这有点取决于您的代码。我认为有一些方法可以不断地聆听 Firestore 的变化。
但是,如果您使用最常见的查询,则情况并非如此。根据我的理解,我的推理原因如下:
Streambuilder:每次数据到达流的接收器时都会触发构建器功能。
Sink 是任何数据的输入 channel 。流立即返回放入接收器的数据。
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 树没有重建,文档只会被读取一次。
所以要回答你的问题:
如果没有更多细节,我无法提供更多信息。
关于firebase - StreamBuilder 控件和 Firestore 定价,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54323540/