Flutter框架,一言以蔽之就是能夠使用一套相同的Dart語言代碼同時實現(xiàn)android和ios跨平臺應(yīng)用的框架,同時兼?zhèn)涓咝阅芎涂焖匍_發(fā)。
在東昌府等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站制作、網(wǎng)站設(shè)計、外貿(mào)網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作按需定制制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)營銷推廣,成都外貿(mào)網(wǎng)站制作,東昌府網(wǎng)站建設(shè)費用合理。
Flutter是谷歌公司推出的跨終端的開發(fā)框架,支持Android、iOS和WEB終端。1.0版在2018年12月5日發(fā)布,目前的最新版本是1.5,它采用的開發(fā)語言是Dart,Dart也是谷歌開發(fā)的計算機編程語言,語法類似C,是編譯型語言:
hello world例子,打印字符串“Hello World!”:
1、沒有橋接層
React Native、Weex等技術(shù)都是跨終端的框架,然而性能跟原生App存在很大差距。這是由于它們的工作原理決定的:
React Native、Weex等技術(shù)多了一個橋接層,所以界面渲染會慢一些,由于UI渲染非常頻繁,想要不卡頓,基本上比較難,性能和用戶體驗跟原生代碼有差距。而這恰恰是Flutter的優(yōu)勢所在:
Dart可以被編譯成不同平臺的本地代碼,讓Flutter不通過橋接層直接跟平臺通信,自然性能會快一些。
2、編譯執(zhí)行
JavaScript是解釋執(zhí)行的,Dart是編譯執(zhí)行的,性能誰好一目了然。
3、Flutter Engine虛擬機
Flutter是依靠Flutter Engine虛擬機在iOS和Android上運行的,F(xiàn)lutter Engine使用C/C++編寫,開發(fā)人員通過Flutter框架直接和API在內(nèi)部進(jìn)行交互,所以具有輸入低延遲和UI渲染高幀速率的特點。除了這特點之外,F(xiàn)lutter還提供了自己的小部件,F(xiàn)lutter小部件是使用從React獲取靈感的現(xiàn)代框架構(gòu)建的。 中心思想是您使用小部件構(gòu)建UI。
窗口小部件根據(jù)其當(dāng)前配置和狀態(tài)描述了它們的視圖。 當(dāng)窗口小部件的狀態(tài)發(fā)生更改時,窗口小部件會重建其描述,框架將根據(jù)前面的描述進(jìn)行區(qū)分,以確定底層呈現(xiàn)樹從一個狀態(tài)轉(zhuǎn)換到下一個狀態(tài)所需的最小更改??梢灾苯釉贠S平臺提供的畫布上進(jìn)行描繪,也就是一些核心類庫直接放到虛擬機里面,調(diào)用起來更快。
從它的系統(tǒng)結(jié)構(gòu)可以看出,類似安卓的ART(Android Run Time)虛擬機,同樣采用AOT(Ahead of TIme)技術(shù),會在APP安裝時就編譯成機器語言,不再解釋執(zhí)行,從而優(yōu)化了APP運行的性能。
4、自帶渲染引擎
Flutter使用谷歌自己的Skia渲染引擎,而Android系統(tǒng)自帶Skia引擎,iOS平臺上Flutter也會把Skia引擎打包到APP中,從而實現(xiàn)了高效渲染。而React Native通過橋接層訪問原生UI,操作頻繁就容易出性能問題。
綜合所述,F(xiàn)lutter 是性能最接近原生代碼 的一種開發(fā)框架,未來也會是構(gòu)建谷歌Fuchsia應(yīng)用的主要方式,前途不可限量,唯一的問題就是需要學(xué)習(xí)一門新的語言:Dart,而有Java或者C#語言基礎(chǔ)的程序員會比較容易學(xué)習(xí)。
問題描述:
在Flutter開發(fā)的過程中,當(dāng)我們獲取到新的數(shù)據(jù)或者數(shù)據(jù)發(fā)生變化,需要去執(zhí)行setState進(jìn)行頁面刷新的時候,經(jīng)常會出現(xiàn)不必要的子節(jié)點Widget也進(jìn)行了build,但實際上我們是不想讓它再次build,出現(xiàn)這些問題的典型情況是在使用FutureBuilder的時候,例如:
在上面這個示例中,如果再次調(diào)用Build方法,則會觸發(fā)httpCall()的方法。
那么怎樣才能避免不必要的部件構(gòu)建呢?
分析:
在Flutter中,Build方法的設(shè)計方式是pure/without side effects,書面意思是無副作用的/純粹的,簡單點理解我們可以將其含義看作不會對外部的方法或者變量產(chǎn)生影響的。這是因為許多外部因素能夠觸發(fā)新的小部件的構(gòu)建,例如這些情況:
但是,這也意味著Build方法可以不去觸發(fā)httpCall()的方法或者不修改任何狀態(tài)。
解決
回歸問題,當(dāng)前我們面臨的問題是Build方法造成了副作用,也就是造成了無關(guān)的Build調(diào)用麻煩。
所以,只要我們使Build方法保持純粹/無副作用,這樣就算多少次調(diào)用它,也不會對其他Widget的Build方法產(chǎn)生影響。
在上面的示例中,我們將Widget轉(zhuǎn)換為StatefulWidget,然后提取httpCall()到initState中,這樣問題就解決了
另外,還可以使一個Widget能夠在不強迫其子部件也構(gòu)建的情況下進(jìn)行重新構(gòu)建。
在Widget的實例保持不變時;Flutter會有意識的不去重建子部件。這意味著我們可以緩存Widget樹的某些部分,以防止不必要的重新構(gòu)建。
最簡單的方法是使用const修飾構(gòu)造函數(shù):
由于const的修飾,即使調(diào)用了數(shù)百次build,DecoratedBox的實例也將保持不變。
或者你可以這樣使用以達(dá)到相同的結(jié)果:
在這個例子中,當(dāng)StreamBuilder收到新值的通知時,即使StreamBuilder的Column進(jìn)行了重構(gòu),subtree也不會進(jìn)行重構(gòu)。這是因為由于閉包,MyWidget的實例沒有改變。
這種模式在動畫中經(jīng)常使用。典型的是使用AnimatedBuilder和所有的*Transition時,例如AlignTransition。
我們還可以將subtree存儲到類的一個字段中,但是并不推薦你這樣做,因為它會破壞Flutter的熱重載。
本文名稱:flutter性能如何,Flutter前景
本文來源:http://aaarwkj.com/article6/dsiscog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、網(wǎng)站營銷、手機網(wǎng)站建設(shè)、云服務(wù)器、用戶體驗、面包屑導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)