1邻吭、Fultter 生命周期
生命周期的作用:
- 初始化一些數(shù)據(jù)娱两、變量澈圈、狀態(tài)
- 發(fā)送網(wǎng)絡(luò)請(qǐng)求
- 監(jiān)聽事件
- 管理內(nèi)存
1.1 StatelessWidget 生命周期
class MSHomePage extends StatelessWidget {
MSHomePage() {
print("Flutter: StatelessWidget 構(gòu)造函數(shù) 調(diào)用");
}
@override
Widget build(BuildContext context) {
print("Flutter: StatelessWidget build 調(diào)用");
return Text("Hello World");
}
}
StatelessWidget 不可變邑茄,在它的生命周期中蛋叼,只會(huì)執(zhí)行構(gòu)造函數(shù)落包、build方法
1.2 StatefulWidget 生命周期
在下圖中部蛇,灰色部分的內(nèi)容是Flutter內(nèi)部操作的,我們并不需要手動(dòng)去設(shè)置它們咐蝇;
白色部分表示我們可以去監(jiān)聽到或者可以手動(dòng)調(diào)用的方法
首先涯鲁,執(zhí)行StatefulWidget中相關(guān)的方法:
1、執(zhí)行StatefulWidget的構(gòu)造函數(shù)(Constructor)來(lái)創(chuàng)建出StatefulWidget有序;
2抹腿、執(zhí)行StatefulWidget的createState方法,來(lái)創(chuàng)建一個(gè)維護(hù)StatefulWidget的State對(duì)象旭寿;
其次警绩,調(diào)用createState創(chuàng)建State對(duì)象時(shí),執(zhí)行State類的相關(guān)方法:
1盅称、執(zhí)行State類的構(gòu)造方法(Constructor)來(lái)創(chuàng)建State對(duì)象肩祥;
2、執(zhí)行initState缩膝,我們通常會(huì)在這個(gè)方法中執(zhí)行一些數(shù)據(jù)初始化的操作混狠,或者也可能會(huì)發(fā)送網(wǎng)絡(luò)請(qǐng)求;
注意:這個(gè)方法是重寫父類的方法疾层,必須調(diào)用super将饺,因?yàn)楦割愔袝?huì)進(jìn)行一些其他操作;
并且如果你閱讀源碼,你會(huì)發(fā)現(xiàn)這里有一個(gè)注解(annotation):@mustCallSuper
3予弧、執(zhí)行didChangeDependencies方法刮吧,這個(gè)方法在兩種情況下會(huì)調(diào)用
情況一:調(diào)用initState會(huì)調(diào)用;
情況二:從其他對(duì)象中依賴一些數(shù)據(jù)發(fā)生改變時(shí)掖蛤,比如前面我們提到的InheritedWidget(這個(gè)后面會(huì)講到)杀捻;
4、Flutter執(zhí)行build方法坠七,來(lái)看一下我們當(dāng)前的Widget需要渲染哪些Widget水醋;
5、當(dāng)前的Widget不再使用時(shí)彪置,會(huì)調(diào)用dispose進(jìn)行銷毀拄踪;
6、手動(dòng)調(diào)用setState方法拳魁,會(huì)根據(jù)最新的狀態(tài)(數(shù)據(jù))來(lái)重新調(diào)用build方法惶桐,構(gòu)建對(duì)應(yīng)的Widgets;
7潘懊、執(zhí)行didUpdateWidget方法是在當(dāng)父Widget觸發(fā)重建(rebuild)時(shí)姚糊,系統(tǒng)會(huì)調(diào)用didUpdateWidget方法
1.2.1 代碼演示
import 'package:flutter/material.dart';
void main(List<String> args) {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
var curHomePage = MSHomePageBody();
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text("聲明周期"),
),
body: curHomePage,
floatingActionButton: IconButton(
icon: Icon(Icons.change_circle),
onPressed: () {
setState(() {
curHomePage = MSHomePageBody();
});
},
),
),
);
}
}
class MSHomePageBody extends StatefulWidget {
MSHomePageBody() {
print("1. MSHomePageBody 構(gòu)造函數(shù)");
}
@override
State<StatefulWidget> createState() {
print("2. MSHomePageBody createState");
return _MSHomePageBodyState();
}
}
class _MSHomePageBodyState extends State<MSHomePageBody> {
int _counter = 0;
_MSHomePageBodyState() {
print("3. _MSHomePageBodyState 構(gòu)造函數(shù)");
}
@override
void initState() {
print("4. _MSHomePageBodyState initState");
super.initState();
}
@override
void didChangeDependencies() {
// 調(diào)用時(shí)機(jī)
// 調(diào)用initState會(huì)調(diào)用
// 從其他對(duì)象中依賴一些數(shù)據(jù)發(fā)生改變時(shí)
print("_MSHomePageBodyState didChangeDependencies");
super.didChangeDependencies();
}
@override
void didUpdateWidget(covariant MSHomePageBody oldWidget) {
// 調(diào)用時(shí)機(jī)
// 當(dāng)父Widget觸發(fā)重建(rebuild)時(shí),系統(tǒng)會(huì)調(diào)用didUpdateWidget方法
print("_MSHomePageBodyState didUpdateWidget");
super.didUpdateWidget(oldWidget);
}
@override
Widget build(BuildContext context) {
print("5. _MSHomePageBodyState build");
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () {
setState(() {
_counter++;
});
},
child: Text(
"點(diǎn)擊",
style: TextStyle(fontSize: 20),
),
),
Text(
"當(dāng)前計(jì)數(shù)$_counter",
style: TextStyle(fontSize: 20),
),
],
);
}
@override
void dispose() {
print("6. Flutter: _MSHomePageBodyState dispose");
super.dispose();
}
}
運(yùn)行App時(shí)授舟,打印如下:
flutter: 1. MSHomePageBody 構(gòu)造函數(shù)
flutter: 2. MSHomePageBody createState
flutter: 3. _MSHomePageBodyState 構(gòu)造函數(shù)
flutter: 4. _MSHomePageBodyState initState
flutter: _MSHomePageBodyState didChangeDependencies
flutter: 5. _MSHomePageBodyState build
我們手動(dòng)改變counter狀態(tài)(點(diǎn)擊+按鈕)時(shí)救恨,打印如下
flutter: 5. _MSHomePageBodyState build
我們手動(dòng)改變curHomePage狀態(tài)(點(diǎn)擊底部按鈕)時(shí),MSHomePageBody的父Widget發(fā)生改變释树,打印如下:
flutter: 1. MSHomePageBody 構(gòu)造函數(shù)
flutter: _MSHomePageBodyState didUpdateWidget
flutter: 5. _MSHomePageBodyState build
1.3 生命周期的復(fù)雜版
1肠槽、mounted是State內(nèi)部設(shè)置的一個(gè)屬性。這個(gè)屬性是在我們創(chuàng)建完State調(diào)用initState之前奢啥,F(xiàn)lutter給我們的BuildContent掛載的一個(gè)屬性秸仙。這個(gè)屬性最主要的作用是為了記錄對(duì)應(yīng)的Element是否為空
2、dirty state的含義是臟的State
它實(shí)際是通過(guò)Element的屬性來(lái)標(biāo)記的桩盲;
將它標(biāo)記為dirty會(huì)等待下一次的重繪檢查寂纪,強(qiáng)制調(diào)用build方法來(lái)構(gòu)建我們的Widget;
3赌结、clean state的含義是干凈的State
它表示當(dāng)前build出來(lái)的Widget捞蛋,下一次重繪檢查時(shí)不需要重新build;