firebase - StreamBuilder 控件和 Firestore 定价

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

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

  • 每次StreamBuilder刷新自身以显示新数据,它实际上是否再次从 Firestore collection 中获取所有文档?或者它只是寻找更改并更新它们?如果它再次从 Firestore 获取文档, 做 Firestore将此视为每次刷新时下载多个文档,还是仅计算一次,如果获取的任何新文档有更新,则单独计算?
  • 如果它像当前行为那样每 2 秒或更短的时间一遍又一遍地获取所有文档,有没有办法将这个说法限制为每 30 秒一次或每一次 RefreshIndicator 一次。是为了避免多次不必要的读取?我尝试使用 StreamControllerstream每次触摸列表或每秒都会刷新。
  • 最佳答案

    好吧,我想这有点取决于您的代码。我认为有一些方法可以不断地聆听 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 树没有重建,文档只会被读取一次。

    所以要回答你的问题:
  • 我的理解是,如果 StreamBuilder 刷新或再次初始化,则它会再次触发查询并读取数据。根据 firestore 文档,对文档的每次阅读都计入您的限制和成本。所以我会说是的,它对您查询中包含的所有文档都很重要。
  • 我不确定你是如何不断刷新或初始化流构建器的,因此我无法给你一个明确的答案。如果您在构建小部件树的过程中只使用了一次与上述类似的代码,那么它应该只被读取一次...

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

    关于firebase - StreamBuilder 控件和 Firestore 定价,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54323540/

    相关文章:

    ios - 将子值更新为 Firebase iOS 并在其他节点中引用自动 ID

    firebase - 在 Firebase 控制台中隐藏数据

    android - Flutter 致命异常 : java. lang.RuntimeException : Failure delivering result ResultInfo{who=null, request=1, result=0, data=Intent

    dart - 为什么Dart Polymer将主CSS文件内联/硫化到<head>标签中?

    xcode - 使用 SwiftUI 在 macOS 上阻止 FirebaseApp.configure() 的应用沙盒

    c# - 如何在 Unity 中使用 Gradle

    ios - 使用 populateCellWithBlock FirebaseUI 时出错

    javascript - 嵌套在 firebase 集合模型中的集合没有添加功能

    angularjs - 我们可以在网络中使用 Firebase 聊天应用程序进行点对点聊天吗?

    websocket - 天文台服务器启动失败-创建套接字服务器失败