Flutter是Google推出並開源的移動應用程序(App)開發框架,主打跨平臺、高保真、高性能。其採用Dart(官網、中文網)語言做爲開發語言,開發者能夠經過Dart語言開發Flutter App,一套代碼可同時運行在iOS和Android平臺上。Flutter提供了豐富的組件、接口,開發者能夠很快地爲Flutter添加原生擴展。前端
Flutter誕生過程:git
Flutter與其餘用於構建App的大多數框架不一樣,由於Flutter既不使用WebView,也不使用平臺(Android、iOS等)的原生控件。相反,Flutter使用本身的高性能渲染引擎來繪製Widget。這樣不只能夠保證在Android和iOS平臺上UI的一致性,並且也能夠避免對原生控件依賴而帶來的限制及高昂的維護成本。程序員
Flutter使用Skia做爲其2D渲染引擎,Skia是Google的一個2D圖形處理函數庫,包含字型、座標轉換以及點陣圖都有高效能且簡潔的表現,Skia是跨平臺的,並提供了很是友好的API,目前Google Chrome瀏覽器和Android均採用Skia做爲其繪圖引擎,值得一提的是,因爲Android系統已經內置了Skia,因此Flutter在打包APK(Android應用安裝包)時,不須要再將Skia打入APK中,但iOS系統並未內置Skia,因此構建iPA時,也必須將Skia一塊兒打包,這也是爲何Flutter APP的Android應用安裝包比iOS應用安裝包小的主要緣由。github
Flutter採用GPU渲染技術,Flutter編寫的應用是能夠達到120fps(每秒傳輸幀數),這也就是說,它徹底能夠勝任遊戲的製做,而咱們常說的RN的性能只能達到60fps,這也算是Flutter的一個超高競爭力,官方宣稱Flutter甚至會超過原生性能。若是你想邁入移動遊戲領域,學習Flutter也是一個很是好的選擇。編程
Flutter高性能主要靠兩點來保證:瀏覽器
這是一個頗有意思,同時具備爭議的問題,在瞭解Flutter爲何選擇了Dart而不是JavaScript以前,咱們先來介紹兩個概念:JIT和AOT。安全
目前,程序主要有兩種運行方式:靜態編譯和動態解釋。框架
AOT程序的典型表明是用C/C++開發的應用,它們必須在執行前編譯成機器碼,而JIT的表明則很是多,如JavaScript、Python等,事實上,全部腳本語言都支持JIT模式。但值得一提的是JIT和AOT指的是程序運行方式,它們和編程語言並不是強關聯,有些語言既能夠以JIT方式運行也能夠以AOT方式運行,如Java、Python,它們能夠在第一次執行時編譯成中間字節碼,而後在以後執行時能夠直接執行字節碼,也許有人會說,中間字節碼並不是機器碼,在程序執行時仍然須要動態將字節碼轉爲機器碼,是的,不過一般咱們區分是否爲AOT的標準就是看代碼在執行以前是否須要編譯,只要須要編譯,不管其編譯產物是字節碼仍是機器碼,都屬於AOT。在此,讀者沒必要糾結於概念,概念就是爲了傳達精神而發明的,只要讀者可以理解其原理便可,正所謂得其神忘其形。編程語言
如今咱們看看Flutter爲何選擇Dart語言?筆者根據官方解釋以及本身對Flutter的理解總結了如下幾條(因爲其它跨平臺框架都將JavaScript做爲其開發語言,因此主要將Dart和JavaScript作一個對比):函數
高性能
Flutter旨在提供流暢、高保真的UI體驗。爲了實現這一點,Flutter須要可以在每一個動畫幀中運行大量的代碼,這意味着須要一種既能提供高性能的語言,又不會出現丟幀的週期性暫停,而Dart支持AOT,在這一點上能夠作的比JavaScript更好。
快速內存分配
Flutter框架使用函數式流,這使得它在很大程度上依賴於底層的內存分配器。所以,擁有一個可以有效的處理瑣碎任務的內存分配器將顯得十分重要,若是Dart語言缺少此功能,Flutter將沒法有效地工做。固然Chrome V8的JavaScript引擎在內存分配上也已經作的很好了,事實上Dart開發團隊的不少成員都是來自Chrome團隊的,因此在內存分配上Dart並不能做爲超越JavaScript的優點,但對於Flutter來講,它須要這樣的特性,而Dart也正好知足而已。
類型安全
因爲Dart是類型安全的語言,支持靜態類型檢測,因此能夠在編譯前發現一些類型的錯誤,並排除潛在問題,這一點對於前端開發者來講可能會更具備吸引力。與之不一樣的,JavaScript是一個弱類型語言,也所以前端社區出現了不少給JavaScript代碼添加靜態類型檢測的擴展語言和工具,如:微軟的TypeScript以及Facebook的Flow。相比之下,Dart自己就支持靜態類型,就是它的一個重要優點。
Dart團隊的支持
因爲有Dart團隊的積極投入,Flutter團隊能夠得到更多、更方便的支持,正如Flutter官網所訴:「咱們正與Dart社區進行密切合做,以改進Dart在Flutter中的使用。例如,當咱們最初使用Dart時,該語言並無提供生成原生二進制文件的工具鏈(工具鏈對於實現可預測的高性能具備很大的幫助),可是如今它實現了,由於Dart團隊專門爲Flutter構建了它。一樣,Dart VM以前已經針對吞吐量進行了優化,但團隊如今正在優化VM的延遲時間,這對於Flutter的工做負載更爲重要。」
下面咱們將對Flutter的框架作一個總體介紹,旨在讓讀者心中有一個總體的印象,這對初學者來講很是重要。若是一會兒便深刻到Flutter中,就會像是一個在沙漠中沒有地圖的人,即便能夠找到一個綠洲,可是他也不會知道下一個綠洲在哪兒。所以,不管學什麼技術,都要先有一張清晰的「地圖」,而咱們的學習過程就是「按圖索驥」,這樣咱們纔不會陷於細節而「目無全牛」。接下來,咱們看一下Flutter官方提供的一張框架結構圖:
這是一個純Dart實現的SDK,它實現了一套基礎庫,自底向上,簡單介紹一下:
dart:ui
包,它是Flutter引擎暴露的底層UI庫,提供動畫、手勢及繪製功能。dart:ui
包)。這是一個純C++實現的SDK,其中包括Skia引擎、Dart運行時和文字排版引擎等。在代碼調用dart:ui
庫時,調用最終會走到Engine層,而後實現真正的繪製邏輯。
Flutter框架自己有着良好的分層設計,本章旨在讓讀者對Flutter總體框架有個大概的印象,相信到如今爲止,讀者已經對Flutter有一個初始印象,在咱們正式動手以前,咱們仍是須要多瞭解一下Flutter的開發語言Dart。