代码之家  ›  专栏  ›  技术社区  ›  Kyle Venn

Flutter小工具/通往Android和iOS的路线onResume/viewWillAppear和onPause/viewDidDisappear中是否存在完全等效的生命周期事件?

  •  0
  • Kyle Venn  · 技术社区  · 4 年前

    我以前见过这样的问题,但这些问题总是功能的子集。我在找 准确的 等效生命周期事件。我可以更具体一点。

    据我所知,Flutter小部件中存在的有

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

    以下是我想了解的生命周期事件 当前可见的小部件/路由 ,而不是整个应用程序):

    onResume / viewWillAppear 当
    1. 内部导航(在应用程序内导航)

      a.将路由/小部件推送到堆栈上

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

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

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

      b.你打开屏幕(电源按钮),应用程序已经打开

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

      a.您导航离开小部件/前进路线

      b.您可以通过在堆栈中取消小部件/后退来导航离开它

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

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

    1 回复  |  直到 4 年前
        1
  •  19
  •   Kyle Venn    4 年前

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

    最佳选择

    焦点检测器 (Edson Bueno)

    FocusDetector处理原始问题中涉及的所有案例。您为一个名为 FocusDetector 。两个相关的回调是:

    • onFocusGained = onResume

    • onFocusLost = onPause

    • Cons

      • Isnt由Flutter或Google维护(但它使用 VisibilityDetector 和 WigetBindingObserver 发动机罩下)
      • 默认值 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 (颤振)

    • didPush = on简历 当前屏幕被按下

    • didPopNext = on简历 当前屏幕正在导航回

    • didPop = on暂停 驳回当前页面/返回

    • didPushNext = on暂停 向前导航到新页面

    • 缺点:

      • Doesnt cover use case(2),backgrounding then foregrounding the app

    WidgetsBindingObserver (颤振)

    • AppLifecycleState.resumed =应用程序可见并对用户输入做出响应

    • AppLifecycleState.paused =应用程序不可见,并且不对用户输入做出响应

    • 缺点:

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

    VisibilityDetector (谷歌)

    • onVisibilityChanged (能见度==1)= on简历

    • onVisibilityChanged (可见性==0)= on暂停

    • 缺点:

      • Doesnt cover use case(2),backgrounding then foregrounding the app