flutter 生命周期分為三個(gè)階段
初始化時(shí):
StatefulWidget的構(gòu)造函數(shù) -> createState(創(chuàng)建state類)-> state的構(gòu)造函數(shù)->initState -> didChangeDependencies -> build
createState:在widget中創(chuàng)建state類時(shí)調(diào)研,只執(zhí)行一次
didChangeDependencies:兩種情況下執(zhí)行,
1:在頁(yè)面初始化時(shí)執(zhí)行一次赤套,
2:在依賴的InheritedWidget 發(fā)生變化的時(shí)候執(zhí)行
狀態(tài)變化:
子組件調(diào)用setState ->build
父組件調(diào)用setState -> 父組件build -> 子組件 didUpdateWidget (子組件被復(fù)用)-> 子組件 build
每一幀渲染之后可以添加監(jiān)聽(tīng):
addPostFrameCallback:每一幀渲染完之后調(diào)用扒袖,類似于nextTick洪碳,注冊(cè)一次,調(diào)用一次
addPersistentFrameCallback:每一幀渲染完之后調(diào)用,注冊(cè)一次,多次調(diào)用殉疼,可以用來(lái)實(shí)現(xiàn)fps梯浪,注意:必須在頁(yè)面渲染出來(lái)之后調(diào)用,不然會(huì)報(bào)錯(cuò)
WidgetsBinding.instance?.addPostFrameCallback((time) {
WidgetsBinding.instance?.addPersistentFrameCallback((time2) {
print('------');
print(time2);
//觸發(fā)一幀的繪制
WidgetsBinding.instance?.scheduleFrame();
});
});
組件銷毀時(shí):
deactivate -> dispose
deactivate:當(dāng)組件被移除組件樹時(shí)調(diào)用瓢娜,如果接下來(lái)這個(gè)組件沒(méi)有被插入組件樹就會(huì)調(diào)用dispose
dispose:組件移除組件樹挂洛,并且當(dāng)前組件不再被插入組件樹
生命周期中幾個(gè)重要的屬性
mounted:state類中的一個(gè)屬性,用于表示當(dāng)前組件是否還在組件樹種恋腕,createState之后抹锄,initState之前,被設(shè)置為true荠藤,調(diào)用dispose時(shí),被設(shè)置為false获高。
dirty: 標(biāo)識(shí)當(dāng)前組件為臟狀態(tài)哈肖,下一幀時(shí)會(huì)調(diào)用build進(jìn)行重新渲染,調(diào)用 setState 方法或者執(zhí)行 didUpdateWidget 方法后念秧,組件的狀態(tài)為 dirty
clean:標(biāo)識(shí)當(dāng)前組件為干凈狀態(tài)淤井,重新渲染是不會(huì)執(zhí)行build
參考:
1:https://blog.crazyming.com/note/3212/
2:https://blog.csdn.net/weixin_43222302/article/details/100886618