Future<void> onAppClose({required String userId}) async {
await FirebaseFirestore.instance
.collection(FirebaseConstants.usersCollection)
.doc(userId)
.update({'isOnline': false});
}
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
final userId = ref.read(currentDeliveryUserProvider)?.reference.id;
print("state--------------------$state");
if (userId != null) {
if (state == AppLifecycleState.detached) {
// The app is completely closing
onAppClose(userId: userId);
}
}
}
@override
Widget build(BuildContext context) {
h = MediaQuery.of(context).size.height;
w = MediaQuery.of(context).size.width;
return GestureDetector(
onTap: () {
FocusManager.instance.primaryFocus?.unfocus();
},
child: MaterialApp(
title: 'ONtrend Partners',
home: const SplashScreen(),
// home: TestFile(),
theme: ThemeData(
textTheme: GoogleFonts.dmSansTextTheme(),
),
debugShowCheckedModeBanner: false,
),
);
}
}
我正在 Flutter 中构建一个交付应用程序,并且当应用程序关闭时,我尝试在 Firebase 中将用户的 isOnline 状态设置为 false。我一直在使用 WidgetsBindingObserver 来侦听 AppLifecycleState 更改,并且 AppLifeCycleState.paused 和 AppLifeCycleState.inactive 一切正常。但是,我注意到当应用程序完全关闭(终止)时,AppLifeCycleState.detached 不会被触发。
如果用户在应用程序切换器中将应用程序滑开(我认为这就是您所说的“完全关闭(终止)”的意思),那么操作系统会杀死该应用程序,而不会向应用程序本身发出任何警告,因此没有办法检测到这一点。如果操作系统在其正常资源管理流程中挂起或停止应用程序(例如,当应用程序有一段时间没有在前台运行时),那么您应该会收到生命周期状态更新。