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

标签 flutter lifecycle

我以前见过这个问题,但问题始终是功能的子集。我正在寻找 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/

相关文章:

dart - 如何清除 block 中的数据?

flutter - Flutter:SingleChildScrollView无法滚动

android - 在 android 中的 TabHost + fragment 中调用 oncreateView 时出错?

flutter - 为什么我不能在 Flutter 的 Column 中将 SizeTransition 水平居中?

c++ - 如何从另一个线程调用flutter引擎方法

flutter - 如何在Dart/Flutter中将某些元素从一个Map复制到新Map中?

express - 为什么我的 Electron 事件被延迟到渲染过程?

ios - 确定当 iOS 应用程序处于关闭状态时发送 LocalNotification 看到 Beacon 的事件

android - Android 上基于枚举的单例的生命周期

javascript - 功能组件渲染四次 - 为什么不渲染两次呢?