如何使用 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();
这会将指令发送到数据库服务器
我有一个用户在登录时在 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();
这会将指令发送到数据库服务器