JoJo的个人博客

记录精彩的程序人生

目录
Flutter生命周期
/  

Flutter生命周期

组件生命周期

Flutter Widget的生命周期重点讲解StatefulWidget的生命周期 因为无状态的widget StatelessWidget只有createElement、与build两个生命周期方法 StatefulWidget的生命周期方法按照时期不同可以分为三组:

  1. 初始化时期 createStateinitState
  2. 更新期间 didChangeDependenciesbuilddidUpdateWidget
  3. 销毁期 deactivatedispose

createState

当我们构建一个新的StatefulWidget时,这个会立即调用 并且这个方法必须被覆盖

initState

这是创建widget时调用的除构造方法外的第一个方法: 类似于Android的:onCreate()iOSviewDidLoad() 在这个方法中通常会做一些初始化工作,比如channel的初始化,监听器的初始化等

didChangeDependencies

当依赖的State对象改变时会调用: a. 在第一次构建widget时,在initState()之后立即调用此方法; b. 如果的StatefulWidgets依赖于InheritedWidget,那么当当前State所依赖InheritedWidget中的变量改变时会再次调用它 拓展:InheritedWidget可以高效的将数据在Widget树中向下传递、共享,可参考:https://book.flutterchina.club/chapter7/inherited_widget.html

didUpdateWidget

这是一个不常用到的生命周期方法,当父组件需要重新绘制时才会调用; 该方法会携带一个oldWidget参数,可以将其与当前的widget进行对比以便执行一些额外的逻辑,如: if (oldWidget.xxx != widget.xxx)...

dispose

常用,组件被销毁时调用: 通常在该方法中执行一些资源的释放工作比如,监听器的卸载,channel的销毁等

应用生命周期

WidgetsBindingObserver:是一个Widgets绑定观察器,通过它我们可以监听应用的生命周期、语言等的变化

class AppLifecycle extends StatefulWidget {
  @override
  _AppLifecycleState createState() => _AppLifecycleState();
}

class _AppLifecycleState extends State<AppLifecycle>
    with WidgetsBindingObserver {
  @override
  void initState() {
    WidgetsBinding.instance.addObserver(this);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter应用生命周期'),
        leading: BackButton(),
      ),
      body: Container(
        child: 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();
  }
}


标题:Flutter生命周期
作者:SunnySky
地址:https://www.tianyang.pub/articles/2020/06/22/1592818232624.html

评论