flutter生命周期

426 阅读2分钟

无状态组件

默认执行构造函数,构建组件执行build函数,除此之外,没有其他生命周期函数

有状态组件

  1. 有状态组件本身除了构造函数和createState之外,没有其他生命周期函数

0.1 有状态组件的生命周期都体现在他的状态类中,以下是有状态组件状态类的生命周期

未注册WidgetsBindingObserver观察者时的生命周期

初次打开

  1. 构造方法
  2. initState方法

手机手动转到其他应用

未触发任何生命周期函数

手机手动恢复到前台运行

未触发任何生命周期函数

手机通过手势后退

  1. deactivate方法
  2. dispose方法

再次打开

  1. 构造方法
  2. initState方法

通过setState更新界面

未触发任何生命周期函数

开发模式热 r 更新

未触发任何方法

开发模式热 R 更新

未触发任何方法

注册成WidgetsBindingObserver观察者后,的生命周期

注册成WidgetsBindingObserver观察者方式

四步:

  1. 状态类 组合 WidgetsBindingObserver
  2. initState方法中,将自身注册为观察者WidgetsBinding.instance.addObserver(this)
  3. 覆写void didChangeAppLifecycleState(AppLifecycleState state)方法实现app的生命周期监听
  4. 覆写void dispose()方法,移除监听
class _DemoWidgetState extends State<BarcodeCamera>
    with WidgetsBindingObserver {
    
  @override
  void initState() {
    // 将本身添加为观察者
    WidgetsBinding.instance.addObserver(this);
    super.initState();
  }
  
  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }
}

初次打开

  1. 构造方法
  2. initState方法

手机手动转到其他应用

void didChangeAppLifecycleState(AppLifecycleState state)

AppLifecycleState.inactive
AppLifecycleState.hidden
AppLifecycleState.paused

可能会多次触发didChangeAppLifecycleState方法,但最后一次的state一定是AppLifecycleState.resumed

手机手动恢复到前台运行

void didChangeAppLifecycleState(AppLifecycleState state)

AppLifecycleState.hidden
AppLifecycleState.inactive
AppLifecycleState.resumed

可能会多次触发didChangeAppLifecycleState方法,但最后一次的state一定是AppLifecycleState.resumed

手机通过手势后退

  1. deactivate方法
  2. dispose方法

再次打开

  1. 构造方法
  2. initState方法

通过setState更新界面

未触发任何生命周期函数

开发模式热 r 更新

未触发任何方法

开发模式热 R 更新

未触发任何方法

enum AppLifecycleState {
    // App 可能还存有 Flutter Engine ,但是视图并不存在
    detached,
    // 表示 App 处于具有输入焦点且可见的正在运行的状态。
    resumed,
    // App 至少一个视图是可见的,但没有一个视图具 Focus
    inactive,
    // App 的所有视图都被隐藏。
    hidden,
    // App 当前对用户不可见,并且不响应用户行为。
    paused
}

参考资料

Flutter 小技巧之 3.13 全新生命周期 AppLifecycleListener

Flutter中应用前后台切换监听-WidgetsBindingObserver - 掘金 (juejin.cn)