【发布时间】:2022-01-22 00:20:55
【问题描述】:
我正在收听.info/connected 以确定我的设备是否在线。如果它在线,它会将具有设备 ID 的孩子添加到数据库中。
_firebaseDatabase.reference().child('.info/connected').onValue.listen((event) {
if (event.snapshot.value == true) {
setDeviceOnline(userUid: uid, deviceUid: deviceUid)
}
});
我正在使用 Firebase 实时数据库上的 onDisconnect 回调在相应客户端断开连接时删除此设备 ID。
Future<void> setDeviceOnline({String userUid, String deviceUid}) async {
DatabaseReference currentDeviceConnection = _firebaseDatabase.reference().child('users/$userUid/connections').push();
// Add this device to my connections list
await currentDeviceConnection.set(deviceUid);
// When I disconnect, remove this device
currentDeviceConnection.onDisconnect().remove();
}
现在:
- 当客户端明确断开连接时,
onDisconnect会触发并从数据库中删除设备 ID。 - 当我打开
airplane mode时,onDisconnect在短暂超时后触发并从数据库中删除设备 ID。 - 当我打开
airplane mode并在此超时发生之前将其关闭时,onDisconnect在客户端重新连接时立即触发。就像它告诉数据库“我离线了”
第 3 点的问题是当客户端重新连接时,onDisconnect 触发并从数据库中删除当前 ID,并且由于 .info/connected 侦听器再次显示 event.snapshot.value == true,它立即使用设备添加一个新子代id 到数据库。
我认为这按预期工作。所以我不认为这是一个错误。但是如果数据库中仍然存在相应的孩子,有没有办法防止删除孩子并添加新的孩子?
【问题讨论】:
标签: flutter dart firebase-realtime-database user-presence