gpt4 book ai didi

Flutter 精确的生命周期等同于 Android 上的 onResume/onPause 和 iOS 上的 viewWillAppear/viewDidDisappear

转载 作者:行者123 更新时间:2023-12-05 01:04:52 25 4
gpt4 key购买 nike

我以前见过这个问题,但问题始终是功能的子集。我正在寻找 exact 等效的生命周期事件。我可以说得更具体一些。

我知道 Flutter 小部件中存在的那些是

  • onCreate/viewDidLoad = initState
  • onDestroy/viewDidUnload = dispose

这些是我想了解的生命周期事件(对于当前可见的小部件/路线,而不是整个应用程序):

onResume/viewWillAppear 在当前可见的小部件上触发
  1. 内部导航(在应用内导航)

    一个。您将路由/小部件插入堆栈

    b.您导航回路线/小部件(已经在导航堆栈的背面)

  2. 外部导航(应用程序的背景和前景)

    一个。您从后台打开应用程序(路线/小部件是向用户显示的)

    b.您打开屏幕(电源按钮)并且应用程序已经打开

onPause/viewDidDisappear 被触发在当前可见的小部件上
  1. 内部导航(在应用内导航)

    一个。您从一个小部件/路线向前导航

    b.您可以通过关闭它/在堆栈中后退来离开小部件

  2. 外部导航(应用程序的背景和前景)

    一个。您将应用程序置于后台(并且路线/小部件是向用户显示的)湾。在应用打开的情况下关闭屏幕(电源按钮)

最佳答案

我找到了一些解决方案,每个都有自己的优缺点。最能回答这个问题的是FocusDetector .

最佳选择

FocusDetector (埃德森布埃诺)

FocusDetector 处理原始问题中涵盖的所有情况。您可以向名为 FocusDetector 的包装小部件提供回调函数,而不是覆盖(如 initState() 和 dispose())。两个相关的回调是:

  • onFocusGained = onResume

  • onFocusLost = onPause

  • 缺点

    • 不由 Flutter 或 Google 维护(但它在底层使用 VisibilityDetectorWigetBindingObserver)
    • 默认的 VisibilityDetectorController.updateInterval 是 500 毫秒,这意味着事件触发有点晚。

从我的一个 favorite posts 中借用样式:

iOS, Android, and Flutter Life Cycle

小部件示例

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com