級(jí)別: ★☆☆☆☆
標(biāo)簽:「Flutter」「Element 」「生命周期 」
作者: 沐靈洛
審校: QiShare團(tuán)隊(duì)
Element是什么?
Widget
在樹中特定位置的實(shí)例咪啡。文檔中的描述:
An instantiation of a [Widget] at a particular location in the tree.
widgets
描述如何配置一個(gè)子樹躏哩,但是相同的widget
可以同時(shí)被用來配置多個(gè)子樹滓走,這是因?yàn)?code>widget是不可變的。一個(gè)Element
表示在樹中的特定位置對(duì)Widget
配置數(shù)據(jù)的使用。隨著時(shí)間的推移棉钧,Element
關(guān)聯(lián)的widget
可能會(huì)變化瓜喇。比如:如果此位置的widget
對(duì)應(yīng)的父widget
重新構(gòu)建了挺益,并且在此位置重新創(chuàng)建了一個(gè)新的widget
。
樹中的Elements
:大多數(shù)的element
的child
都是獨(dú)一無二的乘寒,但是有一些widgets
關(guān)聯(lián)的element
可以有多個(gè)children
望众,比如RenderObjectElement
的子類MultiChildRenderObjectElement
。
Element的生命周期
framework
通過在將要被用來作為element
的初始配置的widget
上調(diào)用[Widget.createElement]
創(chuàng)建一個(gè)element
伞辛。framework
通過調(diào)用[mount]
將一個(gè)新創(chuàng)建的element
加入樹中給定的父節(jié)點(diǎn)的插槽下面烂翰。[mount]
方法負(fù)責(zé)注入任何child widgets
并且在有需要的時(shí)候,會(huì)調(diào)用[attachRenderObject]
將關(guān)聯(lián)的render objects
添加到渲染樹render tree
中蚤氏。
到這一步的時(shí)候element
甘耿,會(huì)進(jìn)入active
狀態(tài),并且會(huì)顯示在屏幕上竿滨。某些時(shí)候佳恬,父節(jié)點(diǎn)可能決定要改變使用在子
element
上的配置(widget
)時(shí)。比如:父節(jié)點(diǎn)因?yàn)橐粋€(gè)新的state
重新build
,(每次build
都會(huì)產(chǎn)生一個(gè)新的widget
)framework
將使用新widget
調(diào)用[update]
方法于游,這個(gè)新的widget
將總是擁有和舊widget
同樣的runtimeType
和Key
毁葱。如果父節(jié)點(diǎn)希望改變樹中此位置的新widget
對(duì)應(yīng)的runtimeType
或Key
時(shí),會(huì)unmount
舊的element
并且在此位置注入一個(gè)新的widget
曙砂,(意味著使用新的widget
創(chuàng)建一個(gè)新的element
放在此位置)头谜。還有一些時(shí)候呢,樹中的祖先節(jié)點(diǎn)(或者中間的祖先)鸠澈,想要移除樹中的某個(gè)
element
柱告,該怎么辦呢?祖先節(jié)點(diǎn)自己調(diào)用[deactivateChild]
笑陈。
當(dāng)[deactivateChild]
后會(huì)發(fā)生什么事情呢际度?祖先將從render tree
中遍歷移除elements
對(duì)應(yīng)的render objects
,并且將這個(gè)元素加入到owner
對(duì)應(yīng)的不活躍的element
數(shù)組中涵妥,最終導(dǎo)致framework
對(duì)此element
調(diào)用[deactivate]
方法乖菱。
關(guān)于
owner
是BuildOwner
類型的,它widgets framework
的管理類
用于跟蹤哪些widgets
需要rebuild
,并且處理一些適用于整個(gè)widget tree
的其他任務(wù)窒所。
- 這個(gè)時(shí)候呢鹉勒,
element
會(huì)進(jìn)入inactive
狀態(tài),并且不會(huì)出現(xiàn)在屏幕上吵取。
一個(gè)element
可以保持inactive
狀態(tài)直到當(dāng)前的動(dòng)畫幀結(jié)束禽额。在動(dòng)畫幀結(jié)束的時(shí)候,所有處于inactive
的elements
將會(huì)被unmounted
(即:調(diào)用[unmount]
方法)皮官。 - 但是脯倒,當(dāng)處于
inactive
狀態(tài)的元素被重新合并到樹中時(shí)(比如:它或它的祖先有能重用的global key
時(shí)),framework
將從owner
的inactive elements
數(shù)組中移除這個(gè)element
捺氢,并且為此element
調(diào)用[activate]
藻丢,同時(shí)reattach
此element
的render object
到render tree
中。這時(shí)候呢摄乒,這個(gè)element
將 再次變?yōu)?code>active狀態(tài)悠反,并且可能出現(xiàn)字屏幕上。 - 當(dāng)處于
inactive
狀態(tài)的elements
馍佑,在當(dāng)前動(dòng)畫幀結(jié)束的時(shí)候并沒有被重新合并到樹中時(shí)问慎,framework
將為每個(gè)elements
調(diào)用[unmount]
方法。 - 到這時(shí)挤茄,
element
會(huì)變?yōu)?code>defunct,并且以后將再也無法合并到樹中(即宣告冰木,element
頑強(qiáng)而富有斗志的一生end
)穷劈。
Element的生命周期圖解
下一篇我們將與大家一起探討Element
的一些重要的方法的作用以及調(diào)用時(shí)機(jī)。
iOS 解決 [NSURL fileURLWithPath:] 對(duì) # 的編碼問題
Xcode 調(diào)整導(dǎo)航目錄字體大小b
Swift 5.1 (21) - 泛型
Swift 5.1 (20) - 協(xié)議
Swift 5.1 (19) - 擴(kuò)展
Swift 5.1 (18) - 嵌套類型
Swift 5.1 (17) - 類型轉(zhuǎn)換與模式匹配
淺談編譯過程
深入理解HTTPS
淺談 GPU 及 “App渲染流程”