Flutter 的确切生命周期相当于 Android 上的 onResume / onPause 和 iOS 上的 viewWillAppear / viewDidDisappear

Kyl*_*enn 8 lifecycle android ios flutter

我以前见过这个问题,但问题总是功能的子集。我正在寻找完全相同的生命周期事件。我可以说得更具体。

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

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

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

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

    A。您将路线/小部件推入堆栈

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

  2. 外部导航(应用程序的后台和前台)

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

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

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

    A。您离开小部件/路线继续前进

    b. 您可以通过关闭小部件/在堆栈中向后浏览来离开该小部件

  2. 外部导航(应用程序的后台和前台)

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

Kyl*_*enn 23

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

\n

最佳选择

\n

FocusDetector (Edson Bueno)

\n

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

\n
    \n
  • onFocusGained=onResume

    \n
  • \n
  • onFocusLost=onPause

    \n
  • \n
  • 缺点

    \n
      \n
    • \xe2\x80\x99t 由 Flutter 或 Google 维护(但它在幕后VisibilityDetector使用)WigetBindingObserver
    • \n
    • 默认VisibilityDetectorController.updateInterval值为 500 毫秒,这意味着事件触发会稍晚一些。
    • \n
    \n
  • \n
\n

借用我最喜欢的一篇文章的风格:

\n

iOS、Android 和 Flutter 生命周期

\n

示例小部件

\n
class PageState extends State<Page> {\n\n  @override\n  void initState() {\n    super.initState();\n    log("onCreate / viewDidLoad / initState");\n    WidgetsBinding.instance?.addPostFrameCallback((timeStamp) {\n      layoutComplete();\n    });\n  }\n\n  // Bonus one I\'ve found helpful, once layout is finished\n  void layoutComplete() {\n    log("onActivityCreated / viewDidLoad / layoutComplete");\n  }\n\n  void viewWillAppear() {\n    log("onResume / viewWillAppear / onFocusGained");\n  }\n\n  void viewWillDisappear() {\n    log("onPause / viewWillDisappear / onFocusLost");\n  }\n\n  @override\n  void dispose() {\n    log("onDestroy / viewDidUnload / dispose");\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return FocusDetector(\n      onFocusGained: viewWillAppear,\n      onFocusLost: viewWillDisappear,\n      child: Text(\'Rest of my widget\'),\n      );\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n

其他选项

\n

路由观察者(颤振)

\n
    \n
  • didPush=onResume当前屏幕被推开

    \n
  • \n
  • didPopNext=onResume当前屏幕正在导航回

    \n
  • \n
  • didPop=onPause关闭当前页面/返回

    \n
  • \n
  • didPushNext=onPause向前导航到新页面

    \n
  • \n
  • 缺点:

    \n
      \n
    • \xe2\x80\x99t 不涵盖用例 (2),后台然后前台应用程序
    • \n
    \n
  • \n
\n

WidgetsBindingObserver(Flutter)

\n
    \n
  • AppLifecycleState.resumed= 应用程序可见并响应用户输入

    \n
  • \n
  • AppLifecycleState.paused= 应用程序不可见并且不响应用户输入

    \n
  • \n
  • 缺点:

    \n
      \n
    • 是否\xe2\x80\x99t 小部件/路线特定(用于外部导航 (2))
    • \n
    • \xe2\x80\x99t 不涵盖用例 (1),在页面之间导航
    • \n
    \n
  • \n
\n

可见性检测器(谷歌)

\n
    \n
  • onVisibilityChanged(能见度==1)=onResume

    \n
  • \n
  • onVisibilityChanged(能见度== 0)=onPause

    \n
  • \n
  • 缺点:

    \n
      \n
    • \xe2\x80\x99t 不涵盖用例 (2),后台然后前台应用程序
    • \n
    \n
  • \n
\n

  • 这个“FocusDetector”是一个很好的解决方案,可怕的是这些方法不是框架的一部分。我什至想知道如果没有这些,人们如何开发应用程序。 (2认同)