- initState:當(dāng)Widget第一次插入到Widget樹時會被調(diào)用萌业,對于每一個State對象坷襟,這個方法只會調(diào)用一次。所以生年,通常在該回調(diào)中做一些一次性的操作婴程,如一些初始化操作。(注意:不能在該回調(diào)中調(diào)用BuildContext.inheritFromWidgetOfExactType(該方法用于在Widget樹上獲取離當(dāng)前widget最近的一個父級InheritFromWidget)抱婉,原因是在初始化完成后档叔,Widget樹中的InheritFromWidget也可能會發(fā)生變化,所以正確的做法應(yīng)該在在build()方法或didChangeDependencies()中調(diào)用它蒸绩。)
- didChangeDependencies():當(dāng)State對象的依賴發(fā)生變化時會被調(diào)用衙四;例如:在父widget的build() 中如果包含一個InheritedWidget,然后在之后InheritedWidget發(fā)生了變化患亿,那么此時InheritedWidget的子widget的didChangeDependencies()回調(diào)都會被調(diào)用传蹈。
- build:它主要是用于構(gòu)建Widget子樹
- reassemble:此回調(diào)是專門為了開發(fā)調(diào)試而提供的,在熱重載(hot reload)時會被調(diào)用步藕,此回調(diào)在Release模式下永遠(yuǎn)不會被調(diào)用惦界。
- didUpdateWidget:在widget重新構(gòu)建時,F(xiàn)lutter framework會調(diào)用Widget.canUpdate來檢測Widget樹中同一位置的新舊節(jié)點(diǎn)漱抓,然后決定是否需要更新表锻,如果Widget.canUpdate返回true則會調(diào)用此回調(diào)恕齐。正如之前所述乞娄,Widget.canUpdate會在新舊widget的key和runtimeType同時相等時會返回true,也就是說在在新舊widget的key和runtimeType同時相等時didUpdateWidget()就會被調(diào)用显歧。
- deactivate:當(dāng)State對象從樹中被移除時仪或,會調(diào)用此回調(diào)。在一些場景下士骤,F(xiàn)lutter framework會將State對象重新插到樹中范删,如包含此State對象的子樹在樹的一個位置移動到另一個位置時(可以通過GlobalKey來實(shí)現(xiàn))。如果移除后沒有重新插入到樹中則緊接著會調(diào)用dispose()方法拷肌。
- dispose:當(dāng)State對象從樹中被永久移除時調(diào)用到旦;通常在此回調(diào)中釋放資源旨巷。
class LifeCyclePage extends StatefulWidget {
@override
_LifeCyclePageState createState() => _LifeCyclePageState();
@override
StatefulElement createElement() {
// print("page1--createElement");
return super.createElement();
}
}
class _LifeCyclePageState extends State<LifeCyclePage>
with WidgetsBindingObserver {
String title = "點(diǎn)擊我";
@override
void initState() {
// TODO: implement initState
super.initState();
print('page1--initState');
WidgetsBinding.instance.addObserver(this);
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
print(state.toString());
}
@override
void didChangeDependencies() {
print('page1--didChangeDependencies');
super.didChangeDependencies();
}
@override
void didUpdateWidget(LifeCyclePage oldWidget) {
print('page1--didUpdateWidget');
super.didUpdateWidget(oldWidget);
}
@override
Widget build(BuildContext context) {
print('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 = "我變化了";
});
},
),
ChildStatefulWidget(),
FlatButton(
color: Colors.grey,
onPressed: () {
Navigator.of(context)
.push(new MaterialPageRoute(builder: (BuildContext c) {
return new LifeCyclePage2();
}));
},
child: Text("跳轉(zhuǎn)頁面")),
],
),
);
}
@override
void reassemble() {
// TODO: implement reassemble
super.reassemble();
print('page1--reassemble');
}
@override
void deactivate() {
// TODO: implement deactivate
super.deactivate();
print('page1--deactivate');
}
@override
void dispose() {
// TODO: implement dispose
super.dispose();
//WidgetsBinding.instance.addObserver(this);
print('page1--dispose');
}
}
class ChildStatefulWidget extends StatefulWidget {
// 當(dāng)這個 Widget 首次插入到樹中時,框架會調(diào)用其 createState 函數(shù)以創(chuàng)建一個新的_ChildStatefulWidgetState實(shí)例來與該樹中的相應(yīng)位置關(guān)聯(lián)
// 當(dāng)這個widget的父級重建時添忘,父級將創(chuàng)建一個新的ChildStatefulWidget實(shí)例采呐,但是Flutter框架將重用已經(jīng)在樹中的_ChildStatefulWidgetState實(shí)例,
// 而不是再次調(diào)用createState創(chuàng)建一個新的State搁骑。
@override
_ChildStatefulWidgetState createState() {
print("child--createState");
return _ChildStatefulWidgetState();
}
}
class _ChildStatefulWidgetState extends State<ChildStatefulWidget> {
String title = "點(diǎn)擊我";
@override
Widget build(BuildContext context) {
print('child--build');
return GestureDetector(
child: new Text(title ?? ""),
onTap: () {
setState(() {
title = "我變化了";
});
},
);
}
@override
void initState() {
print('child--initState');
super.initState();
}
@override
void didChangeDependencies() {
print('child--didChangeDependencies');
super.didChangeDependencies();
}
@override
void didUpdateWidget(ChildStatefulWidget oldWidget) {
print('child--didUpdateWidget');
super.didUpdateWidget(oldWidget);
}
@override
void reassemble() {
print('child--reassemble');
super.reassemble();
}
@override
void deactivate() {
print('child--deactivate');
super.deactivate();
}
@override
void dispose() {
print('child--dispose');
super.dispose();
//WidgetsBinding.instance.addObserver(this);
}
}
class LifeCyclePage2 extends StatefulWidget {
@override
_LifeCyclePageState createState(){
return new _LifeCyclePageState();
}
@override
StatefulElement createElement() {
// TODO: implement createElement
// print("page2--createElement");
return super.createElement();
}
}
class _LifeCyclePageState extends State<LifeCyclePage2> with WidgetsBindingObserver {
@override
void initState() {
// TODO: implement initState
super.initState();
print('page2---initState');
WidgetsBinding.instance.addObserver(this);
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
print(state.toString());
}
@override
void didChangeDependencies() {
// TODO: implement didChangeDependencies
super.didChangeDependencies();
print('page2---didChangeDependencies');
}
@override
void didUpdateWidget(LifeCyclePage2 oldWidget) {
// TODO: implement didUpdateWidget
super.didUpdateWidget(oldWidget);
print('page2---didUpdateWidget');
}
@override
Widget build(BuildContext context) {
print('page2---build');
// TODO: implement 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("生命周期示例2"),
),
);
}
@override
void reassemble() {
// TODO: implement reassemble
super.reassemble();
print('page2---reassemble');
}
@override
void deactivate() {
// TODO: implement deactivate
super.deactivate();
print('page2---deactivate');
}
@override
void dispose() {
// TODO: implement dispose
super.dispose();
//WidgetsBinding.instance.addObserver(this);
print('page2---dispose');
}
}
進(jìn)入頁面1:
I/flutter (26059): page1--initState
I/flutter (26059): page1--didChangeDependencies
I/flutter (26059): page1--build
I/flutter (26059): child--createState
I/flutter (26059): child--initState
I/flutter (26059): child--didChangeDependencies
I/flutter (26059): child--build
點(diǎn)擊 第一個"點(diǎn)擊我": setState
I/flutter (26059): page1--build
I/flutter (26059): child--didUpdateWidget
I/flutter (26059): child--build
點(diǎn)擊 第二個"點(diǎn)擊我":
I/flutter (26059): child--build
跳轉(zhuǎn)頁面2:
I/flutter (26059): page2---initState
I/flutter (26059): page2---didChangeDependencies
I/flutter (26059): page2---build
返回頁面1:
I/flutter (26059): page2---deactivate
I/flutter (26059): page2---dispose
退出頁面1:
I/flutter (26059): page1--deactivate
I/flutter (26059): child--deactivate
I/flutter (26059): child--dispose
I/flutter (26059): page1--dispose