Flutter 确切的生命周期相当于 Android 上的 onResume / onPause 和 iOS 上的 viewWillAppear / viewDidDisappear
Flutter exact lifecycle equivalents to onResume / onPause on Android and viewWillAppear / viewDidDisappear on iOS
我以前见过这个问题,但问题总是功能的子集。我正在寻找 exact 等效的生命周期事件。我可以更具体。
据我所知,Flutter 小部件中存在的是
onCreate
/viewDidLoad
= initState
onDestroy
/viewDidUnload
= dispose
这些是我想了解的生命周期事件(针对 当前可见的 widget/route,而不是整个应用程序):
onResume
/ viewWillAppear
在
时在当前可见的小部件上触发
内部导航(在应用内导航)
一个。您将 route/widget 压入堆栈
b。您导航回 route/widget(已经在导航堆栈的后面)
外部导航(应用程序的背景和前景)
一个。您从后台打开应用程序(route/widget 是向用户显示的应用程序)
b。您打开屏幕(电源按钮)并且应用程序已经打开
onPause
/ viewDidDisappear
被解雇 在当前可见的小部件上 当
内部导航(在应用内导航)
一个。您离开 widget/route 前进
b。您可以通过关闭小部件/在堆栈中向后移动来离开小部件
外部导航(应用程序的背景和前景)
一个。您将应用置于后台(route/widget 是显示给用户的应用)
b.您在打开应用程序的情况下关闭屏幕(电源按钮)
我找到了一些解决方案,每个都有自己的优缺点。最能回答这个问题的是 FocusDetector.
最佳选择
FocusDetector(埃德森布埃诺)
FocusDetector 处理原始问题中涵盖的所有情况。您可以向名为 FocusDetector
的包装小部件提供回调函数,而不是覆盖(如 initState() 和 dispose())。两个相关的回调是:
onFocusGained
= onResume
onFocusLost
= onPause
缺点
- 不由 Flutter 或 Google 维护(但它在后台使用
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'),
);
}
}
其他选项
RouteObserver(颤振)
didPush
= onResume
当前屏幕被推送
didPopNext
= onResume
当前屏幕正在导航回
didPop
= onPause
关闭当前页面/返回
didPushNext
= onPause
前进到新页面
缺点:
- 不涵盖 use-case (2),先后台再前台应用
WidgetsBindingObserver(颤振)
AppLifecycleState.resumed
= 该应用可见并响应用户输入
AppLifecycleState.paused
= 该应用不可见且不响应用户输入
缺点:
- 不是widget/route具体(对于外部导航 (2))
- 不涵盖use-case (1),在页面之间导航
VisibilityDetector (Google)
onVisibilityChanged
(可见度 == 1)= onResume
onVisibilityChanged
(可见性 == 0)= onPause
缺点:
- 不涵盖 use-case (2),先后台再前台应用
我以前见过这个问题,但问题总是功能的子集。我正在寻找 exact 等效的生命周期事件。我可以更具体。
据我所知,Flutter 小部件中存在的是
onCreate
/viewDidLoad
=initState
onDestroy
/viewDidUnload
=dispose
这些是我想了解的生命周期事件(针对 当前可见的 widget/route,而不是整个应用程序):
onResume
/ viewWillAppear
在
时在当前可见的小部件上触发
内部导航(在应用内导航)
一个。您将 route/widget 压入堆栈
b。您导航回 route/widget(已经在导航堆栈的后面)
外部导航(应用程序的背景和前景)
一个。您从后台打开应用程序(route/widget 是向用户显示的应用程序)
b。您打开屏幕(电源按钮)并且应用程序已经打开
onPause
/ viewDidDisappear
被解雇 在当前可见的小部件上 当
内部导航(在应用内导航)
一个。您离开 widget/route 前进
b。您可以通过关闭小部件/在堆栈中向后移动来离开小部件
外部导航(应用程序的背景和前景)
一个。您将应用置于后台(route/widget 是显示给用户的应用) b.您在打开应用程序的情况下关闭屏幕(电源按钮)
我找到了一些解决方案,每个都有自己的优缺点。最能回答这个问题的是 FocusDetector.
最佳选择
FocusDetector(埃德森布埃诺)
FocusDetector 处理原始问题中涵盖的所有情况。您可以向名为 FocusDetector
的包装小部件提供回调函数,而不是覆盖(如 initState() 和 dispose())。两个相关的回调是:
onFocusGained
=onResume
onFocusLost
=onPause
缺点
- 不由 Flutter 或 Google 维护(但它在后台使用
VisibilityDetector
和WigetBindingObserver
) - 默认
VisibilityDetectorController.updateInterval
是 500 毫秒,这意味着事件触发的时间有点晚。
- 不由 Flutter 或 Google 维护(但它在后台使用
借用我的一位
示例小部件
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(颤振)
didPush
=onResume
当前屏幕被推送didPopNext
=onResume
当前屏幕正在导航回didPop
=onPause
关闭当前页面/返回didPushNext
=onPause
前进到新页面缺点:
- 不涵盖 use-case (2),先后台再前台应用
WidgetsBindingObserver(颤振)
AppLifecycleState.resumed
= 该应用可见并响应用户输入AppLifecycleState.paused
= 该应用不可见且不响应用户输入缺点:
- 不是widget/route具体(对于外部导航 (2))
- 不涵盖use-case (1),在页面之间导航
VisibilityDetector (Google)
onVisibilityChanged
(可见度 == 1)=onResume
onVisibilityChanged
(可见性 == 0)=onPause
缺点:
- 不涵盖 use-case (2),先后台再前台应用