【问题标题】:How to use firebase realtime-database in offline mode in Flutter app?如何在 Flutter 应用程序中以离线模式使用 firebase realtime-database?
【发布时间】:2022-02-16 04:39:18
【问题描述】:
我发现了 Firebase 离线功能的一个很棒的功能。初始化 Firebase await FirebaseDatabase.instance.setPersistenceEnabled(true);
问题 1:
我无法理解 database.keepSynced(true) 函数,因为如果不使用这行代码,我的应用程序会保留旧的并获取新的更新数据,那么这到底是做什么的?
问题 2:
当用户离线时如何防止写操作,因为我读到在启用持久性后,它会创建一个写操作队列并在用户上线时更新它们,那么我该如何阻止呢?
问题 3:
这个持久性功能是否也可以在 IOS 设备中使用,还是需要先进行一些权限设置?
谢谢
【问题讨论】:
标签:
firebase
flutter
firebase-realtime-database
caching
【解决方案1】:
当您调用 FirebaseDatabase.instance.setPersistenceEnabled(true) 时,您将允许 Firebase 在设备上创建一个本地文件,在该文件中保存最近读取的所有数据,以及设备离线时所有待处理的写入。
当您在节点上调用 keepSynced(true) 时,您是在告诉 SDK 始终保持该节点同步。它实质上在节点上创建了一个onValue 侦听器,而没有任何处理程序代码,因此您这样做纯粹是为了在设备确实离线时保持数据同步。
通过将keepSynced(true) 与setPersistenceEnabled(true) 结合使用,您可以指定您希望应用在重新启动后处于离线状态时继续工作,以及为此需要哪些数据。
如果您在数据库的根目录上调用 keepSynced(true),您就是在告诉 SDK 将数据库中的所有数据同步到磁盘缓存。虽然这最初可能是让您的应用在离线模式下运行的一种快速方法,但当您有更多人开始使用您的应用时,它通常不会扩展。
如果您只想在客户端与数据库后端建立连接时允许写入操作,您可以向.info/connected 节点注册一个本地侦听器,当有连接时为true 值,@987654329 @ 否则。
请注意,Firebase 不需要这样做,因为它会将待处理的写入排队并在连接恢复时执行它们。一般来说,我建议在此处与系统一起工作而不是反对它,并尝试使您的应用程序在离线场景中正常工作。在许多情况下,应用离线时无需禁用功能。
离线磁盘持久化在 Android 和 iOS 上可用,但在 Web 上不可用。