何爲Flutter
Flutter是個構建跨平臺的手機App的SDK。目標是一份代碼,在Android 和iOS平臺上都可以運行。事實上,Flutter更強大,web, 桌面版應用開發也支持
Web, Desktop目前已經ok, Embedded嵌入式平臺還只沒到落地的階段。
Flutter的主要目標還是移動開發,Flutter對標的是React Native, Weex等跨平臺開發框架。它們之間的比較如下
系統架構
Mobile平臺的架構
Web平臺的架構
不同平臺相同的公共部分就是Dart部分,Dart Framework。
所以Flutter的公共部分主要實現了兩個邏輯:
1)Dart Flutter Ui系統
開發人員可以通過Flutter Ui系統編寫UI
2)Dart語言和Dart虛擬機
使用Dart虛擬機及Dart語言可以編寫跟平臺資源無關的邏輯。
同時這也是Flutter跨平臺的核心,和Java程序可以在Linux,Window,MacOs同時運行, Web程序可以在任意平臺運行類似。通過Dart虛擬機,UI及和系統無光的邏輯都可以用Dart語言編寫,運行在Dart虛擬機中,是跨平臺的。
Flutter架構的優缺點
-
跨平臺框架橫向比
Dart語言
和React Native, Weex使用JS(系列)作爲開發語言不同,Flutter重造了一種語言Dart。js的開發人員數量龐大,所以學習成本低,而Dart作爲新語言肯定學習成本高。那Flutter爲什麼要新造輪子呢?主要有這幾個方面的因素吧
1)做過js的dev應該都知道js寫起來舒服,出了問題調試起來要命,而 Dart目前調試體驗還是很好的
2) 爲未來準備(Fusion)
熱更新
目前Flutter還不支持熱更新,react native支持,這個估計後期Flutter社區會補充掉這個功能,其實目前就有jscore項目,就是想通過實現js佈局到flutter佈局的轉換來曲線實現熱更新。
-
Android 原生開發比
Flutter支持Hot reload
做過Android開發同學估計都知道,當Android項目很大時,編譯一次要好幾分鐘,調試的痛苦大家都懂得, 而Flutter項目,開發者ctr + s 修改的代碼立馬生效並反映到程序裏,調試效率提升是指數級別的。
Flutter控件粒度更細
比如背景,毛玻璃,圓角頭像都有相應的控件,直接使用即可,UI開發相對變簡單了
Dart語言異常強大
集合了python c++ javascript和object-c和java等諸多語言的語法特性,有非常豐富的語法糖, 儘管java8也新增了很多新的feature, 但還是小巫見大巫,Flutter比Java的開發效率高非常多。
比如類的變量直接作爲構造參數,不需要編寫賦值語句
比如鏈式調用編程
開發人員不需要自己設計鏈式調用,Dart通過關鍵詞..直接在編譯時幫你做到了鏈式調用效果。
再比如異步編碼
通過Futrue類,async,await關鍵詞實現異步及同步編碼,so easy。該機制和js Es裏的效果是一模一樣, Future和js的promise類似。js的async, await底層原理可查看我的這篇文章【徹底理解Async/Await 原理分析】,進而可以理解Flutter的await, async。
-
Flutter的缺點總結起來
1)需要學習成本
2)生態還不夠完善,庫資源不夠豐富且庫存在不少Bug
3) 增加App的大小
libflutter.so等框架文件新增了4M空間,如果是多arch支持比如也支持arm64,那就是double or tripple
Flutter UI繪製框架
所有的Ui系統都有一個承載UI顯示內容像素的一段Buffer。Flutter也不另外,具體到Android平臺,Flutter是利用Android的SurfaceView, SurfaceView有自己獨立的buffer,且能非常方便通過OpenGl來繪製這塊buffer。
繪製的具體詳細機制,後面我會單獨寫一篇文章。
Flutter Native通信機制Platform Channel
我們知道一個應用光有代碼邏輯是不行的,得有和用戶交互的輸入和輸出。輸入就是比如觸摸事件,攝像頭數據,sensor數據等等,輸出就是比如顯示,聲音等等,這些你可以總結爲終端設備資源。Flutter運行在Dart虛擬機下,是沒法直接訪問這些資源的,在Android設備上就是需要Android代碼來做這個事。因而Flutter需要有和Android代碼通信的機制,但是Flutter代碼在dart虛擬機裏,Android代碼在dalvik虛擬機下,兩個虛擬機之間怎麼通信呢?
我們先來看下一般的Linux的進程間通信是怎麼實現的
比如上圖,如果App1想要修改App2的mData2變量,只需通過系統調用進入操作系統內核讓內核來修改App2的mData2變量。
Dart虛擬機和Dalvilk虛擬機的通信類似
Dart代碼進入調用host代碼的方式就是platform channel
後記
如果是Android的開發同學,那推薦大家都可以學習Flutter, 至少要體驗體驗, 如果是前端開發者,也建議看看,這是你們從前端切入底層機制的入口,同時畢竟Flutter可能是未來的一個方向。期待它能最終能夠成爲一個成熟廣泛使用的框架。
/**************************************************
* 本文來自CSDN博主"一點碼客",喜歡請頂部點擊關注
* 轉載請標明出處:http://blog.csdn.net/itchosen
***************************************************/
如需實時查看更多更新文章,請關注公衆號"一點碼客",一起探索技術