Flutter學(xué)習(xí)筆記(1)

引言

說到Flutter缔俄,絕對繞不開Fuchsia挖炬,這個是谷歌開發(fā)的一款全新的操作系統(tǒng)Fuchsia內(nèi)核是Magenta Kernel,一個基于LittleKernel的項(xiàng)目。該系統(tǒng)與Android相比,無論是存儲器還是內(nèi)存之類的硬件要求都大幅降低项炼,外界推論是一款面向物聯(lián)網(wǎng)的系統(tǒng),具體是做什么的目前不得而知,但這不是我們所講的重點(diǎn)

What Is Flutter?

官方介紹

  • 快速開發(fā):Flutter的熱重載可以快速地進(jìn)行測試、構(gòu)建UI、添加功能并更快地修復(fù)錯誤。
  • 富有表現(xiàn)力,漂亮的用戶界面:自帶的Material Design和Cupertino(iOS風(fēng)格)widget、豐富的motion API吨述、平滑而自然的滑動效果亿笤。
  • 響應(yīng)式框架:使用Flutter的現(xiàn)代燃领、響應(yīng)式框架猛蔽,和一系列基礎(chǔ)widget叮称,輕松構(gòu)建您的用戶界面。
  • 訪問本地功能和SDK:Flutter可以復(fù)用現(xiàn)有的Java、Swift或ObjC代碼绍移,訪問iOS和Android上的原生系統(tǒng)功能和系統(tǒng)SDK横媚。
  • 統(tǒng)一的應(yīng)用開發(fā)體驗(yàn):Flutter擁有豐富的工具和庫狡忙,可以幫助開發(fā)者輕松地同時在iOS和Android系統(tǒng)中實(shí)現(xiàn)想法和創(chuàng)意。
  • 原生性能:Flutter包含了許多核心的widget淑廊,如滾動逗余、導(dǎo)航、圖標(biāo)和字體等季惩,這些都可以在iOS和Android上達(dá)到原生應(yīng)用一樣的性能录粱。

定義

  • Flutter是Google一個新的用于構(gòu)建跨平臺的手機(jī)App的SDK

  • 跨平臺應(yīng)用的框架腻格,沒有使用WebView或者系統(tǒng)平臺自帶的控件,使用自身的高性能渲染引擎自繪

  • 簡化版的瀏覽器啥繁,最大限度在android和ios上統(tǒng)一UI菜职,包括業(yè)務(wù)邏輯和用戶體驗(yàn)

  • 開發(fā)語言使用dart,結(jié)合C, C++, 和Skia(2D渲染引擎)構(gòu)建

  • 支持hot reload旗闽,包含著完整的控件和工具鏈

  • 一切皆控件酬核,控件是每個Flutter應(yīng)用程序的基本構(gòu)建塊,與分離視圖适室、控制器嫡意、布局和其他屬性的框架不同,F(xiàn)lutter具有一致的統(tǒng)一對象模型:控件捣辆。一個控件可以定義:結(jié)構(gòu)元素(比如按鈕或菜單)蔬螟、風(fēng)格元素(比如字體或顏色方案)、布局的方面(比如填充)、一些業(yè)務(wù)邏輯等

  • 組合大于繼承,控件本身通常由許多小型队塘、單用途的控件組成,結(jié)合起來產(chǎn)生強(qiáng)大的效果菠齿,類的層次結(jié)構(gòu)是扁平的,以最大化可能的組合數(shù)量

  • 強(qiáng)化版的WebView坐昙,框架僅提供一個View層,大部分功能要依賴原生

  • 目前只能夠運(yùn)行大部分Dart代碼(不能引入dart:mirrors或dart:html庫)

核心原則

Flutter 包含了一個函數(shù)響應(yīng)式框架( functional-reactive framework)芋忿、一個 2D 渲染引擎炸客、直接可用的 Widget 庫、和各種開發(fā)工具戈钢。這些組件在一起配合使用痹仙,來幫助你設(shè)計、開發(fā)殉了、測試和調(diào)試 應(yīng)用开仰。這些功能都圍繞幾個核心的原則來實(shí)現(xiàn)的。

Why Flutter薪铜?

高生產(chǎn)率

  • 一套代碼可以開發(fā)出 Android 和 iOS 應(yīng)用
  • 同樣的功能只需要很少的代碼众弓,如果你只開發(fā)一個平臺的應(yīng)用,使用 時髦的隔箍、更具有表達(dá)性的開發(fā)語言谓娃,也可以讓你用更少的代碼來實(shí)現(xiàn)同樣的功能。
  • 開發(fā)原型和迭代更加方便
  • 在 應(yīng)用運(yùn)行的時候就可以修改代碼并重新加載修改后的功能
  • 直接修改崩潰的 bug蜒滩,然后繼續(xù)從崩潰的地方執(zhí)行調(diào)試

創(chuàng)建優(yōu)雅的滨达、可定制的用戶界面

  • Flutter 內(nèi)置了對紙墨設(shè)計(Material Design)的支持奶稠,提供了豐富的 UI 控件庫可以用來創(chuàng)建紙墨設(shè)計風(fēng)格的 UI
  • 提供了可定制的 UI 框架,不再受制于手機(jī)平臺控件的支持

Flutter SDK體積為什么非常大捡遍?

  • Flutter應(yīng)用的體積由兩部分組成:應(yīng)用代碼和 SDK代碼锌订。應(yīng)用代碼是 Dart編譯后的代碼,如果做成可動態(tài)下發(fā)画株,那么這部分可以不計辆飘。 SDK代碼比較大就有點(diǎn)無奈了,SDK的組成部分有 Dart VM污秆,Dart標(biāo)準(zhǔn)庫劈猪,libwebp、libpng良拼、libboringssl等第三方庫战得,libskia,Dart UI庫庸推,然后再加上 icu_data常侦,可能在單 arch下(iOS),SDK體積達(dá)到 40+MB贬媒。其中僅僅 Dart VM(不包含標(biāo)準(zhǔn)庫)就達(dá)到了 7MB聋亡。 Flutter SDK是 dynamic framework,如此大的二進(jìn)制體積可能會造成動態(tài)鏈接耗時長际乘。而如果靜態(tài)鏈接坡倔,可能原來比較大的 App很有可能造成 TEXT段超標(biāo)。

How Flutter?

運(yùn)行機(jī)制

Flutter 應(yīng)用運(yùn)行在一個用 C++ 寫的引擎中脖含,F(xiàn)lutter 應(yīng)用可以看做是一個游戲 App罪塔,代碼都是在引擎中運(yùn)行。

Android
  • 引擎的C或C++代碼是由Android NDK編譯的养葵,而框架的主要代碼和應(yīng)用的代碼由Dart compiler編譯成native code執(zhí)行的征堪。

  • 對于Android應(yīng)用來說,F(xiàn)lutter框架在引擎中實(shí)現(xiàn)了一個繼承于SurfaceView的 FlutterView关拒。用戶所看到的UI都是在這個SurfaceView中顯示佃蚜。如果要和原生平臺功能交互,則可以在Activity中使用FlutterView着绊,并通過Flutter提供的消息API和原生平臺收發(fā)消息谐算。

ios
  • 引擎的C或C++代碼是由LLVM編譯的,而所有Dart的代碼會被AOT編譯成native code畔柔,整個APP運(yùn)行時使用的是機(jī)器指令(并不是攔截器)氯夷。

系統(tǒng)架構(gòu)

層次結(jié)構(gòu).png
  • Flutter Framework: 這是一個純 Dart實(shí)現(xiàn)的 SDK,類似于 React在 JavaScript中的作用靶擦。它實(shí)現(xiàn)了一套基礎(chǔ)庫腮考, 用于處理動畫雇毫、繪圖和手勢。并且基于繪圖封裝了一套 UI組件庫踩蔚,然后根據(jù) Material 和Cupertino兩種視覺風(fēng)格區(qū)分開來棚放。這個純 Dart實(shí)現(xiàn)的 SDK被封裝為了一個叫作 dart:ui的 Dart庫。我們在使用 Flutter寫 App的時候馅闽,直接導(dǎo)入這個庫即可使用組件等功能飘蚯。

  • Flutter Engine: 這是一個純 C++實(shí)現(xiàn)的 SDK,其中囊括了 Skia引擎福也、Dart運(yùn)行時局骤、文字排版引擎等。不過說白了暴凑,它就是 Dart的一個運(yùn)行時峦甩,它可以以 JIT、JIT Snapshot 或者 AOT的模式運(yùn)行 Dart代碼现喳。在代碼調(diào)用 dart:ui庫時凯傲,提供 dart:ui庫中 Native Binding 實(shí)現(xiàn)。 不過別忘了嗦篱,這個運(yùn)行時還控制著 VSync信號的傳遞冰单、GPU數(shù)據(jù)的填充等,并且還負(fù)責(zé)把客戶端的事件傳遞到運(yùn)行時中的代碼灸促。


    Flutter圖形管道.png
  • 整個 Flutter Engine可以粗略地劃分為三個部分:Dart UI诫欠、Runtime、Shell


    Runtime.png
Flutter渲染管道.png

控件生命周期.png

狀態(tài)生命周期.png

繪制流程

入口
  • 界面的布局和繪制在每一幀都在發(fā)生著浴栽,甚至界面沒有變化呕诉,它也會存在;可以想象每一幀里面吃度,引擎都像流水線的一樣重復(fù)著幾個過程:build(構(gòu)建控件樹),layout(布局), paint(繪制)和 composite(合成)贴硫,周而復(fù)始椿每。驅(qū)動整個流水線的入口是WidgetBinding.drawFrame方法。
 void drawFrame() {
    ...
    try {
      if (renderViewElement != null)
        buildOwner.buildScope(renderViewElement);
      super.drawFrame();
      buildOwner.finalizeTree();
    } finally {
     ...
    }
    ...
  } 
布局約束
  • 根據(jù)parent給予的約束條件來計算size英遭,而設(shè)置size只能在performResize或者performLayout中進(jìn)行间护,如果設(shè)置sizedByParent為true,則只能在performResize中進(jìn)行挖诸,否則就只能在performLayout中與child的布局同時進(jìn)行汁尺。
Layer層
Flutter Layer.png

Read More

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市多律,隨后出現(xiàn)的幾起案子痴突,更是在濱河造成了極大的恐慌搂蜓,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辽装,死亡現(xiàn)場離奇詭異帮碰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)拾积,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門殉挽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拓巧,你說我怎么就攤上這事斯碌。” “怎么了肛度?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵傻唾,是天一觀的道長。 經(jīng)常有香客問我贤斜,道長策吠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任瘩绒,我火速辦了婚禮猴抹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锁荔。我一直安慰自己蟀给,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布阳堕。 她就那樣靜靜地躺著跋理,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恬总。 梳的紋絲不亂的頭發(fā)上前普,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機(jī)與錄音壹堰,去河邊找鬼拭卿。 笑死,一個胖子當(dāng)著我的面吹牛贱纠,可吹牛的內(nèi)容都是我干的峻厚。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼谆焊,長吁一口氣:“原來是場噩夢啊……” “哼惠桃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤辜王,失蹤者是張志新(化名)和其女友劉穎劈狐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體誓禁,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡懈息,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了摹恰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辫继。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖俗慈,靈堂內(nèi)的尸體忽然破棺而出姑宽,到底是詐尸還是另有隱情,我是刑警寧澤闺阱,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布炮车,位于F島的核電站,受9級特大地震影響酣溃,放射性物質(zhì)發(fā)生泄漏瘦穆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一赊豌、第九天 我趴在偏房一處隱蔽的房頂上張望扛或。 院中可真熱鬧,春花似錦碘饼、人聲如沸熙兔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽住涉。三九已至,卻和暖如春钠绍,著一層夾襖步出監(jiān)牢的瞬間舆声,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工柳爽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纳寂,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓泻拦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親忽媒。 傳聞我的和親對象是個殘疾皇子争拐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345