使用 Flutter&Firebase 登录/退出时更改在线状态

问题描述 投票:0回答:1

我一直在尝试使用 Flutter 和 Firestore 在我的 FlutterFlow 应用程序中实现在线状态。 (不是实时数据库)

除了下面的 AppLifeCycleState 条件外,我还需要添加这 2 个条件:

  1. 如果用户已登录,请将状态设置为“在线”
  2. 如果用户已注销,请将状态设置为“离线”
class OnlineStatus extends StatefulWidget {
  const OnlineStatus({
    super.key,
    required this.userId,
  });

  final String userId;

  @override
  State<OnlineStatus> createState() => _OnlineStatusState();
}

class _OnlineStatusState extends State<OnlineStatus>
    with WidgetsBindingObserver {
  String _userStatus = 'offline';

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
    _updateUserStatus('online');
    _listenToUserStatus();
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    if (state == AppLifecycleState.paused ||
        state == AppLifecycleState.inactive) {
      _updateUserStatus('offline');
    } else if (state == AppLifecycleState.resumed) {
      _updateUserStatus('online');
    }
  }

  Future<void> _updateUserStatus(String status) async {
    await FirebaseFirestore.instance
        .collection('Users')
        .doc(widget.userId)
        .update({'status': status});
  }

  void _listenToUserStatus() {
    FirebaseFirestore.instance
        .collection('Users')
        .doc(widget.userId)
        .snapshots()
        .listen((snapshot) {
      setState(() {
        _userStatus = snapshot.data()?['status'] ?? 'offline';
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return _buildStatusCircle();
  }

  Widget _buildStatusCircle() {
    Color circleColor = (_userStatus == 'online') ? Colors.green : Colors.red;
    return Container(
      width: 12,
      height: 12,
      decoration: BoxDecoration(
        color: circleColor,
        shape: BoxShape.circle,
      ),
    );
  }
}

我使用 AppLifecycleState.detached 将状态更改为“离线”,但它不起作用,所以我不得不将其更改为 AppLifecycleState.inactive。也很想知道为什么它不起作用。

还想知道与实时数据库相比,使用 Firestore 数据库是否会造成很大损失。

我尝试添加类似 FirebaseAuth.instance.currentUser != null 的条件,但没有成功。

虽然我的代码似乎有效,但我只是不确定这是否是最好的方法,以便我可以接受反馈来更改它。

flutter firebase google-cloud-firestore flutterflow
1个回答
0
投票

我对ff很陌生,所以必须有一种更干净的方法来完成它,我会使用应用程序状态和隐藏在页面上的计时器,当你从一个页面转到另一个页面时,你启动计时器,当它结束时它将把应用程序状态重置为离线状态,然后登录或其他将其设置为在线状态

© www.soinside.com 2019 - 2024. All rights reserved.