Flutter是什么

1.1 Flutter是什么

1.1.1 Flutter簡介

Flutter是谷歌的移動(dòng)UI框架,可以快速在iOS和Android上構(gòu)建高質(zhì)量的原生用戶界面渐行,一份代碼可以同時(shí)生成iOS和Android兩個(gè)高性能弛针、高保真的應(yīng)用程序叠骑。Flutter目標(biāo)是使開發(fā)人員能夠交付在不同平臺(tái)上都感覺自然流暢的高性能應(yīng)用程序,并且兼容滾動(dòng)行為削茁、排版宙枷、圖標(biāo)等方面的差異掉房。flutter的開發(fā)語言是Dart,如果您使用過Java或JavaScript之類的語言慰丛,則能夠很快上手卓囚,甚至有一些Flutter應(yīng)用是沒有編程經(jīng)驗(yàn)的人寫的!在全世界诅病,F(xiàn)lutter正在被越來越多的開發(fā)者和組織使用哪亿,并且Flutter是完全免費(fèi)、開源的贤笆。

跨平臺(tái)自繪引擎

Flutter與其它大多數(shù)跨平臺(tái)框架不同锣夹,因?yàn)镕lutter既不使用WebView,也不使用操作系統(tǒng)的原生控件苏潜。 相反银萍,F(xiàn)lutter使用自己的高性能渲染引擎來繪制widget。這樣不僅可以保證在Android和iOS上UI的一致性恤左,而且也可以避免對原生控件依賴而帶來的限制及高昂的維護(hù)成本贴唇。

Flutter使用Skia作為其2D渲染引擎,Skia是一個(gè) 2D的繪圖引擎庫飞袋,其前身是一個(gè)向量繪圖軟件戳气,Chrome和 Android均采用 Skia作為繪圖引擎。Skia提供了非常友好的 API巧鸭,并且在圖形轉(zhuǎn)換瓶您、文字渲染、位圖渲染方面都提供了友好纲仍、高效的表現(xiàn)呀袱。Skia是跨平臺(tái)的,所以可以被嵌入到 Flutter的 iOS SDK中郑叠,而不用去研究 iOS閉源的 Core Graphics / Core Animation夜赵。

目前Flutter默認(rèn)支持iOS、Android乡革、Fuchsia(Google新的自研操作系統(tǒng))三個(gè)移動(dòng)平臺(tái)寇僧。但Flutter亦可支持Web開發(fā)(Flutter for web)和PC開發(fā),本書的示例和介紹主要是基于iOS和Android平臺(tái)的沸版,其它平臺(tái)讀者可以自行了解嘁傀。

Flutter的優(yōu)勢

  1. 開發(fā)效率高
    毫秒級的熱重載,修改后视粮,您的應(yīng)用界面會(huì)立即更新细办。使用豐富的、完全可定制的widget在幾分鐘內(nèi)構(gòu)建原生界面馒铃。

  2. 富有表現(xiàn)力和靈活的UI
    快速發(fā)布聚焦于原生體驗(yàn)的功能蟹腾。分層的架構(gòu)允許您完全自定義痕惋,從而實(shí)現(xiàn)難以置信的快速渲染和富有表現(xiàn)力、靈活的設(shè)計(jì)娃殖。

  3. 原生性能
    Flutter包含了許多核心的widget值戳,如滾動(dòng)、導(dǎo)航炉爆、圖標(biāo)和字體等堕虹,這些都可以在iOS和Android上達(dá)到原生應(yīng)用一樣的性能。

Flutter的開發(fā)語言

Flutter采用的是Dart作為開發(fā)框架和widget的語言芬首。

為什么選擇Dart語言赴捞?

Flutter在四個(gè)主要維度進(jìn)行了評估,并考慮了框架作者郁稍、開發(fā)人員和最終用戶的需求等因素赦政。我們發(fā)現(xiàn)不同的語言在不同的層面符合一部分需求,但Dart在所有評估維度上得分都很高耀怜,并且符合我們的所有要求和標(biāo)準(zhǔn)恢着。

Dart運(yùn)行時(shí)和編譯器支持Flutter的兩個(gè)關(guān)鍵特性的組合:

基于JIT的快速開發(fā)周期:允許使用類型的語言進(jìn)行形狀更改和有狀態(tài)的熱重載;

AOT編譯器财破,可生成高效的ARM代碼掰派,可以快速啟動(dòng)并擁有可預(yù)測的生產(chǎn)部署性能。

此外左痢,flutter開發(fā)團(tuán)隊(duì)與Dart社區(qū)密切合作靡羡,Dart社區(qū)正在積極投入資源改進(jìn)Dart在Flutter中的使用。例如俊性,當(dāng)我們采用Dart時(shí)略步,該語言沒有提供生成原生二進(jìn)制文件的工具鏈(這對于實(shí)現(xiàn)可預(yù)測的高性能是很有幫助的),但是現(xiàn)在實(shí)現(xiàn)了磅废,因?yàn)镈art團(tuán)隊(duì)為Flutter構(gòu)建了它纳像。同樣荆烈,DartVM之前已經(jīng)針對吞吐量進(jìn)行了優(yōu)化拯勉,但團(tuán)隊(duì)現(xiàn)在正在優(yōu)化VM的延遲時(shí)間,這對于Flutter的工作負(fù)載更為重要憔购。

Dart在以下主要標(biāo)準(zhǔn)上得到高分:

開發(fā)人員的效率 Flutter的主要價(jià)值主張之一是通過讓開發(fā)人員使用相同的代碼庫為iOS和Android創(chuàng)建應(yīng)用程序宫峦,從而節(jié)省了工程資源。使用高效的語言可以進(jìn)一步加速開發(fā)周期玫鸟,并使Flutter更具吸引力导绷。這對我們的framework團(tuán)隊(duì)和開發(fā)人員都非常重要。大部分Flutter功能都是用Dart實(shí)現(xiàn)屎飘,因此我們需要在10萬行代碼時(shí)能保持高效的而不會(huì)犧牲framework和widget的可讀性妥曲。

面向?qū)ο?/strong>雖然我們可以使用非面向?qū)ο蟮恼Z言贾费,但這意味著要重新解決幾個(gè)難題。另外檐盟,絕大多數(shù)開發(fā)人員都具有面向?qū)ο箝_發(fā)的經(jīng)驗(yàn)褂萧,因此更容易學(xué)習(xí)如何使用Flutter進(jìn)行開發(fā)。

可預(yù)測葵萎,高性导犹。借助Flutter,我們希望使開發(fā)人員能夠快速創(chuàng)建流暢的用戶體驗(yàn)羡忘。為了實(shí)現(xiàn)這一點(diǎn)谎痢,我們需要能夠在每個(gè)動(dòng)畫幀中運(yùn)行大量的代碼。這意味著我們需要一種既能提供高性能又能提供可預(yù)測性能的語言卷雕,而不會(huì)出現(xiàn)會(huì)導(dǎo)致丟幀的周期性暫停节猿。

快速內(nèi)存分配 Flutter框架使用函數(shù)式流,它很大程度上依賴于底層的內(nèi)存分配器漫雕,從而有效地處理小的沐批、短期的內(nèi)存分配會(huì)非常重要,所以在缺乏此功能的語言中Flutter無法有效地工作蝎亚。

1.1.2 Flutter框架結(jié)構(gòu)

Flutter框架是一個(gè)分層的結(jié)構(gòu)九孩,每個(gè)層都建立在前一層之上。

1-1.png

這個(gè)設(shè)計(jì)的目標(biāo)是幫助你用更少的代碼做更多的事情发框。例如躺彬,Material層是通過組合來自Widget層的基本W(wǎng)idget來構(gòu)建的, 并且Widgets層本身是通過較低級對象渲染層構(gòu)建的梅惯。

層為構(gòu)建應(yīng)用程序提供了許多選項(xiàng)宪拥。選擇一種自定義的方法來釋放框架的全部表現(xiàn)力,或者使用構(gòu)件層中的構(gòu)建塊铣减,或混合搭配她君。 您可以實(shí)現(xiàn)Flutter提供的所有現(xiàn)成的widget,或者使用Flutter團(tuán)隊(duì)用于構(gòu)建框架的相同工具和技術(shù)創(chuàng)建您自己的定制widget葫哗。

沒有什么是隱藏的缔刹。您可以從高層次,統(tǒng)一的widget概念中獲得開發(fā)效率優(yōu)勢劣针,而不會(huì)犧牲您希望深入到下層的能力校镐。

Flutter框架分三層 Framework,Engine捺典, Embedder

Flutter Framework

Framework使用dart語言實(shí)現(xiàn)鸟廓,包括UI,文本,圖片引谜,按鈕等Widgets牍陌,渲染,動(dòng)畫员咽,手勢等呐赡。此部分的核心代碼是flutter倉庫下的flutter package,以及sky_engine倉庫下的 io, async, ui(dart:ui庫提供了Flutter框架和引擎之間的接口)等package骏融。

Flutter Engine

Engine使用C++實(shí)現(xiàn)链嘀,主要包括:Skia, Dart 和 Text。

  • Skia是開源的二維圖形庫档玻,提供了適用于多種軟硬件平臺(tái)的通用API怀泊。其已作為Google Chrome,Chrome OS误趴,Android, Mozilla Firefox, Firefox OS等其他眾多產(chǎn)品的圖形引擎霹琼,支持平臺(tái)還包括Windows, macOS, iOS,Android凉当,Ubuntu等枣申。
  • Dart 部分主要包括:Dart Runtime,Garbage Collection(GC)看杭,如果是Debug模式的話忠藤,還包括JIT(Just In Time)支持。Release和Profile模式下楼雹,是AOT(Ahead Of Time)編譯成了原生的arm代碼模孩,并不存在JIT部分。
  • Text 即文本渲染贮缅,其渲染層次如下:衍生自 Minikin的libtxt庫(用于字體選擇榨咐,分隔行);HartBuzz用于字形選擇和成型谴供;Skia作為渲染/GPU后端块茁,在Android和Fuchsia上使用FreeType渲染,在iOS上使用CoreGraphics來渲染字體桂肌。

Embedder

Embedder是一個(gè)嵌入層数焊,通過該層把Flutter嵌入到各個(gè)平臺(tái)上去,Embedder的主要工作包括渲染Surface設(shè)置, 線程設(shè)置轴或,以及插件等昌跌。平臺(tái)(如iOS)只是提供一個(gè)畫布,剩余的所有渲染相關(guān)的邏輯都在Flutter內(nèi)部照雁,這就使得它具有了很好的跨端一致性。

總結(jié)

Flutter框架本身有著良好的分層設(shè)計(jì),本節(jié)旨在讓讀者對Flutter整體框架有個(gè)大概的印象饺蚊,相信到現(xiàn)在為止萍诱,讀者已經(jīng)對Flutter有一個(gè)初始印象,在我們正式動(dòng)手之前污呼,我們還需要了解一下Flutter的開發(fā)語言Dart裕坊。

1.1.3 如何學(xué)習(xí)Flutter

本節(jié)給大家一些學(xué)習(xí)建議,分享一下筆者在學(xué)習(xí)Flutter中的一些心得燕酷,希望可以幫助你提高學(xué)習(xí)效率籍凝,避免不必要的坑。

資源

  • 官網(wǎng):閱讀Flutter官網(wǎng)的資源是快速入門的最佳方式苗缩,同時(shí)官網(wǎng)也是了解最新Flutter發(fā)展動(dòng)態(tài)的地方饵蒂,由于目前Flutter仍然處于快速發(fā)展階段,所以建議讀者還是時(shí)不時(shí)的去官網(wǎng)看看有沒有新的動(dòng)態(tài)酱讶。
  • 源碼及注釋:源碼注釋應(yīng)作為學(xué)習(xí)Flutter的第一文檔退盯,F(xiàn)lutter SDK的源碼是開源的,并且注釋非常詳細(xì)泻肯,也有很多示例渊迁,實(shí)際上,F(xiàn)lutter官方的SDK文檔就是通過注釋生成的灶挟。源碼結(jié)合注釋可以幫你解決大多數(shù)問題琉朽。
  • Github:如果遇到的問題在StackOverflow上也沒有找到答案,可以去github flutter 項(xiàng)目下提issue稚铣。
  • Gallery源碼:Gallery是Flutter官方示例APP漓骚,里面有豐富的示例,讀者可以在網(wǎng)上下載安裝榛泛。Gallery的源碼在Flutter源碼“examples”目錄下蝌蹂。

社區(qū)

  • StackOverflow:如果你還沒聽過StackOverflow,這是目前全球最大的程序員問答社區(qū)曹锨,現(xiàn)在也是活躍度最高的Flutter問答社區(qū)孤个。StackOverflow上面除了世界各地的Flutter使用者會(huì)在上面交流之外,F(xiàn)lutter開發(fā)團(tuán)隊(duì)的成員也經(jīng)常會(huì)在上面回答問題沛简。
  • 博客:隨著Flutter技術(shù)的推廣齐鲤,相信很快網(wǎng)上將會(huì)有很多Flutter相關(guān)的文章、博客椒楣,讀者可以多去瀏覽给郊、閱讀。

總結(jié)

有了資料和社區(qū)后捧灰,對于我們學(xué)習(xí)者自身來說淆九,最重要的還是要多動(dòng)手、多實(shí)踐,在本書后面的章節(jié)中炭庙,希望讀者能夠親自動(dòng)手寫一下示例饲窿。準(zhǔn)備好了嗎,下一章中焕蹄,我們將正式進(jìn)入Flutter的世界逾雄!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市腻脏,隨后出現(xiàn)的幾起案子鸦泳,更是在濱河造成了極大的恐慌,老刑警劉巖永品,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件做鹰,死亡現(xiàn)場離奇詭異,居然都是意外死亡腐碱,警方通過查閱死者的電腦和手機(jī)誊垢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來症见,“玉大人喂走,你說我怎么就攤上這事∧弊鳎” “怎么了芋肠?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長遵蚜。 經(jīng)常有香客問我帖池,道長,這世上最難降的妖魔是什么吭净? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任睡汹,我火速辦了婚禮,結(jié)果婚禮上寂殉,老公的妹妹穿的比我還像新娘宣增。我一直安慰自己炎功,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布捺球。 她就那樣靜靜地躺著货抄,像睡著了一般伟众。 火紅的嫁衣襯著肌膚如雪徽鼎。 梳的紋絲不亂的頭發(fā)上冀膝,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機(jī)與錄音甚负,去河邊找鬼柬焕。 笑死审残,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的击喂。 我是一名探鬼主播维苔,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼碰辅,長吁一口氣:“原來是場噩夢啊……” “哼懂昂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起没宾,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤凌彬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后循衰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铲敛,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年会钝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伐蒋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡迁酸,死狀恐怖先鱼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情奸鬓,我是刑警寧澤焙畔,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站串远,受9級特大地震影響宏多,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜澡罚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一伸但、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧留搔,春花似錦更胖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至荣月,卻和暖如春管呵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背哺窄。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工捐下, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留账锹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓坷襟,卻偏偏與公主長得像奸柬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子婴程,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355