101--Flutter簡(jiǎn)介

[TOC]

Flutter簡(jiǎn)介

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ò)展胞皱。同時(shí) Flutter還使用 Native引擎渲染視圖九妈,這無(wú)疑能為用戶提供良好的體驗(yàn)萌朱。

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

Flutter與用于構(gòu)建移動(dòng)應(yīng)用程序的其它大多數(shù)框架不同策菜,因?yàn)镕lutter既不使用WebView,也不使用操作系統(tǒng)的原生控件翠霍。 相反壶运,F(xiàn)lutter使用自己的高性能渲染引擎來(lái)繪制widget浪秘。這樣不僅可以保證在Android和iOS上UI的一致性,而且也可以避免對(duì)原生控件依賴而帶來(lái)的限制及高昂的維護(hù)成本棵癣。

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默認(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ā)裆操,本書(shū)的示例和介紹主要是基于iOS和Android平臺(tái)的,其它平臺(tái)讀者可以自行了解昆烁。

高性能

Flutter高性能主要靠?jī)牲c(diǎn)來(lái)保證静尼,首先传泊,Flutter APP采用Dart語(yǔ)言開(kāi)發(fā)
Dart在 JIT(即時(shí)編譯)模式下拦盹,速度與 JavaScript基本持平溪椎。但是 Dart支持 AOT校读,當(dāng)以 AOT模式運(yùn)行時(shí),JavaScript便遠(yuǎn)遠(yuǎn)追不上了华临。速度的提升對(duì)高幀率下的視圖數(shù)據(jù)計(jì)算很有幫助端考。
其次却特,Flutter使用自己的渲染引擎來(lái)繪制UI裂明,布局?jǐn)?shù)據(jù)等由Dart語(yǔ)言直接控制太援,所以在布局過(guò)程中不需要像RN那樣要在JavaScript和Native之間通信扳碍,這在一些滑動(dòng)和拖動(dòng)的場(chǎng)景下具有明顯優(yōu)勢(shì)笋敞,因?yàn)樵诨瑒?dòng)和拖動(dòng)過(guò)程往往都會(huì)引起布局發(fā)生變化夯巷,所以JavaScript需要和Native之間不停的同步布局信息哀墓,這和在瀏覽器中要JavaScript頻繁操作DOM所帶來(lái)的問(wèn)題是相同的,都會(huì)帶來(lái)比較可觀的性能開(kāi)銷后雷。

采用Dart語(yǔ)言開(kāi)發(fā)

這是一個(gè)很有意思臀突,但也很有爭(zhēng)議的問(wèn)題走孽,在了解Flutter為什么選擇了 Dart而不是 JavaScript之前我們先來(lái)介紹兩個(gè)概念:JIT和AOT
目前盒齿,程序主要有兩種運(yùn)行方式:靜態(tài)編譯與動(dòng)態(tài)解釋困食。靜態(tài)編譯的程序在執(zhí)行前全部被翻譯為機(jī)器碼硕盹,通常將這種類型稱為AOT (Ahead of time)即 “提前編譯”;而解釋執(zhí)行的則是一句一句邊翻譯邊運(yùn)行啊胶,通常將這種類型稱為JIT(Just-in-time)即“即時(shí)編譯”焰坪。AOT程序的典型代表是用C/C++開(kāi)發(fā)的應(yīng)用聘惦,它們必須在執(zhí)行前編譯成機(jī)器碼,而JIT的代表則非常多黔漂,如JavaScript、python等牧嫉,事實(shí)上驹止,所有腳本語(yǔ)言都支持JIT模式观蜗。但需要注意的是JIT和AOT指的是程序運(yùn)行方式,和編程語(yǔ)言并非強(qiáng)關(guān)聯(lián)的抖仅,有些語(yǔ)言既可以以JIT方式運(yùn)行也可以以AOT方式運(yùn)行撤卢,如Java梧兼、Python,它們可以在第一次執(zhí)行時(shí)編譯成中間字節(jié)碼渡紫、然后在之后執(zhí)行時(shí)可以直接執(zhí)行字節(jié)碼考赛,也許有人會(huì)說(shuō)颜骤,中間字節(jié)碼并非機(jī)器碼,在程序執(zhí)行時(shí)仍然需要?jiǎng)討B(tài)將字節(jié)碼轉(zhuǎn)為機(jī)器碼八孝,是的鸠项,這沒(méi)有錯(cuò),不過(guò)通常我們區(qū)分是否為AOT的標(biāo)準(zhǔn)就是看代碼在執(zhí)行之前是否需要編譯,只要需要編譯,無(wú)論其編譯產(chǎn)物是字節(jié)碼還是機(jī)器碼浅辙,都屬于AOT阎姥。在此呼巴,讀者不必糾結(jié)于概念,概念就是為了傳達(dá)精神而發(fā)明的诊赊,只要讀者能夠理解其原理即可府瞄,得其神忘其形。

現(xiàn)在我們看看Flutter為什么選擇Dart語(yǔ)言鲸郊?筆者根據(jù)官方解釋以及自己對(duì)Flutter的理解總結(jié)了以下幾條(由于其它跨平臺(tái)框架都將JavaScript作為其開(kāi)發(fā)語(yǔ)言秆撮,所以主要將Dart和JavaScript做一個(gè)對(duì)比):

  1. 開(kāi)發(fā)效率高

    Dart運(yùn)行時(shí)和編譯器支持Flutter的兩個(gè)關(guān)鍵特性的組合:
    基于JIT的快速開(kāi)發(fā)周期:Flutter在開(kāi)發(fā)階段采用换况,采用JIT模式,這樣就避免了每次改動(dòng)都要進(jìn)行編譯拨匆,極大的節(jié)省了開(kāi)發(fā)時(shí)間惭每;
    基于AOT的發(fā)布包: Flutter在發(fā)布時(shí)可以通過(guò)AOT生成高效的ARM代碼以保證應(yīng)用性能亏栈。而JavaScript則不具有這個(gè)能力。

  2. 高性能

    Flutter旨在提供流暢黎侈、高保真的的UI體驗(yàn)峻汉。為了實(shí)現(xiàn)這一點(diǎn),F(xiàn)lutter中需要能夠在每個(gè)動(dòng)畫(huà)幀中運(yùn)行大量的代碼休吠。這意味著需要一種既能提供高性能的語(yǔ)言,而不會(huì)出現(xiàn)會(huì)丟幀的周期性暫停阳懂,而Dart支持AOT岩调,在這一點(diǎn)上可以做的比JavaScript更好赡盘。

  3. 快速內(nèi)存分配

    Flutter框架使用函數(shù)式流,這使得它在很大程度上依賴于底層的內(nèi)存分配器堕澄。因此蛙紫,擁有一個(gè)能夠有效地處理瑣碎任務(wù)的內(nèi)存分配器將顯得十分重要途戒,在缺乏此功能的語(yǔ)言中,F(xiàn)lutter將無(wú)法有效地工作唁毒。當(dāng)然Chrome V8的JavaScript引擎在內(nèi)存分配上也已經(jīng)做的很好星爪,事實(shí)上Dart開(kāi)發(fā)團(tuán)隊(duì)的很多成員都是來(lái)自Chrome團(tuán)隊(duì)的,所以在內(nèi)存分配上Dart并不能作為超越JavaScript的優(yōu)勢(shì)近零,而對(duì)于Flutter來(lái)說(shuō)久信,它需要這樣的特性漓摩,而Dart也正好滿足而已。

  4. 類型安全

    由于Dart是類型安全的語(yǔ)言腿椎,支持靜態(tài)類型檢測(cè),所以可以在編譯前發(fā)現(xiàn)一些類型的錯(cuò)誤鞍泉,并排除潛在問(wèn)題肮帐,這一點(diǎn)對(duì)于前端開(kāi)發(fā)者來(lái)說(shuō)可能會(huì)更具有吸引力训枢。與之不同的忘巧,JavaScript是一個(gè)弱類型語(yǔ)言砚嘴,也因此前端社區(qū)出現(xiàn)了很多給JavaScript代碼添加靜態(tài)類型檢測(cè)的擴(kuò)展語(yǔ)言和工具,如:微軟的TypeScript以及Facebook的Flow耸采。相比之下工育,Dart本身就支持靜態(tài)類型,這是它的一個(gè)重要優(yōu)勢(shì)嘱朽。

  5. Dart團(tuán)隊(duì)就在你身邊

    看似不起眼怔接,實(shí)則舉足輕重扼脐。由于有Dart團(tuán)隊(duì)的積極投入,F(xiàn)lutter團(tuán)隊(duì)可以獲得更多凛膏、更方便的支持脏榆,正如Flutter官網(wǎng)所述“我們正與Dart社區(qū)進(jìn)行密切合作,以改進(jìn)Dart在Flutter中的使用须喂。例如,當(dāng)我們最初采用Dart時(shí)仔役,該語(yǔ)言并沒(méi)有提供生成原生二進(jìn)制文件的工具鏈(這對(duì)于實(shí)現(xiàn)可預(yù)測(cè)的高性能具有很大的幫助),但是現(xiàn)在它實(shí)現(xiàn)了任柜,因?yàn)镈art團(tuán)隊(duì)專門(mén)為Flutter構(gòu)建了它沛厨。同樣,Dart VM之前已經(jīng)針對(duì)吞吐量進(jìn)行了優(yōu)化宅粥,但團(tuán)隊(duì)現(xiàn)在正在優(yōu)化VM的延遲時(shí)間电谣,這對(duì)于Flutter的工作負(fù)載更為重要∑罂眩”

總結(jié)

本節(jié)主要介紹了一下Flutter的特點(diǎn)牢贸,如果你感到有些點(diǎn)還不是很好理解,不用著急臭增,隨著日后對(duì)Flutter細(xì)節(jié)的了解誊抛,再回過(guò)頭來(lái)看,相信你會(huì)有更深的體會(huì)拗窃。

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

本節(jié)我們先對(duì)Flutter的框架做一個(gè)整體介紹随夸,旨在讓讀者心中有一個(gè)整體的印象震放,這對(duì)初學(xué)者來(lái)說(shuō)非常重要。如果一下子便深入到Flutter中诈铛,就會(huì)像是一個(gè)在沙漠中沒(méi)有地圖的人,即使可以找到一個(gè)綠洲幢竹,但是他也不會(huì)知道下一個(gè)綠洲在哪。因此蹲坷,無(wú)論學(xué)什么技術(shù)冠句,都要先有一張清晰的“地圖”,而我們的學(xué)習(xí)過(guò)程就是“按圖索驥”,這樣我們才不會(huì)陷于細(xì)節(jié)而“目無(wú)全藕痹”丐重。言歸正傳,我們看一下Flutter官方提供的Flutter框架圖臀蛛,如圖1-1所示:
[圖片上傳失敗...(image-a6f029-1608880939761)]

Flutter Framework

這是一個(gè)純 Dart實(shí)現(xiàn)的 SDK崖蜜,它實(shí)現(xiàn)了一套基礎(chǔ)庫(kù)豫领,自底向上,我們來(lái)簡(jiǎn)單介紹一下:

  • 底下兩層(Foundation和Animation洲劣、Painting课蔬、Gestures)在Google的一些視頻中被合并為一個(gè)dart UI層,對(duì)應(yīng)的是Flutter中的dart:ui包战惊,它是Flutter引擎暴露的底層UI庫(kù)同欠,提供動(dòng)畫(huà)、手勢(shì)及繪制能力衫哥。
  • Rendering層,這一層是一個(gè)抽象的布局層膛锭,它依賴于dart UI層蚊荣,Rendering層會(huì)構(gòu)建一個(gè)UI樹(shù),當(dāng)UI樹(shù)有變化時(shí)奢入,會(huì)計(jì)算出有變化的部分,然后更新UI樹(shù)腥光,最終將UI樹(shù)繪制到屏幕上武福,這個(gè)過(guò)程類似于React中的虛擬DOM痘番。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開(kāi)發(fā)的大多數(shù)場(chǎng)景,只是和這兩層打交道墙杯。

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)真正的繪制邏輯。

總結(jié)

Flutter框架本身有著良好的分層設(shè)計(jì),本節(jié)旨在讓讀者對(duì)Flutter整體框架有個(gè)大概的印象渔扎,相信到現(xiàn)在為止晃痴,讀者已經(jīng)對(duì)Flutter有一個(gè)初始印象,在我們正式動(dòng)手之前倘核,我們還需要了解一下Flutter的開(kāi)發(fā)語(yǔ)言Dart紧唱。

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

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

資源

  • 官網(wǎng):閱讀Flutter官網(wǎng)的資源是快速入門(mén)的最佳方式敛劝,同時(shí)官網(wǎng)也是了解最新Flutter發(fā)展動(dòng)態(tài)的地方夸盟,由于目前Flutter仍然處于快速發(fā)展階段呐粘,所以建議讀者還是時(shí)不時(shí)的去官網(wǎng)看看有沒(méi)有新的動(dòng)態(tài)。
  • 源碼及注釋:源碼注釋?xiě)?yīng)作為學(xué)習(xí)Flutter的第一文檔唆垃,F(xiàn)lutter SDK的源碼是開(kāi)源的痘儡,并且注釋非常詳細(xì)沉删,也有很多示例,實(shí)際上砖茸,F(xiàn)lutter官方的SDK文檔就是通過(guò)注釋生成的凉夯。源碼結(jié)合注釋可以幫你解決大多數(shù)問(wèn)題采幌。
  • Github:如果遇到的問(wèn)題在StackOverflow上也沒(méi)有找到答案休傍,可以去github flutter 項(xiàng)目下提issue磨取。
  • Gallery源碼:Gallery是Flutter官方示例APP忙厌,里面有豐富的示例,讀者可以在網(wǎng)上下載安裝隘截。Gallery的源碼在Flutter源碼“examples”目錄下。

社區(qū)

  • StackOverflow:如果你還沒(méi)聽(tīng)過(guò)StackOverflow东臀,這是目前全球最大的程序員問(wèn)答社區(qū)惰赋,現(xiàn)在也是活躍度最高的Flutter問(wèn)答社區(qū)。StackOverflow上面除了世界各地的Flutter使用者會(huì)在上面交流之外呵哨,F(xiàn)lutter開(kāi)發(fā)團(tuán)隊(duì)的成員也經(jīng)常會(huì)在上面回答問(wèn)題赁濒。
  • Flutter中文網(wǎng)社區(qū)Flutter中文網(wǎng)是筆者維護(hù)中文網(wǎng)站,目前也是最大的中文資源社區(qū)孟害,上面提供了Flutter官網(wǎng)的文檔翻譯拒炎、開(kāi)源項(xiàng)目、及案例挨务,還有申請(qǐng)加入組織的入口哦击你。
  • 博客:隨著Flutter技術(shù)的推廣,相信很快網(wǎng)上將會(huì)有很多Flutter相關(guān)的文章谎柄、博客丁侄,讀者可以多去瀏覽、閱讀朝巫。總結(jié)
    有了資料和社區(qū)后,對(duì)于我們學(xué)習(xí)者自身來(lái)說(shuō),最重要的還是要多動(dòng)手变逃、多實(shí)踐,在本書(shū)后面的章節(jié)中凰棉,希望讀者能夠親自動(dòng)手寫(xiě)一下示例撒犀。準(zhǔn)備好了嗎,下一章中胆筒,我們將正式進(jìn)入Flutter的世界!

轉(zhuǎn)載自:https://book.flutterchina.club/chapter1/flutter_intro.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市铆惑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌撕阎,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異汗侵,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)雪猪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)古劲,“玉大人,你說(shuō)我怎么就攤上這事闷堡「芾溃” “怎么了踱阿?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵佛点,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我演闭,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任菱蔬,我火速辦了婚禮魏身,結(jié)果婚禮上税朴,老公的妹妹穿的比我還像新娘。我一直安慰自己觅廓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著篡殷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上邑跪,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天轴踱,我揣著相機(jī)與錄音淫僻,去河邊找鬼。 笑死琳省,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的坚踩。 我是一名探鬼主播础锐,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鸵隧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼外驱!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤羡铲,失蹤者是張志新(化名)和其女友劉穎雷恃,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體讨越,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡着逐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锥咸。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡碗殷,死狀恐怖仿粹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布银伟,位于F島的核電站夯辖,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜近速,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望螃宙。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春若河,著一層夾襖步出監(jiān)牢的瞬間鲫忍,已是汗流浹背篷就。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工窟绷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饭尝,地道東北人姊途。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓其做,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Flutter簡(jiǎn)介 來(lái)源flutter中文網(wǎng)Flutter中文網(wǎng)[https://book.flutterchin...
    清風(fēng)烈酒2157閱讀 1,462評(píng)論 0 1
  • flutter是什么 最近同事分享了一篇flutter操作系統(tǒng)励两,感覺(jué)不錯(cuò)踢代,自己總結(jié)了一下,發(fā)上來(lái)給大家一個(gè)參考,F(xiàn)...
    android老男孩閱讀 6,719評(píng)論 3 17
  • Flutter是Google推出并開(kāi)源的移動(dòng)應(yīng)用開(kāi)發(fā)框架卷要,主打跨平臺(tái)、高保真、高性能薄声。開(kāi)發(fā)者可以通過(guò) Dart語(yǔ)言...
    zombie閱讀 346評(píng)論 0 1
  • 一、概述 Flutter 是 Google推出并開(kāi)源的移動(dòng)應(yīng)用開(kāi)發(fā)框架,主打跨平臺(tái)、高保真距辆、高性能椭懊。通過(guò) Dart...
    Kevin丶CK閱讀 1,357評(píng)論 1 2
  • 今天我們聊聊跨平臺(tái)解決方案,通過(guò)此文破讨,我們可以了解到 跨平臺(tái)技術(shù)的主流解決方案匹层,對(duì)比 flutter的原理、優(yōu)勢(shì) ...
    紫闞閱讀 8,301評(píng)論 0 7