使用 flutter 和 firebase 实现实时在线/离线状态

dun*_*e98 4 android ios dart firebase flutter

Hy,如果用户在线或离线,在应用程序中显示的最佳方式是什么?

前端 -> Flutter

后端 -> Firestore Cloud 和 Firebase 身份验证。

我在 Firestore 中有一组包含文档的用户。每个文档都是一个用户并包含“状态”字段。在 flutter 中,我可以在每次用户登录或注销时更新此字段,但如果您关闭应用程序,它不会更新。

Har*_*llu 13

你可以WidgetsBindingObserver 像这样扩展你的 statefulWidget State 类

class _HomePageState extends State<HomePage>
    with WidgetsBindingObserver
Run Code Online (Sandbox Code Playgroud)

initState方法添加WidgetsBinding.instance.addObserver(this);

@override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }
Run Code Online (Sandbox Code Playgroud)

稍后覆盖didChangeAppLifecycleState方法

@override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    if (state == AppLifecycleState.resumed)
      //TODO: set status to online here in firestore
    else
      //TODO: set status to offline here in firestore
  }
Run Code Online (Sandbox Code Playgroud)

  • 将其添加到您在 main.dart 文件中使用的 statefulWidget 类。每次应用程序恢复和每次应用程序进入后台时,它都将在您的应用程序中运行。 (4认同)
  • 但是,如果我关闭 wifi,然后关闭应用程序,didChangeAppLifecycleState() 将尝试在 Firestore 中将状态设置为“离线”,但由于 wifi 已关闭,Firestore 无法将状态设置为离线...因此,该应用程序的其他用户应用程序将看到该用户“在线”。我怎样才能解决这个问题? (4认同)
  • @MitulAgrawal我使用了不同的方法。第 1 步:如果用户 A 打开应用程序,应用程序会将其“activeUntil”字段设置为:**现在 + 5 分钟**。步骤 2:定义一个名为**每 4 分钟 55 秒**的重复函数,该函数使用 **New Now + 5 分钟**更新“activeUntil”字段 步骤 3:用户 B 获取用户 A 的“activeUntil”字段` 时间。如果 **Now &lt; User-A 的 `activeUntil`**,则 User-B 会看到 User-A 在线。步骤 4:如果 **Now == 用户 A 在用户 B 的应用程序中的 `activeUntil`**,它会获取用户 A 的 **新的 `activeUntil`**。如果没有更新的`activeUntil`,则用户A处于离线状态。 (2认同)