深入理解Flutter之架構篇

何爲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
***************************************************/

如需實時查看更多更新文章,請關注公衆號"一點碼客",一起探索技術

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章