来自 Firebase 快照的 Stream<List<Object>> 是否在节点的每次更改时返回整个节点?扑

Is a Stream<List<Object>> from Firebase snapshot returning the entire node at every change in the node? Flutter

我开始学习 Flutter,因为我想将我的 iOS 应用程序移植到 Flutter,以便在 Android 上也 运行。 我在后端使用 Firebase 实时数据库,我看到 firebase_database 包应该适合我的需要,允许我使用我已经拥有的数据库。 我也在学习使用 BLoC 模式,但我发现的所有 bloc 教程都是针对 Firestore 的,所有 Event/State/Bloc/Repository/Streaming 现在对我来说仍然很混乱。 应该怎样正确实施 bloc 模式?

在基本层面上我确实理解它并且我非常喜欢它,但是考虑一种方法来实现它来满足我的需要有点不知所措。

按照这张图,6 个连接的数据流应该是:

  1. (UI -> BLoC) 一个事件将被发送到 bloc
  2. (BLoC -> Repository) Bloc 将事件映射到 Repository 方法。
  3. (Repository -> Database) Repository 方法是数据库 Create/Update/Delete 方法。
  4. (Database -> Repository) Repository 数据库读取方法获取数据库数据。
  5. (Repository -> BLoC) 来自 Repository 数据库的 return 读取方法将数据放入 BLoC。
  6. (BLoC -> UI) BlocProvider 使用数据重建 UI。

现在我不确定我是否弄清楚了返回 UI 的数据。

在步骤 2 如果我将事件映射到一个方法,该方法 return 将数据作为 Stream<List<Object>> 然后通过 BlocProvider 在步骤 6 UI(无状态小部件)相应地重建。 现在,正如我所见,如果要进行任何更改,将需要大量不必要的重复数据下载,整个节点都会被下载,Google 也会向您收取下载费用。

在 Firebase iOS SDK 中,您可以将观察者附加到节点,因此您只需使用 .childAdded/.childRomovedetc 等获取快照,并使用它来修改您的UI.

为了避免无用的下载并确保我的帐户安全,我宁愿在 keepSynced bool 设置为 true ( https://pub.dev/documentation/firebase_database/latest/firebase_database/Query-class.html ) 的节点上进行查询。这应该(作为 iOS SDK)在第一次触发时 return,一个包含整个节点的快照,而不是当某些事情发生变化时仅包含 new/updated/delete 的快照,对吗?

要以这种方式实施,我是否应该使用在获取快照和有状态小部件时手动更新的 List<Object>?这实际上是我的 iOS 应用程序目前的工作方式。 非常感谢您的帮助,对于这么长的问题深表歉意,从 Swift 进行切换需要时间。

Firebase 侦听器仅传输在被侦听的节点处实际更改的最少量数据。每次发生任何变化时,它都不会传输整个节点及其所有子节点。所以,它并没有你想象的那么贵。