【问题标题】:Calling .setPersistenceEnabled(false) when logging out of app, not working退出应用程序时调用 .setPersistenceEnabled(false),不起作用
【发布时间】:2020-04-13 08:35:20
【问题描述】:

在我的 Flutter/Dart 移动应用中,我利用 Firebase RTDB 持久性来启用应用的离线使用。

我的理解是,要启用持久性,您必须按照以下代码进行调用,然后再使用任何数据库引用,例如。查询数据库。我使用以下代码在加载应用程序后立即启用持久性,它工作正常:

FirebaseDatabase firebaseDatabase = FirebaseDatabase.instance;
bool _success = await firebaseDatabase.setPersistenceEnabled(true);
print(_success); // Prints true, so persistence is set 'on'.

当我退出应用程序时,我尝试关闭持久性:

bool _success = await firebaseDatabase.setPersistenceEnabled(false);
print(_success); // Prints false, so persistence is still 'on', ie. the call failed.

我认为无法关闭持久性的原因是因为在尝试关闭它之前已经调用了数据库引用。

我猜这会导致三个问题:

  1. 我是否应该担心在注销时将其关闭?我尝试它的原因主要是良好的内务管理。运行注销时,我会清理共享首选项、关闭 keepsyncd 等。此外,虽然用户可以有多个用户 ID 来登录,但我想确保我没有保留他们之前登录 ID 中的持久数据。
  2. 与1相关,是否设置持久化为false清除缓存 数据库的数据和潜在的排队调用?
  3. 如果对 1 和 2 的回答是“是”,我该如何关闭持久性,因为我用来执行此操作的代码一直告诉我它失败了?

【问题讨论】:

    标签: firebase flutter firebase-realtime-database dart persistence


    【解决方案1】:

    处理此问题的典型方法是在用户登录后启用持久性。

    一旦启用了磁盘持久性并且您的应用使用了数据库,就无法关闭它。文档对此进行了说明:

    如果操作成功,则返回的Future 将以true 结束,如果无法设置持久性,则返回false因为已经创建了数据库引用)。

    最后一点显然是你的情况:你已经在使用数据库了,这意味着磁盘持久化已开启。

    针对您的具体问题:

    1. 很遗憾,目前无法通过 API 清除本地缓存中的数据。这是一个有效的feature request,但现在您必须假设该设备(或设备配置文件)上的任何用户都可以看到设备上的任何数据。
    2. 禁用磁盘持久性可防止客户端将数据添加到缓存中。它不会清除缓存中的任何现有数据。

    【讨论】:

    • 谢谢,弗兰克。我是这么想的。我会考虑提出功能请求。
    • 抱歉,忘记了。现在完成。期待看到你达到500k。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多