生命周期是一个从创建到销毁的过程,Flutter生命周期分为两部分:

1.Widget的生命周期

2.APP的生命周期

我们先看Widget的生命周期

一、Widget的生命周期

1.StatelessWidget
对于StatelessWidget来说,生命周期只有build过程。build是用来创建Widget的,在每次页面刷新时会调用build。

2.StatefulWidget
StatefulWidget的生命周期依次为:

initState:当Widget第一次插入到Widget树时会被调用,对于每一个State对象,这个方法只会调用一次。所以,通常在该回调中做一些一次性的操作,如一些初始化操作。(注意:不能在该回调中调用BuildContext.inheritFromWidgetOfExactType(该方法用于在Widget树上获取离当前widget最近的一个父级InheritFromWidget),原因是在初始化完成后,Widget树中的InheritFromWidget也可能会发生变化,所以正确的做法应该在在build()方法或didChangeDependencies()中调用它。)

didChangeDependencies():当State对象的依赖发生变化时会被调用;

这个方法在两种情况下会调用:
情况一:调用initState会调用;
情况二:从其他对象中依赖一些数据发生改变时,比如前面我们提到的InheritedWidget;

build:它主要是用于构建Widget子树

reassemble:此回调是专门为了开发调试而提供的,在热重载(hot reload)时会被调用,此回调在Release模式下永远不会被调用。

didUpdateWidget:在widget重新构建时,Flutter framework会调用Widget.canUpdate来检测Widget树中同一位置的新旧节点,然后决定是否需要更新,如果Widget.canUpdate返回true则会调用此回调。正如之前所述,Widget.canUpdate会在新旧widget的key和runtimeType同时相等时会返回true,也就是说在在新旧widget的key和runtimeType同时相等时didUpdateWidget()就会被调用。

deactivate:当State对象从树中被移除时,会调用此回调。在一些场景下,Flutter framework会将State对象重新插到树中,如包含此State对象的子树在树的一个位置移动到另一个位置时(可以通过GlobalKey来实现)。如果移除后没有重新插入到树中则紧接着会调用dispose()方法。

dispose:当State对象从树中被永久移除时调用;通常在此回调中释放资源。

生命周期图如下

示例如下

class Life extends StatefulWidget {@override_TestLifeState createState() => _TestLifeState();
}class _TestLifeState extends State<Life>  with WidgetsBindingObserver {String title = "点击父组件";@overridevoid initState() {// TODO: implement initStatesuper.initState();print('page1--initState');WidgetsBinding.instance.addObserver(this);}@overridevoid didChangeAppLifecycleState(AppLifecycleState state) {print(state.toString());}@overridevoid didChangeDependencies() {print('test-page1--didChangeDependencies');super.didChangeDependencies();}@overridevoid didUpdateWidget(Life oldWidget) {print('test-page1--didUpdateWidget');super.didUpdateWidget(oldWidget);}@overrideWidget build(BuildContext context) {print('test-page1--build');return Scaffold(appBar: AppBar(// Here we take the value from the MyHomePage object that was created by// the App.build method, and use it to set our appbar title.title: Text("生命周期示例"),),body: Column(children: <Widget>[GestureDetector(child: new Text(title ?? ""),onTap: () {setState(() {title = "父组件变化了";});},),Container(width: 100,height: 50,child: Column (children: [],),),ChildStatefulWidget(),FlatButton(color: Colors.grey,onPressed: () {Navigator.of(context).push(new MaterialPageRoute(builder: (BuildContext c) {return new TestLifeCyclePage2();}));},child: Text("跳转页面")),],),);}@overridevoid reassemble() {// TODO: implement reassemblesuper.reassemble();print('test-page1--reassemble');}@overridevoid deactivate() {// TODO: implement deactivatesuper.deactivate();print('test-page1--deactivate');}@overridevoid dispose() {// TODO: implement disposesuper.dispose();//WidgetsBinding.instance.addObserver(this);print('test-page1--dispose');}
}
class ChildStatefulWidget extends StatefulWidget {@override_ChildStatefulWidgetState createState() {print("child--createState");return _ChildStatefulWidgetState();}
}class _ChildStatefulWidgetState extends State<ChildStatefulWidget> {String title = "点击子组件";@overrideWidget build(BuildContext context) {print('child--build');return GestureDetector(child: new Text(title ?? ""),onTap: () {setState(() {title = "子组件变化了";});},);}@overridevoid initState() {print('child--initState');super.initState();}@overridevoid didChangeDependencies() {print('child--didChangeDependencies');super.didChangeDependencies();}@overridevoid didUpdateWidget(ChildStatefulWidget oldWidget) {print('child--didUpdateWidget');super.didUpdateWidget(oldWidget);}@overridevoid reassemble() {print('child--reassemble');super.reassemble();}@overridevoid deactivate() {print('child--deactivate');super.deactivate();}@overridevoid dispose() {print('child--dispose');super.dispose();//WidgetsBinding.instance.addObserver(this);}
}
class TestLifeCyclePage2 extends StatefulWidget {@override_Test2LifeCyclePageState createState(){return new _Test2LifeCyclePageState();}@overrideStatefulElement createElement() {// TODO: implement createElement
//    print("page2--createElement");return super.createElement();}
}class _Test2LifeCyclePageState extends State<TestLifeCyclePage2> with WidgetsBindingObserver {@overridevoid initState() {// TODO: implement initStatesuper.initState();print('test-page2---initState');WidgetsBinding.instance.addObserver(this);}@overridevoid didChangeAppLifecycleState(AppLifecycleState state) {print(state.toString());}@overridevoid didChangeDependencies() {// TODO: implement didChangeDependenciessuper.didChangeDependencies();print('test-page2---didChangeDependencies');}@overridevoid didUpdateWidget(TestLifeCyclePage2 oldWidget) {// TODO: implement didUpdateWidgetsuper.didUpdateWidget(oldWidget);print('test-page2---didUpdateWidget');}@overrideWidget build(BuildContext context) {print('page2---build');// TODO: implement buildreturn Scaffold(appBar: AppBar(// Here we take the value from the MyHomePage object that was created by// the App.build method, and use it to set our appbar title.title: Text("生命周期示例2"),),);}@overridevoid reassemble() {// TODO: implement reassemblesuper.reassemble();print('test-page2---reassemble');}@overridevoid deactivate() {// TODO: implement deactivatesuper.deactivate();print('test-page2---deactivate');}@overridevoid dispose() {// TODO: implement disposesuper.dispose();//WidgetsBinding.instance.addObserver(this);print('test-page2---dispose');}
}

进入page1 生命周期

点击父组件setState的生命周期

点击子组件的生命周期

进入page2 的生命周期

退出page2 的生命周期

点击热重载按钮的生命周期

二、 App的生命周期

App的生命周期需要通过WidgetsBindingObserver的didChangeAppLifecycleState来获取,在initState中添加监听WidgetsBinding.instance.addObserver(this);

resumed:可见并能响应用户的输入
inactive:处在并不活动状态,无法处理用户响应
paused:不可见并不能响应用户的输入,但是在后台继续活动

app从前台退到后台的生命周期

app 从后台回到前台的生命周期

退出app的生命周期

Flutter的生命周期相关推荐

  1. 【Flutter】Flutter 页面生命周期 ( 初始化期 | createState | initState | 更新期 | build | 销毁期 | dispose)

    文章目录 一.Flutter 页面生命周期 1.StatelessWidget 组件生命周期函数 2.StatefulWidget 组件生命周期函数 二.StatefulWidget 组件生命周期 1 ...

  2. 【Flutter】Flutter 应用生命周期 ( 前台状态 resumed | 后台状态 paused | 非活动状态 inactive | 组件分离状态 detached )

    文章目录 一.Flutter 应用生命周期 二.监听 Flutter 应用生命周期 三.完整代码示例 四.相关资源 一.Flutter 应用生命周期 应用生命周期 : resumed : 应用进入前台 ...

  3. 详解 Flutter State 生命周期

    一.说明 我们在开发 Android 或 iOS 中经常会用到页面的生命周期. Android Activity 生命周期: onCreate onStart onResume onPause onS ...

  4. Flutter 的生命周期,略知一二

    1. 前言 生命周期是一个组件加载到卸载的整个周期,熟悉生命周期可以让我们在合适的时机做该做的事情,例如:APP 正在播放视频,当 APP 被切换到后台,则这个时候最好是暂停视频. Flutter 的 ...

  5. Flutter State生命周期 Flutter Widget生命周期 Flutter 应用程序生命周期

    题记:不到最后时刻,千万别轻言放弃,无论结局成功与否,只要你拼博过,尽力过,一切问心无愧 在 Flutter应用程序中,生命周期涉及两个,一个是 Widget 的生命周期,一个是应用程序的生命周期,本 ...

  6. Flutter -- Element生命周期

    Widget其实是Element的配置项,Flutter中真正代表屏幕上显示元素的类是Element . Tips:Element本身并不处理laying out, painting, 和hit te ...

  7. flutter中的生命周期

    前言 和其他的视图框架比如android的Activity一样,flutter中的视图Widget也存在生命周期,生命周期的回调函数提现在了State上面.理解flutter的生命周期,对我们写出一个 ...

  8. Flutter State 的生命周期

    本文主要介绍类比 Android 和 iOS,了解 Flutter State 的生命周期. 从 Android 或 iOS 转到 Flutter 开发,最让人疑惑的是 Flutter 如何处理生命周 ...

  9. Flutter漫说:组件生命周期、State状态管理及局部重绘的实现(Inherit)

    目录 生命周期 State改变时组件如何刷新 InheritedWidget InheritedModel InheritedNotifier Notifier 生命周期 flutter的生命周期其实 ...

  10. flutter 图解_Flutter 54: 图解基本生命周期

    小菜使用 Flutter 这么长时间,并没有认真研究过 Flutter 的生命周期,今天小菜分几个场景学习一下 Flutter 的生命周期: 小菜借助 WidgetsBinding 通过观察和监听 d ...

最新文章

  1. 待遇46K起,这几个公众号在招人!
  2. C++类模板中的static成员
  3. redux异步action_react-redux--异步Action
  4. sql 大于某个日期_图解面试题:如何比较日期数据?
  5. LevelDB的源码阅读(三) Get操作
  6. 人生就是一次Presentation
  7. 如何激活 Trend Micro Deep Security Agent
  8. ENSP安装教程【手把手教学】
  9. Eclipse中如何clean项目以及clean的作用
  10. 复杂材料棱柱体单站RCS
  11. C++ 打表法计算农历错误数据处理
  12. c#.net开发金融行情分析软件k线图蜡烛图之布林线指标计算
  13. 2016年U盘启动盘制作工具哪个好用?看U盘启动盘排行榜!
  14. mysql expire_mysql expire_logs_days是怎么生效和计算出来的
  15. python3+requests+BeautifulSoup+mysql爬取豆瓣电影top250
  16. 液晶显示屏模组工艺流程是什么,液晶显示模组生产流程的意义
  17. 常用的软件(百度网盘分享:永久有效)
  18. Cesium专栏-空间分析之地形等高线(附源码下载)
  19. simpledateformat怎么改变格式 SimpleDateFormat 的使用及其 注意事项
  20. oracle nvl()和nvl2()

热门文章

  1. 前端项目运行以后端口不是常见的8080等端口,端口数很大,不在配置的端口跑项目
  2. 进行海外媒体发稿的稿件撰写技巧和方法
  3. 小程序设置按钮分享功能
  4. uniapp地图计算两点角度,旋转图标(轨迹回放)
  5. 自己集成的android容联云IMdemo效果展示
  6. 我努力了18年,不是为了和你一起喝咖啡姐妹篇
  7. 计算机网络的资源子网,在计算机网络中,资源子网的功能是什么?
  8. 格林高斯斯托克斯 通量散度旋度
  9. 运行vue项目遇到的bug
  10. 银行业的python项目_python练习项目(银行)——开户和查询