Flutter Element概念簡明分析
一 Element 概念
這個玩意的概念。到底是什么 ?
官方解釋是在樹中特定位置的實例。
二 繼承關(guān)系
element 有 ComponentElement 和 RenderObjectElement 之分
ComponentElement
class StatelessElement extends ComponentElement
class StatefulElement extends ComponentElement
三 生命周期
1 framework 通過在將要被用來作為Element的初始配置的widget 上調(diào)用其createElement 方法來創(chuàng)建一個element
2 framework 通過調(diào)用mount 方法 將一個新創(chuàng)建的element 加入樹中給定的父節(jié)點的插槽下面。
mount 方法負責注入任何child widgets,并且會在有需要·的時候,會調(diào)用attachRenderObject
將關(guān)聯(lián)的render objects 添加到渲染樹中 render tree 中。到這一步的時候,element 會進入active 狀態(tài),并且會顯示在屏幕上方。
四 方法分析
Element 這個抽象類中有一個方法 叫做 mount 方法 。
/// Add this element to the tree in the given slot of the given parent. /// /// The framework calls this function when a newly created element is added to /// the tree for the first time. Use this method to initialize state that /// depends on having a parent. State that is independent of the parent can /// more easily be initialized in the constructor. /// /// This method transitions the element from the "initial" lifecycle state to /// the "active" lifecycle state. /// /// Subclasses that override this method are likely to want to also override /// [update], [visitChildren], [RenderObjectElement.insertRenderObjectChild], /// [RenderObjectElement.moveRenderObjectChild], and /// [RenderObjectElement.removeRenderObjectChild]. /// /// Implementations of this method should start with a call to the inherited /// method, as in `super.mount(parent, newSlot)`. @mustCallSuper void mount(Element? parent, Object? newSlot) { assert(_lifecycleState == _ElementLifecycle.initial); assert(widget != null); assert(_parent == null); assert( parent == null || parent._lifecycleState == _ElementLifecycle.active); assert(slot == null); _parent = parent; _slot = newSlot; _lifecycleState = _ElementLifecycle.active; _depth = _parent != null ? _parent!.depth + 1 : 1; if (parent != null) { // Only assign ownership if the parent is non-null. If parent is null // (the root node), the owner should have already been assigned. // See RootRenderObjectElement.assignOwner(). _owner = parent.owner; } assert(owner != null); final Key? key = widget.key; if (key is GlobalKey) { owner!._registerGlobalKey(key, this); } _updateInheritance(); attachNotificationTree(); }
renderObjectElement 的mount 方法
其主要作用 將element相關(guān)聯(lián)的renderObject插入到渲染樹中,插入到渲染樹后的element就處于“active”狀態(tài),處于“active”狀態(tài)后就可以顯示在屏幕上了。
此處可以看出來,RenderObject? _renderObject; element 是持有renderObject 的引用的
@override void mount(Element? parent, Object? newSlot) { super.mount(parent, newSlot); assert(() { _debugDoingBuild = true; return true; }()); _renderObject = (widget as RenderObjectWidget).createRenderObject(this); assert(!_renderObject!.debugDisposed!); assert(() { _debugDoingBuild = false; return true; }()); assert(() { _debugUpdateRenderObjectOwner(); return true; }()); assert(_slot == newSlot); attachRenderObject(newSlot); _dirty = false; }
到此這篇關(guān)于Flutter Element概念簡明分析的文章就介紹到這了,更多相關(guān)Flutter Element內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Kotlin文件讀寫與SharedPreferences存儲功能實現(xiàn)方法
SharedPreferences是安卓平臺上一個輕量級的存儲類,用來保存應用的一些常用配置,比如Activity狀態(tài),Activity暫停時,將此activity的狀態(tài)保存到SharedPereferences中;當Activity重載,系統(tǒng)回調(diào)方法onSaveInstanceState時,再從SharedPreferences中將值取出2022-12-12詳解Android_性能優(yōu)化之ViewPager加載成百上千高清大圖oom解決方案
這篇文章主要介紹了詳解Android_性能優(yōu)化之ViewPager加載成百上千高清大圖oom解決方案,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2016-12-12淺談Android應用內(nèi)懸浮控件實踐方案總結(jié)
本篇文章主要介紹了淺談Android應用內(nèi)懸浮控件實踐方案總結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11點擊微信內(nèi)網(wǎng)頁a標簽直接跳轉(zhuǎn)打開淘寶APP的方法實例
這篇文章主要給大家介紹了關(guān)于如何實現(xiàn)點擊微信內(nèi)網(wǎng)頁a標簽直接跳轉(zhuǎn)打開淘寶APP的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧。2017-11-11Android中的人臉檢測的示例代碼(靜態(tài)和動態(tài))
本篇文章主要介紹了Android中的人臉檢測的示例代碼(靜態(tài)和動態(tài)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01Eclipse+ADT+Android SDK搭建安卓開發(fā)環(huán)境的實現(xiàn)步驟
這篇文章主要介紹了Eclipse+ADT+Android SDK搭建安卓開發(fā)環(huán)境的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09