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<List<Object>>
返回的方法,则在步骤6
中通过BlocProvider
,UI
(无状态小部件)将相应地重建。
现在,在我看来,如果有任何更改,整个节点都会被下载,Google 也会向您收取下载费用,这将是很多不必要的重复数据下载。
在 Firebase iOS SDK 中,您可以将观察者附加到节点,因此您只需获取带有 .childAdded
/.childRomoved
etc 等的快照,并使用它来修改您的 UI。
为了避免无用的下载并保证我的帐户安全,我宁愿在 keepSynced bool 设置为 true (https://pub.dev/documentation/firebase_database/latest/firebase_database/Query-class.html) 的节点上进行查询。这应该(作为iOS SDK)在第一次触发时返回一个包含整个节点的快照,而不是在某些事情发生变化时只返回新/更新/删除的快照?
为了实现这种方式,我是否应该使用在获取快照和有状态小部件时手动更新的List<Object>
?这实际上是我的 iOS 应用程序目前的工作方式。
非常感谢您的帮助,很抱歉这个冗长的问题,从 Swift 转换需要时间。
【问题讨论】:
【参考方案1】:Firebase 侦听器仅传输在被侦听的节点上实际更改的最少量数据。每次发生任何变化时,它都不会传输整个节点及其所有子节点。所以,它并没有你想象的那么贵。
【讨论】:
监听器不返回整个节点?如果没有,那么如何返回Stream<List<Object>>
? List 是整个节点,对吗?我的 6 个步骤也正确吗?
第一次你将获得整个节点,并且从那时起只有增量,只要监听器仍然连接。
哦,我明白了。比与 iOS SDK 中的观察者相同..sweet..所以我想我确实理解了 bloc 模式。干杯。
所有客户端 SDK 的工作方式都相同。考虑到客户端要求收听的位置或查询,实际上是服务器端决定向客户端发送什么。
当然所有的 SDK 都一样,只是我找到的信息和教程是针对 Firestore 的,我从来没有使用过。在一次(udemy)从 Firestore 下载消息时,快照每次都包含所有消息..所以我很担心。以上是关于Firebase 快照中的 Stream<List<Object>> 是不是会在节点的每次更改时返回整个节点?扑的主要内容,如果未能解决你的问题,请参考以下文章
IOS Firebase:循环快照中的所有键。值得到凌乱的位置