一、需求来源
项目中多页面需要同时监听 AppLifecycleState 根据状态实现不同的业务逻辑;尝试多种实现,使用起来比较麻烦,为了开发效率,随封装一个。代码不复杂,核心在于极简的封装方法。
效果如下:
csharp
[log] 2024-01-20 11:04:36.473511 MyHomePage onInactive
[log] 2024-01-20 11:04:36.476352 AppLifecycleStateObserverDemo onInactive
[log] 2024-01-20 11:04:37.189494 MyHomePage onPause
[log] 2024-01-20 11:04:37.190003 AppLifecycleStateObserverDemo onPause
[log] 2024-01-20 11:04:41.896665 MyHomePage onInactive
[log] 2024-01-20 11:04:41.896964 AppLifecycleStateObserverDemo onInactive
[log] 2024-01-20 11:04:42.177396 MyHomePage onResume
[log] 2024-01-20 11:04:42.178090 AppLifecycleStateObserverDemo onResume
// MyHomePage 为主页面;
// AppLifecycleStateObserverDemo 为特定业务界面;
二、使用示例
dart
import 'package:flutter/material.dart';
import 'package:flutter_templet_project/util/AppLifecycleObserver.dart';
import 'package:flutter_templet_project/util/debug_log.dart';
class AppLifecycleStateObserverDemo extends StatefulWidget {
AppLifecycleStateObserverDemo({
super.key,
this.title
});
final String? title;
@override
State<AppLifecycleStateObserverDemo> createState() => _AppLifecycleStateObserverDemoState();
}
class _AppLifecycleStateObserverDemoState extends State<AppLifecycleStateObserverDemo> with
WidgetsBindingObserver,
AppLifecycleObserverMixin {
final _scrollController = ScrollController();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title ?? "$widget"),
actions: ['done',].map((e) => TextButton(
child: Text(e,
style: TextStyle(color: Colors.white),
),
onPressed: () => debugPrint(e),)
).toList(),
),
body: buildBody(),
);
}
buildBody() {
return Scrollbar(
controller: _scrollController,
child: SingleChildScrollView(
controller: _scrollController,
child: Column(
children: [
Text("$widget"),
],
),
),
);
}
/*************** AppLifecycleObserverMixin ***************/
@override
Future<void> onResume() async {
// TODO: implement onResume
DDLog("$widget onResume");
}
@override
Future<void> onInactive() async {
// TODO: implement onInactive
DDLog("$widget onInactive");
}
@override
Future<void> onPause() async {
// TODO: implement onPause
DDLog("$widget onPause");
}
@override
Future<void> onDetached() async {
// TODO: implement onDetached
DDLog("$widget onDetached");
}
}
三、源码
1、AppLifecycleObserver 源码
dart
/// app 前后台生命周期函数监听
class AppLifecycleObserver extends WidgetsBindingObserver{
AppLifecycleObserver({
required this.onResume,
required this.onInactive,
required this.onPause,
required this.onDetached,
this.data,
});
final AsyncCallback onResume;
final AsyncCallback onInactive;
final AsyncCallback onPause;
final AsyncCallback onDetached;
final dynamic data;
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
// DDLog('${Get.currentRoute} APP状态监听:$state, ${data ?? ""}');
switch (state) {
case AppLifecycleState.resumed:
onResume();
break;
case AppLifecycleState.inactive:
onInactive();
break;
case AppLifecycleState.paused:
onPause();
break;
case AppLifecycleState.detached:
onDetached();
break;
}
}
}
2、AppLifecycleObserverMixin 源码
dart
/// app 前后台生命周期函数混入封装
mixin AppLifecycleObserverMixin<T extends StatefulWidget> on State<T>, WidgetsBindingObserver{
late final _lifecycleEvent = AppLifecycleObserver(
onResume: onResume,
onInactive: onInactive,
onPause: onPause,
onDetached: onDetached,
);
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(_lifecycleEvent);
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(_lifecycleEvent);
super.dispose();
}
Future<void> onResume() async {
throw UnimplementedError("❌: $this 未实现 onResume");
}
Future<void> onInactive() async {
throw UnimplementedError("❌: $this 未实现 onInactive");
}
Future<void> onPause() async {
throw UnimplementedError("❌: $this 未实现 onPause");
}
Future<void> onDetached() async {
throw UnimplementedError("❌: $this 未实现 onDetached");
}
}
四、总结
1、使用 AppLifecycleObserverMixin 需要同时遵循 WidgetsBindingObserver
scala
class _AppLifecycleStateObserverDemoState extends State<AppLifecycleStateObserverDemo> with
WidgetsBindingObserver,
AppLifecycleObserverMixin {