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

问题描述 投票:0回答:1

我以前见过这个问题,但问题总是功能的子集。我正在寻找精确等效的生命周期事件。我可以更具体。

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

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

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

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

    a.您将路线/小部件推入堆栈

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

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

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

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

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

    a.您离开小部件/路线继续前进

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

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

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

android ios flutter lifecycle
1个回答
19
投票

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

最佳选择

焦点探测器(Edson Bueno)

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'), ); } }


其他选项

路线观察者(颤动)

  • didPush

     = 
    onResume
     当前屏幕已推开

  • didPopNext

     = 
    onResume
     当前屏幕正在导航回

  • didPop

     = 
    onPause
     关闭当前页面/返回

  • didPushNext

     = 
    onPause
     前进至新页面

  • 缺点:

      不涵盖用例 (2),后台然后前台应用程序

WidgetsBindingObserver(颤动)

  • AppLifecycleState.resumed

     = 应用程序可见并响应用户输入

  • AppLifecycleState.paused

     = 应用程序不可见且不响应用户输入

  • 缺点:

      小部件/路线不是特定的(对于外部导航 (2))
    • 不涵盖用例 (1),在页面之间导航

可见性探测器(谷歌)

  • onVisibilityChanged

    (可见度 == 1)= 
    onResume
    
    

  • onVisibilityChanged

    (可见度== 0)= 
    onPause
    
    

  • 缺点:

      不涵盖用例 (2),后台然后前台应用程序
© www.soinside.com 2019 - 2024. All rights reserved.