Flutter:原理

原創(chuàng):有趣知識點摸索型文章
創(chuàng)作不易酌壕,請珍惜晨炕,之后會持續(xù)更新衫画,不斷完善
個人比較喜歡做筆記和寫總結(jié),畢竟好記性不如爛筆頭哈哈瓮栗,這些文章記錄了我的IOS成長歷程削罩,希望能與大家一起進步
溫馨提示:由于簡書不支持目錄跳轉(zhuǎn),大家可通過command + F 輸入目錄標題后迅速尋找到你所需要的內(nèi)容

目錄

  • 1遵馆、開源跨平臺UI框架
  • 2鲸郊、Flutter的優(yōu)缺點
  • 3、Flutter的理念架構(gòu)
  • 4货邓、Flutter的繪制流程
  • 5秆撮、Flutter 與原生Android、iOS進行通信的原理

1换况、開源跨平臺UI框架

Flutter是Google推出的一套開源跨平臺UI框架职辨,可以快速地在Android、iOS和Web平臺上構(gòu)建高質(zhì)量的原生用戶界面戈二。同時舒裤,F(xiàn)lutter還是Google新研發(fā)的Fuchsia操作系統(tǒng)的默認開發(fā)套件。在全世界觉吭,F(xiàn)lutter正在被越來越多的開發(fā)者和組織使用腾供,并且Flutter是完全免費、開源的。

Flutter采用現(xiàn)代響應(yīng)式框架構(gòu)建伴鳖,其中心思想是使用組件來構(gòu)建應(yīng)用的UI节值。當組件的狀態(tài)發(fā)生改變時,組件會重構(gòu)它的描述榜聂,F(xiàn)lutter會對比之前的描述搞疗,以確定底層渲染樹從當前狀態(tài)轉(zhuǎn)換到下一個狀態(tài)所需要的最小更改。


2须肆、Flutter的優(yōu)缺點

優(yōu)點
  • 熱重載(Hot Reload):利用 Android Studio 直接一個ctrl+r就可以重載匿乃,模擬器立馬就可以看見效果,相比原生冗長的編譯過程強很多
  • 一切皆為 Widget 的理念:對于Flutter來說豌汇,手機應(yīng)用里的所有東西都是Widget幢炸,通過可組合的空間集合、豐富的動畫庫拒贱、分層擴展的架構(gòu)阳懂,實現(xiàn)了富有感染力的靈活界面設(shè)計
  • 良好的運行效率:利用 Flutter 構(gòu)建的應(yīng)用在運行效率上會和原生應(yīng)用差不多。
缺點
  • 不支持熱更新
  • 第三方庫有限柜思,需要自己造輪子
  • Dart 語言編寫,增加了學習難度巷燥,并且學習了 Dart 之后無其他用處

3赡盘、Flutter的理念架構(gòu)

Widget

在 Flutter 中,幾乎所有東西都是Widget缰揪。將一個Widget想象為一個可視化的組件陨享,當你需要構(gòu)建與布局相關(guān)的任何內(nèi)容時,你就需要使用Widget钝腺。

Widget樹

Widget以樹結(jié)構(gòu)進行組織抛姑。包含其他Widgetwidget被稱為父Widget(或widget容器)。

Context

僅僅是已創(chuàng)建的所有Widget樹結(jié)構(gòu)中的某個Widget的位置引用艳狐。簡而言之定硝,將context作為widget樹的一部分,其中context所對應(yīng)的widget被添加到此樹中毫目。一個context只從屬于一個widget蔬啡,它和widget一樣是鏈接在一起的,并且會形成一個context樹镀虐。

State

應(yīng)用于State的任何更改都會強制重建Widget箱蟆。

StatelessWidget

一旦創(chuàng)建就不關(guān)心任何變化,在下次構(gòu)建之前都不會改變刮便。它們除了依賴于自身的配置信息(在父節(jié)點構(gòu)建時提供)外不再依賴于任何其他信息空猜。比如典型的TextRowColumn辈毯、Container等坝疼,都是StatelessWidget。它的生命周期相當簡單:初始化漓摩、通過build()渲染裙士。

StatefulWidget

在生命周期內(nèi),該類Widget所持有的數(shù)據(jù)可能會發(fā)生變化管毙,這樣的數(shù)據(jù)被稱為State腿椎,這些擁有動態(tài)內(nèi)部數(shù)據(jù)的Widget被稱為StatefulWidget。比如復(fù)選框夭咬、Button等啃炸。State會與Context相關(guān)聯(lián),并且此關(guān)聯(lián)是永久性的卓舵。


4南用、Flutter的繪制流程

a、渲染機制

Flutter 只關(guān)心向 GPU提供視圖數(shù)據(jù)掏湾,GPUVSync信號同步到 UI線程裹虫,UI線程使用 Dart來構(gòu)建抽象的視圖結(jié)構(gòu),這份數(shù)據(jù)結(jié)構(gòu)在 GPU線程進行圖層合成融击,視圖數(shù)據(jù)提供給 Skia引擎渲染為 GPU數(shù)據(jù)筑公,這些數(shù)據(jù)通過 OpenGL提供給 GPU

Flutter 既不使用WebView尊浪,也不使用系統(tǒng)的原生控件匣屡,而是通過高性能的渲染引擎來畫控件,它只有C/C++代碼編寫的單一層拇涤,這樣開發(fā)者更容易控制系統(tǒng)捣作。

Flutter用什么技術(shù)構(gòu)建的? C, C++, Dart, and Skia (2D 渲染引擎)。Flutter 和 React Native 不同主要在于 Flutter 是直接通過skia渲染的 鹅士,而 React Native 是將js中的控件轉(zhuǎn)化為原生控件券躁,通過原生去渲染的。

b如绸、熱重載

熱加載是注入源代碼到運行中的Dart虛擬機嘱朽,包括增加新的類,和給已有類增加新的方法和變量以及修改已有方法怔接。熱加載功能是狀態(tài)保持的(stateful)搪泳,可以快速重復(fù)屏幕內(nèi)容而不需要從主屏幕開始加載。

熱重載的流程可以分為 5 步扼脐,包括:掃描工程改動岸军、增量編譯奋刽、推送更新、代碼合并艰赞、Widget 重建佣谐。Flutter在接收到代碼變更后,并不會讓 App 重新啟動執(zhí)行方妖,而只會觸發(fā) Widget樹的重新繪制狭魂,因此可以保持改動前的狀態(tài),大大縮短了從代碼修改到看到修改產(chǎn)生的變化之間所需要的時間党觅。

另一方面雌澄,由于涉及到狀態(tài)的保存與恢復(fù),涉及狀態(tài)兼容與狀態(tài)初始化的場景杯瞻,熱重載是無法支持的镐牺,如改動前后 Widget狀態(tài)無法兼容、全局變量與靜態(tài)屬性的更改魁莉、main 方法里的更改睬涧、initState方法里的更改、枚舉和泛型的更改等旗唁。

可以發(fā)現(xiàn)畦浓,熱重載提高了調(diào)試 UI 的效率,非常適合寫界面樣式這樣需要反復(fù)查看修改效果的場景检疫。


5宅粥、Flutter 與原生Android、iOS進行通信的原理

Flutter 通過PlatformChannel與原生進行交互电谣,其中 PlatformChannel分為三種:

  • BasicMessageChannel :用于傳遞字符串和半結(jié)構(gòu)化的信息。
  • MethodChannel :用于傳遞方法調(diào)用(method invocation)抹蚀。
  • EventChannel: 用于數(shù)據(jù)流(event streams)的通信剿牺。
Flutter如何將代碼運行在Android上?

引擎的C/C++代碼使用AndroidNDK編譯的,并且框架的大部分和APP代碼作為本地代碼(由Dart編譯器編譯的)運行的环壤。

Flutter如何將代碼運行在iOS上?

引擎的C/C++代碼使用LLVM編譯晒来,并且任何Dart代碼都是AOT編譯成本地代碼。

可以嵌入Flutter視圖到你已經(jīng)存在的AndroidiOSAPP中郑现。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載湃崩,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。
  • 序言:七十年代末接箫,一起剝皮案震驚了整個濱河市攒读,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辛友,老刑警劉巖薄扁,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剪返,死亡現(xiàn)場離奇詭異,居然都是意外死亡邓梅,警方通過查閱死者的電腦和手機脱盲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來日缨,“玉大人钱反,你說我怎么就攤上這事∠痪啵” “怎么了面哥?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長墨礁。 經(jīng)常有香客問我幢竹,道長,這世上最難降的妖魔是什么恩静? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任焕毫,我火速辦了婚禮,結(jié)果婚禮上驶乾,老公的妹妹穿的比我還像新娘邑飒。我一直安慰自己,他們只是感情好级乐,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布疙咸。 她就那樣靜靜地躺著,像睡著了一般风科。 火紅的嫁衣襯著肌膚如雪撒轮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天贼穆,我揣著相機與錄音题山,去河邊找鬼。 笑死故痊,一個胖子當著我的面吹牛顶瞳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播愕秫,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼慨菱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了戴甩?” 一聲冷哼從身側(cè)響起符喝,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎甜孤,沒想到半個月后洲劣,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體备蚓,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年囱稽,在試婚紗的時候發(fā)現(xiàn)自己被綠了郊尝。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡战惊,死狀恐怖流昏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吞获,我是刑警寧澤况凉,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站各拷,受9級特大地震影響刁绒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜烤黍,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一知市、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧速蕊,春花似錦嫂丙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至唉锌,卻和暖如春隅肥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背袄简。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工武福, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人痘番。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像平痰,于是被迫代替她去往敵國和親汞舱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

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