手记

【备战春招】第7天 Flutter 中页面和应用的生命周期

课程名称Flutter从入门到进阶 实战携程网App 一网打尽核心技术
课程章节:Flutter入门:基础知识十六讲
课程讲师CrazyCodeBoy

课程内容

Flutter页面的生命周期

Flutter 页面相关的组件包括 StatelessWidget 和 StatefulWidget,StatelessWidget的生命周期只有 createElement() 和build() 两个回调函数。

StatefulWidget 的生命周期有关的回调函数相对丰富一些:

  • createState(),当构建一个新的StatefulWidget时,这个回调函数会立即被调用,并且这个方法必须被覆盖。
  • initState(),这是创建widget时调用的除构造方法外的第一个方法,类似于Android的:onCreate() 与iOS的 viewDidLoad(),在这个方法中通常会做一些初始化工作,比如channel的初始化,监听器的初始化等。
  • didChangeDependencies(),当依赖的State对象改变时会被调用,在第一次构建widget时,在initState()之后立即调用此方法;如果的StatefulWidgets依赖于InheritedWidget,那么当当前State所依赖InheritedWidget中的变量改变时会再次调用它。InheritedWidget可以高效的将数据在Widget树中向下传递、共享。
  • build(),这是一个必须实现的方法,在这里实现你要呈现的页面内容,它会在在didChangeDependencies()之后立即调用,另外当调用setState()后也会再次调用该方法。
  • didUpdateWidget(),这是一个不常用到的生命周期方法,当父组件需要重新绘制时才会调用,该方法会携带一个oldWidget参数,可以将其与当前的widget进行对比以便执行一些额外的逻辑。
  • deactivate(),很少使用,在组件被移除时被调用,会在dispose()之前被调用。
  • dispose(),当组件被销毁时调用,通常在该方法中执行一些资源的释放工作比如,监听器的卸载,channel的销毁等。

Flutter应用的生命周期

上面介绍了 Flutter 页面相关的生命周期,如果想要监听页面退到后台与返回前台,即监听整个应用的生命周期,需要实现WidgetBindingObserver 接口。

  • 在创建 State时可以通过 mixin,实现WidgetBindingObserver接口。
  • 在 instate()时通过WidgetsBinding.instance.addObservwe(this)实现监听;
  • 然后重写接口中的didChanageCurrentState(CurrentState state)方法。
  • 这个方法有一个参数类型为AppLifecycleState的枚举类,可以根据它的状态来处理一些任务。

示例代码

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Flutter应用生命周期'),
        leading:const BackButton(),
      ),
      body: const Text('Flutter应用生命周期'),
    );
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    print('state = $state');
    if (state == AppLifecycleState.paused) {
      print('App进入后台');
    } else if (state == AppLifecycleState.resumed) {
      print('App进去前台');
    } else if (state == AppLifecycleState.inactive) {
      //不常用:应用程序处于非活动状态,并且未接收用户输入时调用,比如:来了个电话
    } else if (state == AppLifecycleState.detached) {
      //不常用:应用程序被挂起是调用,它不会在iOS上触发
    }
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }
}

关于AppLifecycleState状态的说明:

  • resumed:应用可见并可响应用户操作;
  • inactive:用户可见,但不可响应用户操作;
  • paused:已经暂停了,用户不可见、不可操作;
  • suspending:应用被挂起,此状态iOS不会回调。

课程总结

这一节介绍了Flutter中页面的生命周期,和 Flutter 应用的生命周期。可以理解为 Android 中 Activity 和 Application 的生命周期,通过对比快速上手。

0人推荐
随时随地看视频
慕课网APP