Flutter是Google推出并開(kāi)源的移動(dòng)應(yīng)用開(kāi)發(fā)框架杨箭,主打跨平臺(tái)赢赊、高保真乙漓、高性能。開(kāi)發(fā)者可以通過(guò) Dart語(yǔ)言開(kāi)發(fā)App释移,一套代碼同時(shí)運(yùn)行在iOS和Android平臺(tái)叭披。 Flutter提供了豐富的組件、接口玩讳,開(kāi)發(fā)者可以很快地為 Flutter添加native擴(kuò)展涩蜘。目前Flutter默認(rèn)支持iOS、Android熏纯、Fuchsia(Google新的自研操作系統(tǒng))三個(gè)移動(dòng)平臺(tái)同诫。但Flutter也支持Web開(kāi)發(fā)(Flutter for web)和PC開(kāi)發(fā)。
跨平臺(tái)自繪引擎
Flutter使用Skia作為其2D渲染引擎豆巨,Skia是Google的一個(gè)2D圖形處理函數(shù)庫(kù)剩辟,包含字型、坐標(biāo)轉(zhuǎn)換往扔,以及點(diǎn)陣圖都有高效能且簡(jiǎn)潔的表現(xiàn)贩猎,Skia是跨平臺(tái)的,并提供了非常友好的API萍膛,目前Google Chrome瀏覽器和Android均采用Skia作為其繪圖引擎吭服。
高性能
Flutter APP采用Dart語(yǔ)言開(kāi)發(fā)。Dart在JIT(即時(shí)編譯)模式下蝗罗,速度與JavaScript基本持平艇棕。但是Dart支持AOT,當(dāng)以AOT模式運(yùn)行時(shí)串塑,JavaScript便遠(yuǎn)遠(yuǎn)追不上了沼琉。同時(shí),F(xiàn)lutter使用自己的渲染引擎來(lái)繪制UI桩匪,布局?jǐn)?shù)據(jù)等由Dart語(yǔ)言直接控制打瘪,所以在布局過(guò)程中不需要像RN那樣要在JavaScript和Native之間通信。
ps:程序主要有兩種運(yùn)行方式:靜態(tài)編譯與動(dòng)態(tài)解釋傻昙。靜態(tài)編譯的程序在執(zhí)行前全部被翻譯為機(jī)器碼闺骚,通常將這種類(lèi)型稱(chēng)為AOT (Ahead of time)即 “提前編譯”;而解釋執(zhí)行的則是一句一句邊翻譯邊運(yùn)行妆档,通常將這種類(lèi)型稱(chēng)為JIT(Just-in-time)即“即時(shí)編譯”僻爽。
框架結(jié)構(gòu)
下面是Flutter官方提供的Flutter框架圖- Flutter Framework
Foundation和Animation、Painting贾惦、Gestures被合并為一個(gè)dart UI層胸梆,對(duì)應(yīng)的是Flutter中的dart:ui包敦捧,它是Flutter引擎暴露的底層UI庫(kù),提供動(dòng)畫(huà)乳绕、手勢(shì)及繪制能力
Rendering绞惦,這一層是一個(gè)抽象的布局層,它依賴(lài)于dart UI層洋措,Rendering層會(huì)構(gòu)建一個(gè)UI樹(shù)济蝉,當(dāng)UI樹(shù)有變化時(shí),會(huì)計(jì)算出有變化的部分菠发,然后更新UI樹(shù)王滤,最終將UI樹(shù)繪制到屏幕上。Rendering層可以說(shuō)是Flutter UI框架最核心的部分滓鸠,它除了確定每個(gè)UI元素的位置雁乡、大小之外還要進(jìn)行坐標(biāo)變換、繪制(調(diào)用底層dart:ui)糜俗。
Widgets層是Flutter提供的的一套基礎(chǔ)組件庫(kù)踱稍,在基礎(chǔ)組件庫(kù)之上,F(xiàn)lutter還提供了Material和Cupertino兩種視覺(jué)風(fēng)格的組件庫(kù)悠抹。 - Flutter Engine
這是一個(gè)純C++實(shí)現(xiàn)的SDK珠月,其中包括了Skia引擎、Dart運(yùn)行時(shí)楔敌、文字排版引擎等啤挎。在代碼調(diào)用 dart:ui庫(kù)時(shí),調(diào)用最終會(huì)走到Engine層卵凑,然后實(shí)現(xiàn)真正的繪制邏輯庆聘。