我一直在尝试使用 Flutter 和 Firestore 在我的 FlutterFlow 应用程序中实现在线状态。 (不是实时数据库)
除了下面的 AppLifeCycleState 条件外,我还需要添加这 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 的条件,但没有成功。
虽然我的代码似乎有效,但我只是不确定这是否是最好的方法,以便我可以接受反馈来更改它。
我对ff很陌生,所以必须有一种更干净的方法来完成它,我会使用应用程序状态和隐藏在页面上的计时器,当你从一个页面转到另一个页面时,你启动计时器,当它结束时它将把应用程序状态重置为离线状态,然后登录或其他将其设置为在线状态