Flutter的生命周期
生命周期是一个从创建到销毁的过程,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的生命周期相关推荐
- 【Flutter】Flutter 页面生命周期 ( 初始化期 | createState | initState | 更新期 | build | 销毁期 | dispose)
文章目录 一.Flutter 页面生命周期 1.StatelessWidget 组件生命周期函数 2.StatefulWidget 组件生命周期函数 二.StatefulWidget 组件生命周期 1 ...
- 【Flutter】Flutter 应用生命周期 ( 前台状态 resumed | 后台状态 paused | 非活动状态 inactive | 组件分离状态 detached )
文章目录 一.Flutter 应用生命周期 二.监听 Flutter 应用生命周期 三.完整代码示例 四.相关资源 一.Flutter 应用生命周期 应用生命周期 : resumed : 应用进入前台 ...
- 详解 Flutter State 生命周期
一.说明 我们在开发 Android 或 iOS 中经常会用到页面的生命周期. Android Activity 生命周期: onCreate onStart onResume onPause onS ...
- Flutter 的生命周期,略知一二
1. 前言 生命周期是一个组件加载到卸载的整个周期,熟悉生命周期可以让我们在合适的时机做该做的事情,例如:APP 正在播放视频,当 APP 被切换到后台,则这个时候最好是暂停视频. Flutter 的 ...
- Flutter State生命周期 Flutter Widget生命周期 Flutter 应用程序生命周期
题记:不到最后时刻,千万别轻言放弃,无论结局成功与否,只要你拼博过,尽力过,一切问心无愧 在 Flutter应用程序中,生命周期涉及两个,一个是 Widget 的生命周期,一个是应用程序的生命周期,本 ...
- Flutter -- Element生命周期
Widget其实是Element的配置项,Flutter中真正代表屏幕上显示元素的类是Element . Tips:Element本身并不处理laying out, painting, 和hit te ...
- flutter中的生命周期
前言 和其他的视图框架比如android的Activity一样,flutter中的视图Widget也存在生命周期,生命周期的回调函数提现在了State上面.理解flutter的生命周期,对我们写出一个 ...
- Flutter State 的生命周期
本文主要介绍类比 Android 和 iOS,了解 Flutter State 的生命周期. 从 Android 或 iOS 转到 Flutter 开发,最让人疑惑的是 Flutter 如何处理生命周 ...
- Flutter漫说:组件生命周期、State状态管理及局部重绘的实现(Inherit)
目录 生命周期 State改变时组件如何刷新 InheritedWidget InheritedModel InheritedNotifier Notifier 生命周期 flutter的生命周期其实 ...
- flutter 图解_Flutter 54: 图解基本生命周期
小菜使用 Flutter 这么长时间,并没有认真研究过 Flutter 的生命周期,今天小菜分几个场景学习一下 Flutter 的生命周期: 小菜借助 WidgetsBinding 通过观察和监听 d ...
最新文章
- 待遇46K起,这几个公众号在招人!
- C++类模板中的static成员
- redux异步action_react-redux--异步Action
- sql 大于某个日期_图解面试题:如何比较日期数据?
- LevelDB的源码阅读(三) Get操作
- 人生就是一次Presentation
- 如何激活 Trend Micro Deep Security Agent
- ENSP安装教程【手把手教学】
- Eclipse中如何clean项目以及clean的作用
- 复杂材料棱柱体单站RCS
- C++ 打表法计算农历错误数据处理
- c#.net开发金融行情分析软件k线图蜡烛图之布林线指标计算
- 2016年U盘启动盘制作工具哪个好用?看U盘启动盘排行榜!
- mysql expire_mysql expire_logs_days是怎么生效和计算出来的
- python3+requests+BeautifulSoup+mysql爬取豆瓣电影top250
- 液晶显示屏模组工艺流程是什么,液晶显示模组生产流程的意义
- 常用的软件(百度网盘分享:永久有效)
- Cesium专栏-空间分析之地形等高线(附源码下载)
- simpledateformat怎么改变格式 SimpleDateFormat 的使用及其 注意事项
- oracle nvl()和nvl2()