我以前见过这个问题,但问题总是功能的子集。我正在寻找精确等效的生命周期事件。我可以更具体。
我知道 Flutter 小部件中存在的是
onCreate
/viewDidLoad
=initState
onDestroy
/viewDidUnload
=dispose
这些是我想了解的生命周期事件(对于当前可见的小部件/路线,而不是整个应用程序):
onResume
/ viewWillAppear
当内部导航(在应用程序内导航)
a.您将路线/小部件推入堆栈
b.您导航回路线/小部件(已经位于导航堆栈的背面)
外部导航(应用程序的后台和前台)
a.您从后台打开应用程序(路线/小部件是向用户显示的)
b.您打开屏幕(电源按钮)并且应用程序已经打开
onPause
/ viewDidDisappear
在当前可见的小部件上被解雇内部导航(在应用程序内导航)
a.您离开小部件/路线继续前进
b.您可以通过关闭小部件/在堆栈中向后移动来离开该小部件
外部导航(应用程序的后台和前台)
a.您将应用程序置于后台(路线/小部件是向用户显示的) b.您在应用程序打开的情况下关闭屏幕(电源按钮)
我找到了一些解决方案,每个解决方案都有自己的优点和缺点。最好回答这个问题的是FocusDetector。
FocusDetector 处理原始问题中涵盖的所有情况。您可以向名为
FocusDetector
的包装小部件提供回调函数,而不是重写(如 initState() 和 dispose())。两个相关的回调是:
onFocusGained
=onResume
onFocusLost
=onPause
缺点
VisibilityDetector
和 WigetBindingObserver
)VisibilityDetectorController.updateInterval
是500毫秒,这意味着事件被触发得有点晚。借用我最喜欢的一篇文章的风格:
示例小部件class PageState extends State<Page> {
@override
void initState() {
super.initState();
log("onCreate / viewDidLoad / initState");
WidgetsBinding.instance?.addPostFrameCallback((timeStamp) {
layoutComplete();
});
}
// Bonus one I've found helpful, once layout is finished
void layoutComplete() {
log("onActivityCreated / viewDidLoad / layoutComplete");
}
void viewWillAppear() {
log("onResume / viewWillAppear / onFocusGained");
}
void viewWillDisappear() {
log("onPause / viewWillDisappear / onFocusLost");
}
@override
void dispose() {
log("onDestroy / viewDidUnload / dispose");
super.dispose();
}
@override
Widget build(BuildContext context) {
return FocusDetector(
onFocusGained: viewWillAppear,
onFocusLost: viewWillDisappear,
child: Text('Rest of my widget'),
);
}
}
didPush
=
onResume
当前屏幕已推开
didPopNext
=
onResume
当前屏幕正在导航回
didPop
=
onPause
关闭当前页面/返回
didPushNext
=
onPause
前进至新页面
AppLifecycleState.resumed
= 应用程序可见并响应用户输入
AppLifecycleState.paused
= 应用程序不可见且不响应用户输入
onVisibilityChanged
(可见度 == 1)=
onResume
onVisibilityChanged
(可见度== 0)=
onPause