先看看官方的解釋:前端
Flutter is Google’s UI toolkit for building beautiful, natively compiled applications for mobile, web, and desktop from a single codebase.
簡單翻譯一下:web
Flutter是谷歌主導研發的一個UI工具包,能夠利用它,使用很是簡潔的代碼開發出漂亮的、原生的應用程序,不管是在移動端、Web端仍是桌面端。
嗯,加入我的理解:編程
Flutter就是一個UI開發工具包,能夠開發各個平臺,可是目前最活躍的地方依然 移動平臺,雖然他也支持Web、桌面,甚至也將是 Google Fuchsia下開發應用的主要工具。
可是如今,它只是活躍於移動端。
那麼,目前移動平臺主要有哪些呢?沒錯,iOS、Android
!小程序
因而,咱們能夠簡單概述一下Flutter:服務器
Flutter目前被應用最普遍的就是做爲iOS、Android跨平臺解決方案,並且能夠說是目前最優秀的跨平臺解決方案。
它不只僅性能優越
,並且開發很是高效
!
爲何須要這樣一種跨平臺解決方案呢?架構
待會兒我會講到移動端開發的歷史(各端獨立開發到跨平臺開發的出現)以及在整個歷史進程中出現的各個痛點,直到Flutter的出現。app
Google公司在國內作過不少宣講,其中屢次提到Flutter的幾個特色:美觀、快速、高效、開放
。
這部分了解便可,後面學習過程當中,慢慢體會。
美觀框架
使用Flutter內置美麗的Material Design
和Cupertino
widget(什麼是widget,不着急)、豐富的motion API、平滑而天然的滑動效果和平臺感知,爲您的用戶帶來全新體驗。編程語言
固然,在咱們真正學會使用它開發以前,這些東西不能深入的體會,後面你們會慢慢體會到的工具
快速
後面有專門講解爲何性能這麼高,先作一個瞭解便可
Flutter 的 UI 渲染性能很好
。在生產環境下,Flutter 將代碼編譯成機器碼執行,並充分利用 GPU 的圖形加速能力,所以使用 Flutter 開發的移動應用即便在低配手機上也能實現每秒 60 幀的 UI 渲染速度。
Flutter 引擎使用 C++ 編寫,包括高效的 Skia 2D 渲染引擎,Dart 運行時和文本渲染庫。
這個引擎使得 Flutter 框架能夠自由、靈活、高效地繪製 UI 組件。而應用開發者則能夠用 Flutter 框架來輕鬆實現各類設計語言和動畫效果。
高效
對開發者來講,使用 Flutter 開發應用十分高效。
Flutter 廣受好評的 Hot Reload (熱重載)
功能能夠在 1 秒內實現代碼到 UI 的更新,使得開發操做週期被大幅縮短。
另外,熱重載可以在執行的時候保留應用的當前狀態 (即 Stateful),好比您可能在修改一個導航結構裏的子頁面,保留狀態的熱重載可讓您不須要從新從起始頁一路點擊回到這個子頁面,而是在代碼修改完成後即刻看到結果。
開放
Flutter 是開放的
,它是一個徹底開源的項目。全球的開發者均可以避免費使用和拓展 Flutter 的源代碼,併爲 Flutter 的生態和文檔做貢獻。 咱們已經看到許多中國開發者(好比閒魚開發團隊)活躍在社區中,併爲 Flutter 作出了不少貢獻。
目前移動端有兩大系統:iOS和Android
不少公司爲了擴散本身的產品,都須要在兩大系統上跑本身的應用程序App
Android版本的App
iOS版本的App
iOS系統
Objective-C
(沒用過的人會被他的語法嚇到)。Swift
,Swift更加現代化,也更加接近於其餘語言,被認爲是Objective-C的替代品(可是到如今都尚未替代,兩個都在用)。Objective-C和Swift
Android系統
Java
Kotlin
提供最佳支持Java和Kotlin
一般在一個公司,很難讓一我的同時去勝任iOS開發和Android開發兩個崗位,因此在一家公司可能就須要同時有iOS組和Android組分別針對不一樣的系統進行開發。
可是,對於一家小公司來講,這樣的成本是很是高
的。
在很長一段時間內,你們都在需求一種移動端的跨平臺解決方案,但願能夠經過一套代碼開發出能夠同時運行在iOS和Android兩個系統上的應用程序
基於 JavaScript 和 WebView的跨平臺
最先出現的跨平臺框架是基於 JavaScript 和 WebView,表明框架有PhoneGap,Apache Cordova,Ionic 等等。
主要是經過HTML來構建本身的界面,再將其顯示在各個平臺的WebView中。
可是它默認是不能調用本地的一些服務的(好比相機、藍牙等),因此須要經過JavaScript進行橋接調用Native的一些代碼來完成某些功能。
可是,它自己的體驗並不理想,並且開發過程當中的坑很是多。
備受歡迎的React Native
在尋求最佳跨平臺解決方案的過程當中,無疑React Native 是以前
最優秀的一個。
React Native (簡稱RN)是Facebook於2015年4月開源的跨平臺移動應用開發框架,是Facebook早先開源的JS框架 React 在原生移動應用平臺的衍生產物,目前支持iOS和安卓兩大平臺。
RN使用JavaScript語言
,相似於HTML的JSX,以及CSS來開發移動應用,所以熟悉Web前端開發的技術人員只需不多的學習就能夠進入移動應用開發領域。
而且在保留基本渲染能力的基礎上,用原生自帶的 UI 組件實現代替了核心的渲染引擎,從而保證了良好的渲染性能。
可是,因爲RN的本質是經過JavaScript VM調用遠程接口,通訊相對比較低效,並且框架自己不負責渲染,而是是間接經過原生進行渲染的。
還有一個就是在進行iOS和Android適配的過程當中,還要求開發者對兩大系統自己有所熟悉才行。
所在在RN上作出很是多貢獻的Airbnb以前就宣佈放棄RN,而轉向Native進行開發。
多是終極的解決方案: Flutter
從Flutter出現到如今,我我的就一直很是看好,由於它可能纔是咱們好久依賴所期待的跨平臺的終極解決方案。
咱們直接看下面這幅圖來對比flutter - native - rn的區別
具體Flutter如何實現接近於原生的高性能的,下一個章節咱們具體分析。
這個章節設計到一些圖形繪製的原理,對於某些沒有基礎的同窗可能會有一些困難,這個沒有關係,並不影響後續的學習。
問題:一個圖像究竟是如何顯示到屏幕上的呢?
首先,你須要知道,咱們在屏幕上能夠看到的全部內容都是計算機繪製出來的圖像,不管是視頻仍是GIF圖片,仍是操做系統給咱們看到的圖形化界面中的畫面,都是圖像。
好比下面的一個GIF圖片
咱們將它分解出來,就會發現它是不少張圖片連續播放所看到的畫面
可是咱們爲何能看到相似於動畫的效果呢?
這是由於它播放的速度很是快,研究代表:
咱們說回到電腦、手機屏幕的顯示
事實上顯示器就是以固定的頻率顯示圖像的,好比 iPhone的 60Hz、iPad Pro的 120Hz。
一幀圖像繪製完畢後準備繪製下一幀時,顯示器會發出一個垂直同步信號(VSync),因此 60Hz的屏幕就會一秒內發出 60次這樣的信號。
在計算機系統中,CPU、GPU和顯示器以一種特定的方式協做:
固然,Android、iOS 的 UI 渲染過程是如此,Flutter 也是如此,在整個 Flutter 架構中,Flutter 只關心向 GPU 提供顯示數據,並不關心顯示器、視頻控制器以及 GPU 是如何工做的。
GPU
將信號同步到 UI 線程
UI 線程
用Dart
來構建圖層樹
圖層樹
在GPU 線程
進行合成視圖數據
提供給Skia 引擎
Skia 引擎
經過OpenGL 或者 Vulkan
將顯示內容提供給GPU
這也是flutter區別於React Native的本質區別:
Flutter爲何要選擇Dart做爲開發語言?
有一種半開玩笑的說法: 由於Dart團隊就在Flutter團隊的旁邊,溝通起來很是方便(是玩笑,也是事實,dart語言自己針對Flutter進行過不少次的優化)
早期的 Flutter 團隊評估了十多種語言,並選擇了 Dart,由於它符合他們構建用戶界面的方式。
其實針對於前端開發者來講,選擇JavaScript看起來更合適,由於你們的入門成本會更低,會有更多人選擇學習和使用Flutter。
可是Flutter團隊從一開始就決定,不將就
!!!
並不是全部這些功能都是 Dart 獨有的,但它們的組合卻恰到好處,使 Dart 在實現 Flutter 方面獨一無二。所以,沒有 Dart,很難想象 Flutter 像如今這樣強大。
想要了解Flutter的本質,必須先了解它的底層圖像渲染引擎 Skia,前面提到了 Flutter只關心如何構建視圖抽象結構,向 GPU提供視圖數據。Skia就是 Flutter向 GPU提供數據的途徑。
Skia全名Skia Graphics Library(SGL)是一個由C++編寫的開源圖形庫,能在低端設備如手機上呈現高質量的2D圖形,最初由Skia公司開發,後被Google收購,應用於Android、Google Chrome、Chrome OS等等當中。
目前,Skia 已然是 Android 官方的圖像渲染引擎了,所以 Flutter Android SDK 無需內嵌 Skia 引擎就能夠得到自然的 Skia 支持;
而對於 iOS 平臺來講,因爲 Skia 是跨平臺的,所以它做爲 Flutter iOS 渲染引擎被嵌入到 Flutter 的 iOS SDK 中,替代了 iOS 閉源的 Core Graphics/Core Animation/Core Text,這也正是 Flutter iOS SDK 打包的 App 包體積比 Android 要大一些的緣由。
底層渲染能力統一了,上層開發接口和功能體驗也就隨即統一了,開發者不再用操心平臺相關的渲染特性了。也就是說,Skia 保證了同一套代碼調用在 Android 和 iOS 平臺上的渲染效果是徹底一致的。
不少人看到Google的flutter框架的時候,第一反應就是:別出新東西了,實在學不動了
。
可是做爲大前端開發者就是這樣,各類折騰:
客戶端開發者
:從Android到iOS,或者從iOS到Android,到RN,甚至如今愈來愈多的客戶端開發者接觸前端相關知識(Vue、React、Angular、小程序)前端開發者
:從jQuery到AngularJS,到三大框架並行:Vue、React、Angular,還有小程序,甚至如今也要接觸客戶端開發(好比RN、Flutter)大前端開發就是,不像服務器同樣可能幾年甚至幾十年仍是那一套的東西,新技術會層出不窮。
可是每同樣技術的出現都會讓驚喜,由於他必然是解決了以前技術的某一個痛點的,因此咱們要學會擁抱這種變化。
而且不少知識在學習的過程當中,你會發現他們都是相同的,並非說都要從頭再來,最重要的是創建屬於本身的知識體系。
不少人對於學習望而卻步,主要是基於兩點考慮:
dart語言並不複雜,並且很是現代化
flutter並無很是多創新的概念: