原創(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)進行組織抛姑。包含其他Widget
的widget
被稱為父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)建時提供)外不再依賴于任何其他信息空猜。比如典型的Text
、Row
、Column
辈毯、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ù)掏湾,GPU
的 VSync
信號同步到 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++
代碼使用Android
的NDK
編譯的,并且框架的大部分和APP代碼作為本地代碼(由Dart
編譯器編譯的)運行的环壤。
Flutter如何將代碼運行在iOS上?
引擎的C/C++
代碼使用LLVM
編譯晒来,并且任何Dart
代碼都是AOT
編譯成本地代碼。
可以嵌入Flutter
視圖到你已經(jīng)存在的Android
和iOSAPP
中郑现。