1.StatefulWidget生命周期
Flutter小部件的生命周期:
- StatelessWidget可以由父Widget直接传入值,调用build方法来构建,整个过程非常简单;
- 而StatefulWidget需要通过State来管理其数据,并且还要监控状态的改变决定是否重新build整个Widget;
-
所以,我们主要讨论StatefulWidget的生命周期,也就是它从创建到销毁的整个过程;
flutter生命周期.jpg
1. Widget的构造
在flutter中,State是依赖于Widget的,所以,在使用State的时候,先会有一个Widget的构造,且Widget是继承于StatefulWidget
class PRHomeContent extends StatefulWidget {
final String msg;
// 如果Widget没有增加属性的时候,这个默认构造方法是不用写的.
// 系统会帮我们补充构造方法;
PRHomeContent(this.msg) {
print('1.调用 ${this.runtimeType} -> Contstructor ');
}
//Widget 构造完成后,接着就会创建 State;
@override
_RFHomeContentState createState() {
print('2.调用 ${this.runtimeType} -> createState ');
return _RFHomeContentState();
}
}
2. Widget create State (Widget创建state)
Widget 构造完成后,接着就会创建 State,代码在上方.
3. State初始化
4. State initState (State初始化)
5. State didChangeDependencies (State 依赖变化)
6. State didUpdateWidget
7. State dispose(销毁)
class _RFHomeContentState extends State<PRHomeContent> {
//构造方法
_RFHomeContentState() {
print('3.调用 ${this.runtimeType} -> constuctor ');
}
//注意点: super.initState(); 是必须调用的
/* 源码:
@mustCallSuper ---> 必须调用
void initState() {
assert(_debugLifecycleState == _StateLifecycle.created);
}
*/
//初始化方法;
@override
void initState() {
// TODO: implement initState
super.initState();
print('4.调用 ${this.runtimeType} -> initState ');
}
int _count = 0;
int _count2 = 0;
int _count3 = 0;
//点击btn 会重新调用这个build方法
@override
Widget build(BuildContext context) {
print('5.调用 ${this.runtimeType} -> build ');
_count3 = _count > _count2 ? _count : _count2;
return Column(
children: [
Text(this.widget.msg),
Text('计数器:$_count3'),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
RaisedButton(
onPressed: () {
setState(() {
_count++;
});
},
child: Icon(Icons.add),
color: Colors.pink,
),
RaisedButton(
onPressed: () {
setState(() {
_count2++;
});
},
child: Icon(Icons.add),
color: Colors.pink,
),
],
)
],
);
}
//销毁方法
@override
void dispose() {
print('6.调用 ${this.runtimeType} -> dispose');
super.dispose();
}
//当一来发生改变的时候,会调用此方法
@override
void didChangeDependencies() {
// TODO: implement didChangeDependencies
super.didChangeDependencies();
print(' ${this.runtimeType} 调用 didChangeDependencies');
}
//如果当前state所在的Widget结构发生变化的时候,会调用此方法
//例如 当前state是继承于PRHomeContent的,如果PRHomeContent的结构发生改变的时候,这个state 就会调用didUpdateWidget方法;
@override
void didUpdateWidget(PRHomeContent oldWidget) {
// TODO: implement didUpdateWidget
super.didUpdateWidget(oldWidget);
print(' ${this.runtimeType} 调用 didUpdateWidget');
}
}
网友评论