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

ccrfmcuu  于 2023-01-05  发布在  Flutter
关注(0)|答案(3)|浏览(142)

在应用程序中显示用户在线或离线的最佳方式是什么?
前端-〉扑动
后端-〉Firestore云和Firebase身份验证
我在Firestore中有一个包含文档的用户集合。每个文档都是一个用户,并包含status字段。在Flutter中,我可以在用户每次登录或注销时更新此字段,但如果您关闭应用程序,则不会更新。

mwkjh3gx

mwkjh3gx1#

您可以使用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
  }
k97glaaz

k97glaaz2#

它可以通过**小部件绑定观察者()**完成;

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 ');

}

字符串?变化包含您的应用程序状态!高兴你可以什么你想要的,这可以通知在线状态像Whatsapp Messenger!

我的代码:

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

zrfyljdw3#

你可以抓住一个错误。
您必须将源更改为服务器源:源服务器
第一个月

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);
      });

相关问题