根据flutter AppLifecycleState文档:
已恢复→应用程序可见并响应用户输入
但是似乎没有检测到应用程序打开。
我已经在
AppLifecycleState
中实现了main.dart
:
SystemChannels.lifecycle.setMessageHandler((msg) {
switch (msg) {
case 'AppLifecycleState.paused':
{
function...
}
break;
case 'AppLifecycleState.resumed':
{
function...
}
break;
}
return Future.value();
});
如何在 Flutter 中检查应用程序是否进入前台(根据简历和应用程序打开情况)?
class LifeCycleManager extends StatefulWidget {
final Widget child;
LifeCycleManager({required this.child});
_LifeCycleManagerState createState() => _LifeCycleManagerState();
}
class _LifeCycleManagerState extends State<LifeCycleManager>
with WidgetsBindingObserver {
@override
void initState() {
WidgetsBinding.instance!.addObserver(this);
super.initState();
}
@override
void dispose() {
WidgetsBinding.instance!.removeObserver(this);
super.dispose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) async {
super.didChangeAppLifecycleState(state);
if (state == AppLifecycleState.detached) {
} else if (state == AppLifecycleState.inactive) {
}
}
@override
Widget build(BuildContext context) {
return Container(
child: widget.child,
);
}
使用生命周期管理器小部件包装您的主材料应用程序,在生命周期管理器中,您可以根据您的要求设置条件并执行。具体任务据此
我不知道为什么内置的生命周期管理不提供应用程序打开事件,但我们就是这样做的。
我们定义自己的枚举来复制
AppLifecycleState
,我们添加 opened
:
/// see [AppLifecycleState] but added [opened]
enum AppState {
opened, // <--
resumed,
paused,
inactive,
detached,
}
然后我们定义一个小部件,使用
initialState
来触发 opened
事件并使用 WidgetsBindingObserver
混合来检测其他变化。
class AppLifecycleTracker extends StatefulWidget {
final Widget child;
final void Function(AppState state) didChangeAppState;
const AppLifecycleTracker({
Key? key,
required this.didChangeAppState,
required this.child,
}) : super(key: key);
@override
State<AppLifecycleTracker> createState() => _AppLifecycleTrackerState();
}
class _AppLifecycleTrackerState extends State<AppLifecycleTracker>
with WidgetsBindingObserver {
@override
void initState() {
super.initState();
widget.didChangeAppState(AppState.opened);
WidgetsBinding.instance.addObserver(this);
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
AppState s;
switch (state) {
case AppLifecycleState.resumed:
s = AppState.resumed;
break;
case AppLifecycleState.inactive:
s = AppState.inactive;
break;
case AppLifecycleState.paused:
s = AppState.paused;
break;
case AppLifecycleState.detached:
s = AppState.detached;
break;
}
widget.didChangeAppState(state);
}
@override
Widget build(BuildContext context) {
return widget.child;
}
}
然后一定要把它添加到 widget 树的最顶部,以防止它被重新渲染(否则会再次触发
opened
事件:
runApp(
AppLifecycleTracker(
didChangeAppState: (state) => log(state.name),
child: ...,
)
);
您还可以在需要时初始化和处置侦听器 用这个
class AppLifecyclePage extends StatefulWidget {
const AppLifecyclePage({super.key});
@override
State<AppLifecyclePage> createState() => _AppLifecyclePageState();
}
class _AppLifecyclePageState extends State<AppLifecyclePage> {
late final AppLifecycleListener _listener;
@override
void initState() {
super.initState();
// Pass all the callbacks for the transitions you want to listen to
_listener = AppLifecycleListener(
onDetach: _onDetach,
onHide: _onHide,
onInactive: _onInactive,
onPause: _onPause,
onRestart: _onRestart,
onResume: _onResume,
onShow: _onShow,
onStateChange: _onStateChanged,
);
}
@override
void dispose() {
_listener.dispose();
super.dispose();
}
void _onDetach() => print('onDetach');
void _onHide() => print('onHide');
void _onInactive() => print('onInactive');
void _onPause() => print('onPause');
void _onRestart() => print('onRestart');
void _onResume() => print('onResume');
void _onShow() => print('onShow');
void _onStateChanged(AppLifecycleState state) {
// Track state changes
}
@override
Widget build(BuildContext context) {
return const Scaffold(
body: Placeholder(),
);
}
}
欲了解更多信息,请查看 https://kazlauskas.dev/blog/flutter-app-lifecycle-listener-overview/