E-moss,程序員,愛好閱讀和擼狗,主要從事iOS開發工做,公衆號:知本集。
主要分享和編寫技術方面文章,不按期分享讀書筆記,亦可訪問「知本集」Git地址:https://github.com/knowtheroot/KnowTheRoot_iOS,歡迎提出問題和討論。
複製代碼
目前hybrid開發模式:前端
1.經過WebView來進行原生和web交互git
2.爲了解決WebView性能差的問題,以React Native爲表明的一類框架將最終渲染工做交還給了系統,雖然一樣使用類HTML+JS的UI構建邏輯,可是最終會生成對應的自定義原生控件,以充分利用原生控件相對於WebView的較高的繪製效率。程序員
Flutter的架構主要分紅三層:github
Framework使用dart實現,包括:web
Widgets:能夠理解爲組件。bash
Engine使用C++實現,主要包括:前端框架
Skia是開源的二維圖形庫,提供了適用於多種軟硬件平臺的通用API。架構
Embedder是一個嵌入層。
即把Flutter嵌入到各個平臺上去,這裏作的主要工做包括渲染Surface設置,線程設置,以及插件等。從這裏能夠看出,Flutter的平臺相關層很低,平臺(如iOS)只是提供一個畫布,剩餘的全部渲染相關的邏輯都在Flutter內部,這就使得它具備了很好的跨端一致性。框架
從架構圖能夠看出,從頭至尾重寫一套跨平臺的UI框架,包括UI控件、渲染邏輯甚至開發語言。
1.渲染引擎依靠跨平臺的Skia圖形庫來實現,依賴系統的只有圖形繪製相關的接口,能夠在最大程度上保證不一樣平臺、不一樣設備的體驗一致性;
2.邏輯處理使用支持AOT的Dart語言,執行效率也比JavaScript高得多。less
目前上主流的思想,都但願將各個ui控件解耦,慢慢演變出組件化的思想。
Flutter控件主要分爲兩大類:
顧名思義,StatelessWidget是狀態不可變的widget。初始狀態設置之後就不可再變化。若是須要變化須要從新建立。
當傳入數據改變時會從新渲染UI。
StatelessWidget用來展現靜態的文本或者圖片。
當傳入數據和本類數據改變時StatefulWidget都會從新渲染UI。
若是控件須要根據外部數據或者用戶操做來改變的話,就須要使用StatefulWidget。
State的概念來源於Facebook的流行Web框架React,React風格的框架中使用控件樹和各自的狀態來構建界面,當某個控件的狀態發生變化時由框架負責對比先後狀態差別而且採起最小代價來更新渲染結果。
Flutter是經過引入了State來保存狀態。
當State的狀態改變時,能從新構建本節點以及孩子的Widget樹來進行UI變化。若是須要主動改變State的狀態,須要經過setState()方法進行觸發,單純改變數據是不會引起UI改變的。
Flutter界面渲染過程分爲三個階段:
佈局和繪製在**Flutter框架(Framework)中完成,合成則交由引擎(Engine)**負責。
詳細的渲染原理將在《Flutter技術原理詳解》講解。
RN的渲染機制是基於前端框架的考慮,複雜的UI渲染是須要依賴多個view疊加。
例如渲染一個複雜的ListView,每個小的控件,都是一個native的view,而後相互組合疊加,當每次滾到刷新時,性能都是一個巨大的考驗。