Android跨平臺:請收好這份快速入門Flutter的學習指南!

image.png

前言

  • Flutter 作為Google出品的一個新興的跨平臺移動客戶端UI開發框架,正在被越來越多的開發者和組織使用,包括阿里的咸魚、騰訊的微信等。

    示意圖

  • 今天,我將獻上一份《全面 & 詳細的Flutter學習指南》,希望你們會喜歡。

示意圖

目錄

示意圖

1. 簡介

  • 定義:一款Google出品&開源的移動客戶端UI開發框架(SDK)
  • 作用:用一套代碼同時在Android、iOS上快速構建高質量、高性能的原生用戶界面
  • 開發語言:Dart語言(高開發效率、高性能等)

2. 特點

  • Flutter的主要特點包括:使用自身的高性能渲染引擎進行渲染 & Dart編程語言語言
  • 具體介紹如下:

2.1 高性能渲染引擎

  • Flutter進行UI繪制時,使用的是自帶的高性能渲染引擎進行繪制渲染(不使用WebView & 原生控件)
  • 好處:保證在Android和iOS上UI的一致性 & 避免對原生控件依賴而帶來的限制和維護成本。
  • 組成:C、C ++、Dart、Skia(2D渲染引擎),具體描述如下:
示意圖

特別注意:

  • Flutter依靠Flutter Engine虛擬機在iOS和Android上運行
  • Flutter Engine使用C/C++編寫 = 低延遲輸入 + 高幀速率
  • 開發人員可通過Flutter框架和API在內部進行交互

下面,簡單介紹一下Flutter的2D渲染引擎:Skia


示意圖

2.2 Dart語言

  • 介紹Dart語言前先介紹兩個概念:JIT和AOT。程序主要有兩種運行方式:靜態編譯 & 動態編譯,具體如下:


    示意圖

特別注意:

  • JIT 和 AOT指的是程序運行方式,和編程語言并非強關聯的。
  • 有些語言可以以JIT方式 & AOT方式一起運行,如Java,它可在第一次執行時編譯成中間字節碼、然后在之后執行時可以直接執行字節碼
  • 通常區分是否為AOT的標準就是看代碼在執行之前是否需要編譯,只要需要編譯,無論其編譯產物是字節碼還是機器碼,都屬于AOT

Dart語言的特點

  • Dart語言具備開發效率高、高性能 & 類型安全的特點
  • 具體如下:


    示意圖

3. 原理解析

3.1 框架結構

Flutter框架主要分為三層

  • 框架層(FrameWork)
  • 引擎層(Engine)
  • 嵌入層(Embedder)
image.png

3.2 原理概述

  • 開發時,主要基于Framework層;運行時,則是運行在 Engine上

  • Engine是Flutter的獨立虛擬機,由它適配 & 提供跨平臺支持;因為其存在,Flutter不使用移動端系統的原生控件, 而是使用自己 Engine 來繪制 Widget (Flutter的顯示單元); Dart 代碼是通過 AOT 編譯為平臺的原生代碼,所以 Flutter可直接與平臺通信,不需要JS引擎的橋接。

  • 同時 Flutter 唯一要求系統提供的是 canvas,以實現UI的繪制。


    示意圖
  • 編譯時,具體如下:


    示意圖

3.3 關于widget

Flutter理念:“一切皆為Widget”,Widget是Flutter應用程序用戶界面的基本構建塊,具備以下特點:

  • 屬于具有一致性的統一對象模型,與其他將視圖、控制器、布局和其他屬性分離的框架不同。更新widget時更加高效
  • 不可變的,僅支持一幀,且每一幀上不會直接更新,要更新而必須使用Widget的狀態。無狀態和有狀態Widget 的核心特性相同,每一幀都會重新構建;
  • 有一個State對象,用于跨幀存儲狀態數據 & 恢復

4. 特點

  • Flutter具備跨平臺、開發效率高 & 高性能的特點
  • 具體說明如下:

4.1 跨平臺 & 開發效率高

Flutter通過使用上述所述的自身渲染引擎、原理框架 & Widget運行,使用一套代碼即可同時構建iOS和Android應用,從而實現跨平臺的特性,最終提高開發的效率

4.2 高性能

  • 原因1:通過其自帶的高性能渲染引擎進行渲染
  • 原因2:Dart語言本身的語言特性
  • 原因3:編譯過程特點,具體如下:


    示意圖

5. 對比

  • 跨平臺開發的本質是為了:增加代碼復用、減少不同平臺差異適配的工作量 & 提高開發效率。
  • 目前主流的跨平臺開發框架有:React-Native、Weex和本文提及的Flutter。下面,我先簡單介紹React-Native和Weex,再進行三者的對比。
示意圖

5.1 React-Native

  • 簡介
    由Facebook出品,采用了JavaScript語言、JSCore引擎和通過原生渲染的跨平臺框架

  • 實現原理
    通過編寫JavaScript語言代碼,通過 React Native 的中間層來調用 Native端的組件,最終實現相應的功能。JS端中所寫控件的作用類似 Map中的key 值,對應著Native端的對應控件(如 Android 中<view> 標簽對應 ViewGroup 控件)。JS端會通過多個key 組合成Dom,最后交由Native端進行解析,最終渲染出Native端的控件。


    示意圖
  • 實現框架
    React Native的架構主要由三層實現。其中最重要的是由C++ 實現的中間適配層,此處最主要封裝了JavaScriptCore用于執行JS的解析,最終實現了JS端與原生端的雙向通信交互。而React Native運行在JavaScriptCore中。(在iOS上直接使用內置的javascriptcore、在Android則使用webkit.org官方開源的jsc.so)

示意圖

5.2 Weex

  • 簡介
    由Alibaba出品,采用了JavaScript語言、JS V8引擎和通過原生渲染的跨平臺框架

  • 實現原理
    與React-Native類似,JS端會通過多個key組合成Dom,最后交由Native端進行解析,最終渲染出Native端的控件,但區別在于:Weex是可以跨三端的 = Android、iOS、Web,其原因在于在開發過程中,代碼模式、編譯過程、模板組件、數據綁定、生命周期等上層語法是一致,不同的是Web端和Native端對Virtual DOM 執行的解析方法有所區別。


    示意圖
  • 實現框架
    weex的架構主要分為三部分,具體如下:


    示意圖

5.3 三者對比

示意圖

注:對于性能的對比,從理論上來說Flutter應該是最接近原生性能 & 最好的,但就目前實際應用&體驗中并沒具備很明顯的差異化,后續需進行進一步的驗證。


6. 學習方式 & 資料

  • 官網:https://flutter.dev/
    快速入門 & 學習最好的方式是:閱讀Flutter官網的資源,同時官網也是了解最新Flutter發展動態的地方
  • Flutter中文網社區:https://flutterchina.club
    目前Flutter最大的中文資源社區,提供了:Flutter官網文檔翻譯、開源項目 & 案例等學習資源
  • StackOverflow:https://stackoverflow.com/
    活躍度最高的Flutter問答社區,Flutter開發團隊的成員也經常會在上面回答問題
  • 源碼:https://flutter.dev/docs/development/tools/sdk/releases
    Flutter SDK的源碼具備以下特點:開源、示例 & 詳細注釋,Gallery是Flutter官方示例APP,其源碼在Flutter源碼“examples”目錄下

7. 總結

本文全面介紹了Flutter入門學習知識,接下來推出的文章,我將繼續講解Flutter的相關知識,包括使用語法、實戰等,感興趣的讀者可以繼續關注我的博客哦:Carson_Ho的Android博客


請點贊!因為你們的贊同/鼓勵是我寫作的最大動力!

相關文章閱讀
Android開發:最全面、最易懂的Android屏幕適配解決方案
Android開發:史上最全的Android消息推送解決方案
Android開發:最全面、最易懂的Webview詳解
Android開發:JSON簡介及最全面解析方法!
Android四大組件:Service服務史上最全面解析
Android四大組件:BroadcastReceiver史上最全面解析


歡迎關注Carson_Ho的簡書!

不定期分享關于安卓開發的干貨,追求短、平、快,但卻不缺深度

參考文章:
https://flutterchina.club/
https://juejin.im/post/5ad6b8db6fb9a028c42eb90a
https://book.flutterchina.club/chapter1/flutter_intro.html
https://juejin.im/post/5afd77466fb9a07aab2a12da
http://www.lxweimin.com/p/7e0bd4708ba7
https://juejin.im/post/5b3c8a4be51d4519935860d5

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,732評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,214評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,781評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,588評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,315評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,699評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,698評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,882評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,441評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,189評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,388評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,933評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,613評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,023評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,310評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,112評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,334評論 2 377

推薦閱讀更多精彩內容