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

Flutter exact lifecycle equivalents to onResume / onPause on Android and viewWillAppear / viewDidDisappear on iOS

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

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

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

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

    一个。您将 route/widget 压入堆栈

    b。您导航回 route/widget(已经在导航堆栈的后面)

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

    一个。您从后台打开应用程序(route/widget 是向用户显示的应用程序)

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

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

    一个。您离开 widget/route 前进

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

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

    一个。您将应用置于后台(route/widget 是显示给用户的应用) b.您在打开应用程序的情况下关闭屏幕(电源按钮)

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

最佳选择

FocusDetector(埃德森布埃诺)

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

  • onFocusGained = onResume

  • onFocusLost = onPause

  • 缺点

    • 不由 Flutter 或 Google 维护(但它在后台使用 VisibilityDetectorWigetBindingObserver
    • 默认 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),先后台再前台应用