需要推送和移除的是什么,是否仅适用于多个设备?

https://firebase.google.com/docs/database/flutter/offline-capabilities#section-sample

代码1:

final myConnectionsRef =
    FirebaseDatabase.instance.ref("users/joe/connections");
final lastOnlineRef =
    FirebaseDatabase.instance.ref("users/joe/lastOnline");
final connectedRef = FirebaseDatabase.instance.ref(".info/connected");
connectedRef.onValue.listen((event) {
  final connected = event.snapshot.value as bool? ?? false;
  if (connected) {
    final con = myConnectionsRef.push();
    con.onDisconnect().remove();
    lastOnlineRef.onDisconnect().set(ServerValue.timestamp);
    con.set(true);
  }
});

代码2:

final connectedListRef =
    FirebaseDatabase.instance.ref('.info/connected');
final userStatusDatabaseRef =
    FirebaseDatabase.instance.ref().child('users/joe');
connectedListRef.onValue.listen((event) {
  final connected = event.snapshot.value as bool? ?? false;
  if (connected) {
    userStatusDatabaseRef
        .set({'online': true, 'lastOnline': ServerValue.timestamp});
    userStatusDatabaseRef.onDisconnect().set({
      'online': false,
      'lastOnline': ServerValue.timestamp,
    });
  }
});

推荐答案

单个设备最终将多次连接到Firebase实时数据库服务器,这既是其初始化过程的一部分,也是在连接出现临时中断时(发生的频率比您可能意识到的要频繁得多).

通过拨打push(),你可以确保每个这样的连接都被单独跟踪,其中一个的onDisconnect不会干扰另一个.如果不调用Push,流程可能是:

  1. 连接到服务器
  2. 写下记号笔
  3. 为标记注册onDisconnect处理程序
  4. 连接已断开,但服务器不会收到通知.在这种情况下,在套接字超时之前,服务器不会知道客户端已断开连接,这可能需要一些时间.
  5. 同时,客户端再次连接到服务器
  6. 写下同样的记号笔.
  7. 并为该标记注册另一个onDisconnect处理程序
  8. 然后..#3中的onDisconnect被触发,删除了在#2和#6中写入的标记.
  9. 因此,现在我们已经通过客户端在#5中建立的连接进行了连接,但数据库中没有标记.

我希望这个流程能够阐明为什么每次客户端连接到数据库服务器时都需要一个单独的标记.然后检测客户端是否已连接的方法是判断users/joe/connections node 下是否有任何 node .

Flutter相关问答推荐

在Flutter中为不受约束的小部件制作动画

Flutter -如何从布局填充(对称水平)中排除小部件?

当MyChangeNotifier更改时如何计算函数,而无需在构建方法中进行不必要的调用- Flutter

Ffltter:发布版本中的Path NotFoundException

在Flutter 小部件测试中找不到框中的AssetImage装饰

如何在点击查看措辞下方添加句子?

课程中的访问Provider

添加appBar时绘制的线条发生偏移 Flu

使用堆栈的自定义按钮

如何解决需要一个标识符,但得到的是:.try 在:之前插入一个标识符.dart 错误

如果不刷新页面,我看不到从 Firestore 中提取的数据

使用 riverpod 提供 GoRouter 实例的正确方法是什么?

Flutter/Riverpod 创建复杂对象的副本,其值在某处发生变化

如何修复 ICU Lexing 错误:Flutter 中的意外字符

Flutter 动画页面计数器文本

Banner Ad.test 广告单元 ID 是否已过时?

如何防止卡子在底部溢出?

如何在 tabBar 中的选项卡之间制作垂直线?

TextSpan 避免符号字符串组上的换行符

为什么这个参数类型不能分配给参数类型?