Flutter學(xué)習(xí)筆記

生命周期

Flutter生命周期說白了就是回調(diào)方法(函數(shù))功偿,主要是監(jiān)聽Widget事件,內(nèi)存管理(銷毀).

  • 每一個widget都對應(yīng)一個(或多個)Element。Widget只是用于描述Element的一個配置文件念搬,實際在Framework層管理頁面的構(gòu)建,渲染等摆出,都是通過Element完成朗徊,Element由Widget創(chuàng)建,并且持有Widget對象偎漫,每一個Widget都會對應(yīng)一個(或多個)Element爷恳。
  • Element: 同時持有Widget和RenderObject,存放上下文信息象踊,通過它來遍歷視圖樹温亲,支撐UI結(jié)構(gòu)。
  • 調(diào)用setState()相當(dāng)于調(diào)用了markNeedsBuild杯矩,即_element.markNeedsBuild();
  • setState()過程其實只是將當(dāng)前對應(yīng)的Element標(biāo)記為臟dirty栈虚,并且添加到_dirtyElements合中
  • 重新渲染過程是一個增量改變码邻,注意這里的增量改變是指Element樹和渲染render樹致讥,而不是指widget樹宫患,原有的不變的Element拿來復(fù)用。widget肯定都是要重新創(chuàng)建阵子,只是在渲染的時候在element樹中再決定是重新渲染還是復(fù)用种呐。渲染時不是加載的widget樹形入,而是Render樹羔砾,決定是否重用是在element的canUpdate
  • 為什么設(shè)計成三棵樹呢相艇?個人認為因為中間的Element樹也對應(yīng)contenxt颖杏,意思是上下文的意思,也就是說Element樹持有Widget樹和Render樹的關(guān)系坛芽,這樣處理效率更高留储。
    周期.png
16144928547460.png

widget與element與render

widget初始化時內(nèi)部會隱式調(diào)用createElement

  • StatelessWidget內(nèi)部會調(diào)用createElement咙轩,同時將widget實例當(dāng)參數(shù)傳遞進去获讳,并返回(stateful/less)Element,而他們都繼承自Element的子類ComponentElement,接著調(diào)用ComponentElement里的mount方法的_firstBuild,最終走到performReBuild活喊,這一步會拿出_widget并調(diào)用build方法丐膝,并把Element當(dāng)做參數(shù)傳遞,所以最終會調(diào)用到widget的build的方法钾菊,由此也可以證明BuildContext就是element帅矗,且Element有個屬性_widget用來指向外部widget變量。

  • StateFulWidget會比上面流程多兩部煞烫,在Element創(chuàng)建后立馬調(diào)用widget.createState浑此,并把_state保存在Element。接著給state.widget賦值widget滞详,這也是為什么能在state方法里只能調(diào)用widget的原因凛俱。

  • Row、Cloumn這類Widget里createElement返回的是Element的子類RenderObjectElement料饥,接著調(diào)用mount方法里的createRenderObject蒲犬。

并不是所有的widget都會獨立渲染,只有繼承自RenderObjectWidget的才會創(chuàng)建renderObject對象岸啡。Flutter引擎是針對Render樹進行渲染原叮。

tree.png

直接在頁面節(jié)點調(diào)用setState()將會重新調(diào)用所有Widget(包括他們中的各種嵌套)的build()方法,如果我們的需求是一個較為復(fù)雜的頁面凰狞,這樣帶來的開銷消耗可想而知篇裁。當(dāng)我們在一個高節(jié)點調(diào)用setState()的時候會構(gòu)建再次build所有的Widget,雖然不一定掛載到Element樹中赡若,但是平時我們使用的Widget中往往嵌套多個其他類型的Widget,每個build()方法走下來最終也會帶來不小的開銷团甲,因此通過各種狀態(tài)管理方案逾冬,Stream等方式,只做局部刷新,是我們?nèi)粘i_發(fā)中應(yīng)該養(yǎng)成的良好習(xí)慣身腻。


Key

Element的canUpdate比較的是runtimeTypeKey产还,運用了diff算法,所以為了更加精確的區(qū)分oldwidget和newwidget嘀趟,需要在widget的初始化方法里傳入Key:super(key:key);

GlobalKey:可以獲取到對應(yīng)的Widget的State對象脐区,用來更新局部控件。_globalKey.currentState.setState();她按。


優(yōu)先級隊列

then優(yōu)先級最高牛隅,微任務(wù)scheduleMicrotask次之,Future最次酌泰。


混合開發(fā)

Flutter和原生來回切換會消耗性能內(nèi)存泄漏媒佣。
Flutter和原生通信需要用到MethodChannel.


參考鏈接1
參考鏈接2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市陵刹,隨后出現(xiàn)的幾起案子默伍,更是在濱河造成了極大的恐慌,老刑警劉巖衰琐,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件也糊,死亡現(xiàn)場離奇詭異,居然都是意外死亡羡宙,警方通過查閱死者的電腦和手機狸剃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辛辨,“玉大人捕捂,你說我怎么就攤上這事《犯悖” “怎么了指攒?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長僻焚。 經(jīng)常有香客問我允悦,道長,這世上最難降的妖魔是什么虑啤? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任隙弛,我火速辦了婚禮,結(jié)果婚禮上狞山,老公的妹妹穿的比我還像新娘全闷。我一直安慰自己,他們只是感情好萍启,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布总珠。 她就那樣靜靜地躺著屏鳍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪局服。 梳的紋絲不亂的頭發(fā)上钓瞭,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音淫奔,去河邊找鬼山涡。 笑死,一個胖子當(dāng)著我的面吹牛唆迁,可吹牛的內(nèi)容都是我干的鸭丛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼媒惕,長吁一口氣:“原來是場噩夢啊……” “哼系吩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起妒蔚,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤穿挨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后肴盏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體科盛,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年菜皂,在試婚紗的時候發(fā)現(xiàn)自己被綠了贞绵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡恍飘,死狀恐怖榨崩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情章母,我是刑警寧澤母蛛,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站乳怎,受9級特大地震影響彩郊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蚪缀,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一秫逝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧询枚,春花似錦违帆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狈醉。三九已至廉油,卻和暖如春惠险,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抒线。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工班巩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嘶炭。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓抱慌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親眨猎。 傳聞我的和親對象是個殘疾皇子抑进,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容