使用 Flutter 和 Firebase 实现实时在线/离线状态

Posted

技术标签:

【中文标题】使用 Flutter 和 Firebase 实现实时在线/离线状态【英文标题】:Implement realtime online/offline status with flutter and firebase 【发布时间】:2020-07-02 05:11:14 【问题描述】:

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

前端 -> 颤振

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

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

【问题讨论】:

【参考方案1】:

您可以使用WidgetsBindingObserver 扩展您的 statefulWidget State 类 喜欢

class _HomePageState extends State<HomePage>
    with WidgetsBindingObserver

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

@override
  void initState() 
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  

稍后覆盖 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
  

【讨论】:

将此添加到您在 main.dart 文件中使用的 statefulWidget 类中。每当应用程序被恢复并且每次应用程序进入后台时,它都会在您的应用程序中运行。 是否可以检测到用户何时点击查看所有应用图标并滑开应用。 朋友们好,但是 web 怎么样,如何使它适用于 web 版本提前谢谢! 但是,如果我关闭 wifi 然后关闭应用程序,didChangeAppLifecycleState() 将尝试在 Firestore 中将状态设置为“离线”,但由于 wifi 关闭,Firestore 无法将状态设置为离线。 .. 因此,该应用程序的其他用户将看到该用户“在线”。我该如何解决这个问题?【参考方案2】:

这可以通过 WidgetsBindingObserver();

完成
class _HomeState extends State<Home> with WidgetsBindingObserver ...

先初始化

@override
void initState() 
super.initState();
WidgetsBinding.instance!.addObserver(this);

添加此函数后监听应用状态didChangeAppLifecycleState()

String? changes;

@override
void didChangeAppLifecycleState(AppLifecycleState state) 
super.didChangeAppLifecycleState(state);

final isBg = state == AppLifecycleState.paused;
final isClosed = state == AppLifecycleState.detached;
final isScreen = state == AppLifecycleState.resumed;

isBg || isScreen == true || isClosed == false
    ? setState(() 
      // SET ONLINE
    )
    : setState(() 
      //SET  OFFLINE

    );
print('CHANGES IS : $changes ');

字符串?更改 包含您的应用状态! Be Happy You Can 你想要什么,这可以像 Whatsapp Messenger 一样通知在线状态!

我的代码:

    isBg || isScreen == true || isClosed == false
    ? setState(() 
      changes = "User is online"
    )
    : setState(() 
      changes = "User is Offline"
    );
    print('CHANGES IS : $changes ');

【讨论】:

【参考方案3】:

你可以捕捉到错误。

您必须将源代码转换为服务器 来源:Source.server

users.get(GetOptions(source: Source.server))

final FirebaseFirestore _firestore = FirebaseFirestore.instance;
      final CollectionReference users = _firestore.collection('users');
    
      users.get(GetOptions(source: Source.server))
          .then((QuerySnapshot querySnapshot) 
        querySnapshot.docs.forEach((doc) 
          print(doc["first_name"]);
          print(doc["last_name"]);
          print(doc["gender"]);
          print(doc["phone_number"]);
        );
      ).onError((error, stackTrace) 
        print(error.toString());//Offline
        Global.showSnackBar(context, error.toString(), false);
      );

【讨论】:

以上是关于使用 Flutter 和 Firebase 实现实时在线/离线状态的主要内容,如果未能解决你的问题,请参考以下文章

Flutter + Firebase:如何实现“谷歌登录”

如何在flutter上使用firebase正确实现注销

使用 Flutter 的电子邮件进行 Firebase 身份验证

在 Flutter 上使用电子邮件和密码进行 Firebase 身份验证的示例?

在不使用 Firebase 的情况下使用电子邮件和密码进行 Flutter 身份验证

使用flutter firebase在线/离线的用户存在