注销应用程序时调用 .setPersistenceEnabled(false),不起作用

Calling .setPersistenceEnabled(false) when logging out of app, not working

在我的 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 的答案是 'yes',如果我使用的代码一直告诉我失败,我该如何关闭持久性?

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

一旦启用磁盘持久性并且您的应用程序使用了数据库,就无法将其关闭。文档是这样说的:

The returned Future will complete with true if the operation was successful or false if the persistence could not be set (because database references have already been created).

最后一点显然适合您:您已经在使用数据库,这意味着磁盘持久性已启用。

针对您的具体问题:

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