我以前见过这个问题,但问题始终是功能的子集。我正在寻找 exact 等效的生命周期事件。我可以说得更具体一些。
我知道 Flutter 小部件中存在的那些是
onCreate
/viewDidLoad
=initState
onDestroy
/viewDidUnload
=dispose
这些是我想了解的生命周期事件(对于当前可见的小部件/路线,而不是整个应用程序):
onResume
/viewWillAppear
在当前可见的小部件上触发
内部导航(在应用内导航)
一个。您将路由/小部件插入堆栈
b.您导航回路线/小部件(已经在导航堆栈的背面)
外部导航(应用程序的背景和前景)
一个。您从后台打开应用程序(路线/小部件是向用户显示的)
b.您打开屏幕(电源按钮)并且应用程序已经打开
onPause
/viewDidDisappear
被触发在当前可见的小部件上 当
内部导航(在应用内导航)
一个。您从一个小部件/路线向前导航
b.您可以通过关闭它/在堆栈中后退来离开小部件
外部导航(应用程序的背景和前景)
一个。您将应用程序置于后台(并且路线/小部件是向用户显示的) 湾。在应用打开的情况下关闭屏幕(电源按钮)
最佳答案
我找到了一些解决方案,每个都有自己的优缺点。最能回答这个问题的是FocusDetector .
最佳选择
FocusDetector (埃德森布埃诺)
FocusDetector 处理原始问题中涵盖的所有情况。您可以向名为 FocusDetector
的包装小部件提供回调函数,而不是覆盖(如 initState() 和 dispose())。两个相关的回调是:
onFocusGained
=onResume
onFocusLost
=onPause
缺点
- 不由 Flutter 或 Google 维护(但它在底层使用
VisibilityDetector
和WigetBindingObserver
) - 默认的
VisibilityDetectorController.updateInterval
是 500 毫秒,这意味着事件触发有点晚。
- 不由 Flutter 或 Google 维护(但它在底层使用
从我的一个 favorite posts 中借用样式:
小部件示例
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'),
);
}
}
其他选项
RouteObserver ( flutter )
didPush
=onResume
当前屏幕被推送didPopNext
=onResume
正在导航回当前屏幕didPop
=onPause
关闭当前页面/返回didPushNext
=onPause
向前导航到新页面缺点:
- 不包括用例 (2),后台然后前台应用程序
WidgetsBindingObserver ( flutter )
AppLifecycleState.resumed
= 应用可见并响应用户输入AppLifecycleState.paused
= 应用不可见且不响应用户输入缺点:
- 不是特定于小部件/路线的(用于外部导航 (2))
- 不包括用例 (1),在页面之间导航
VisibilityDetector (谷歌)
onVisibilityChanged
(visibility == 1) =onResume
onVisibilityChanged
(visibility == 0) =onPause
缺点:
- 不包括用例 (2),后台然后前台应用程序
关于Flutter 精确的生命周期等同于 Android 上的 onResume/onPause 和 iOS 上的 viewWillAppear/viewDidDisappear,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71279847/