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

Posted

技术标签:

【中文标题】Firebase 快照中的 Stream<List<Object>> 是不是会在节点的每次更改时返回整个节点?扑【英文标题】:Is a Stream<List<Object>> from Firebase snapshot returning the entire node at every change in the node? FlutterFirebase 快照中的 Stream<List<Object>> 是否会在节点的每次更改时返回整个节点?扑 【发布时间】:2020-06-07 13:34:58 【问题描述】:

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

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

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

    (UI -> BLoC) 将向bloc 发送一个事件。 (BLoC -> 存储库)Bloc 将事件映射到Repository 方法。 (存储库 -> 数据库)Repository 方法是数据库创建/更新/删除方法。 (数据库 -> 存储库)Repository 数据库读取方法获取数据库数据。 (Repository -> BLoC) Repository 数据库读取方法的返回将数据带入 BLoC。 (BLoC -> UI) BlocProvider 使用数据重建 UI。

现在我不确定我是否发现数据会返回到 UI。

在步骤2,如果我将事件映射到将数据作为Stream&lt;List&lt;Object&gt;&gt; 返回的方法,则在步骤6 中通过BlocProviderUI(无状态小部件)将相应地重建。 现在,在我看来,如果有任何更改,整个节点都会被下载,Google 也会向您收取下载费用,这将是很多不必要的重复数据下载。

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

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

为了实现这种方式,我是否应该使用在获取快照和有状态小部件时手动更新的List&lt;Object&gt;?这实际上是我的 iOS 应用程序目前的工作方式。 非常感谢您的帮助,很抱歉这个冗长的问题,从 Swift 转换需要时间。

【问题讨论】:

【参考方案1】:

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

【讨论】:

监听器不返回整个节点?如果没有,那么如何返回Stream&lt;List&lt;Object&gt;&gt;? List 是整个节点,对吗?我的 6 个步骤也正确吗? 第一次你将获得整个节点,并且从那时起只有增量,只要监听器仍然连接。 哦,我明白了。比与 iOS SDK 中的观察者相同..sweet..所以我想我确实理解了 bloc 模式。干杯。 所有客户端 SDK 的工作方式都相同。考虑到客户端要求收听的位置或查询,实际上是服务器端决定向客户端发送什么。 当然所有的 SDK 都一样,只是我找到的信息和教程是针对 Firestore 的,我从来没有使用过。在一次(udemy)从 Firestore 下载消息时,快照每次都包含所有消息..所以我很担心。

以上是关于Firebase 快照中的 Stream<List<Object>> 是不是会在节点的每次更改时返回整个节点?扑的主要内容,如果未能解决你的问题,请参考以下文章

迭代 Firebase 中的子快照

使用 Swift 遍历 Firebase 中的嵌套快照子项

从 Firebase 数据库快照解析布尔值

IOS Firebase:循环快照中的所有键。值得到凌乱的位置

将 Stream Building 与特定的 Firestore 文档一起使用

Flutter & Firebase 将 10 多个 Firebase 文档放入 Stream<List<Map>>