如何使用 Firebase 数据库离线功能

How do I use Firebase database Offline Capabilities

我有一个用户在登录时在 firebase 数据库中创建了一个节点,当应用程序崩溃或用户注销时我希望删除该节点。 在函数 getCurrentOnlineUserInfo 中,我嵌入了 onDisconnect 函数,这样当应用程序关闭时,我希望 driverOffline 被触发 - 其中我有 Geofire.removeLocation(currentFirebaseUser!.uid); 将删除来自 firebase 的节点。 简而言之,我希望 driverOffline 仅在用户断开连接时被调用。 所以,到目前为止我有代码但没有逻辑。

  static void getCurrentOnlineUserInfo() async {
    firebaseUser = FirebaseAuth.instance.currentUser!;

    String userId = firebaseUser!.uid;

    late DatabaseReference userRef =
        FirebaseDatabase.instance.ref().child('users').child('users/$userId');
   
    userRef.once().then((DatabaseEvent databaseEvent) {
      if (databaseEvent.snapshot.value != null) {
        userCurrentInfo = Users.fromSnapShot(databaseEvent.snapshot);
        // print('my name is ${userCurrentInfo.name}');
      }
    });

    await userRef.set(true);
    OnDisconnect onDisconnect = driversRef.onDisconnect();
    await onDisconnect.set(false);
    driverOffline(); // driver offline should be called only when the user is disconnected ?
  }

  static void driverOffline() async {
    Geofire.removeLocation(currentFirebaseUser!.uid); //remove this node
    rideRequestRef!.onDisconnect();

    await rideRequestRef!.remove();
    
    LocationManager().stop();
   
  }

Firebase 的 onDisconnect 处理程序通过在客户端 已连接 时向数据库发送一条指令来工作,服务器一旦检测到客户端已断开连接就会执行该指令。在这种情况下,无法再从客户端 运行,因为它已经断开连接。

所以不是这个:

await userRef.set(true);
OnDisconnect onDisconnect = driversRef.onDisconnect();
await onDisconnect.set(false);

你应该这样做:

await userRef.set(true);
driversRef.onDisconnect().set(false);

set(false) 现在 运行 在服务器上,一旦检测到客户端已断开连接(可能需要几分钟)。

与删除 rideRequestRef 相同,一旦客户端断开连接,您需要 运行 在客户端 连接时执行此操作:

rideRequestRef!.onDisconnect().remove();

这会将指令发送到数据库服务器