bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

flutter邊界,flutter margin

Flutter -Listview 4個優(yōu)化能讓你的列表絲般順滑

優(yōu)化點1:使用 builder構(gòu)建列表

成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計、網(wǎng)站制作、奇臺網(wǎng)絡(luò)推廣、成都微信小程序、奇臺網(wǎng)絡(luò)營銷、奇臺企業(yè)策劃、奇臺品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供奇臺建站搭建服務(wù),24小時服務(wù)熱線:028-86922220,官方網(wǎng)址:vcdvsql.cn

當(dāng)你的列表元素是動態(tài)增長的時候(比如上拉加載更多),請不要直接用children 的方式,一直往children 的數(shù)組增加組件,那樣會很糟糕。對于 ListView.builder 是按需構(gòu)建列表元素,也就是只有那些可見得元素才會調(diào)用itemBuilder 構(gòu)建元素,這樣對于大列表而言性能開銷自然會小很多。

優(yōu)化點2:禁用 addAutomaticKeepAlives 和 addRepaintBoundaries 特性

這兩個屬性都是為了優(yōu)化滾動過程中的用戶體驗的。

addAutomaticKeepAlives 特性默認(rèn)是 true,意思是在列表元素不可見后可以保持元素的狀態(tài),從而在再次出現(xiàn)在屏幕的時候能夠快速構(gòu)建。這其實是一個拿空間換時間的方法,會造成一定程度得內(nèi)存開銷。可以設(shè)置為 false 關(guān)閉這一特性。缺點是滑動過快的時候可能會出現(xiàn)短暫的白屏(實際會很少發(fā)生)。

addRepaintBoundaries 是將列表元素使用一個重繪邊界(Repaint Boundary)包裹,從而使得滾動的時候可以避免重繪。而如果列表很容易繪制(列表元素布局比較簡單的情況下)的時候,可以關(guān)閉這個特性來提高滾動的流暢度。

優(yōu)化點3:盡可能將列表元素中不變的組件使用 const 修飾

使用 const 相當(dāng)于將元素緩存起來實現(xiàn)共用,若列表元素某些部分一直保持不變,那么可以使用 const 修飾。

優(yōu)化點4:使用 itemExtent 確定列表元素滾動方向的尺寸

對于很多列表,我們在滾動方向上的尺寸是提前可以根據(jù) UI設(shè)計稿知道的,如果能夠知道的話,那么使用 itemExtent 屬性制定列表元素在滾動方向的尺寸,可以提升性能。這是因為,如果不指定的話,在滾動過程中,會需要推算每個元素在滾動方向的尺寸從而消耗計算資源。

Flutter ListView 的4個優(yōu)化要點,非常實用哦!實際上,這些要點都可以從官網(wǎng)的文檔里找出對應(yīng)得說明。因此,如果遇到了性能問題,除了搜索引擎外,也建議多看看官方的文檔。

Flutter面試:渲染原理

頁面中的各界面元素(Widget)以樹的形式組織,即控件樹。Flutter通過控件樹中的每個控件創(chuàng)建不同類型的渲染對象,組成渲染對象樹。而渲染對象樹在Flutter的展示過程分為三個階段:布局、繪制、合成和渲染。

(一)布局

Flutter采用深度優(yōu)先機制遍歷渲染對象樹,決定渲染對象樹中各渲染對象在屏幕上的位置和尺寸。在布局過程中,渲染對象樹中的每個渲染對象都會接收父對象的布局約束參數(shù),決定自己的大小,然后父對象按照控件邏輯決定各個子對象的位置,完成布局過程。

為了防止因子節(jié)點發(fā)生變化而導(dǎo)致整個控件樹重新布局,F(xiàn)lutter加入了一個機制——布局邊界(Relayout Boundary),可以在某些節(jié)點自動或手動地設(shè)置布局邊界,當(dāng)邊界內(nèi)的任何對象發(fā)生重新布局時,不會影響邊界外的對象,反之亦然。

二)繪制

布局完成后,渲染對象樹中的每個節(jié)點都有了明確的尺寸和位置。Flutter會把所有的渲染對象繪制到不同的圖層上。與布局過程一樣,繪制過程也是深度優(yōu)先遍歷,而且總是先繪制自身,再繪制子節(jié)點。

以下圖為例:節(jié)點1在繪制完自身后,會再繪制節(jié)點2,然后繪制它的子節(jié)點3、4和5,最后繪制節(jié)點6。

可以看到,由于一些其他原因(比如,視圖手動合并)導(dǎo)致2的子節(jié)點5與它的兄弟節(jié)點6處于了同一層,這樣會導(dǎo)致當(dāng)節(jié)點2需要重繪的時候,與其無關(guān)的節(jié)點6也會被重繪,帶來性能損耗。

為了解決這一問題,F(xiàn)lutter提出了與布局邊界對應(yīng)的機制——重繪邊界(Repaint Boundary)。在重繪邊界內(nèi),F(xiàn)lutter會強制切換新的圖層,這樣就可以避免邊界內(nèi)外的互相影響,避免無關(guān)內(nèi)容置于同一圖層引起不必要的重繪。

重繪邊界的一個典型場景是Scrollview。ScrollView滾動的時候需要刷新視圖內(nèi)容,從而觸發(fā)內(nèi)容重繪。而當(dāng)滾動內(nèi)容重繪時,一般情況下其他內(nèi)容是不需要重繪的,這時候重繪邊界就派上用場了。

(三)合成和渲染

終端設(shè)備的頁面越來越復(fù)雜,因此Flutter的渲染樹層級通常很多,直接交付給渲染引擎進行多圖層渲染,可能會出現(xiàn)大量渲染內(nèi)容的重復(fù)繪制,所以還需要先進行一次圖層合成,即將所有的圖層根據(jù)大小、層級、透明度等規(guī)則計算出最終的顯示效果,將相同的圖層歸類合并,簡化渲染樹,提高渲染效率。

合并完成后,F(xiàn)lutter會將幾何圖層數(shù)據(jù)交由Skia引擎加工成二維圖像數(shù)據(jù),最終交由GPU進行渲染,完成界面的展示。

四、總結(jié)

咱們從各種業(yè)界主流跨端方案與Flutter的對比開始,到Flutter的簡要介紹以及Flutter的運行機制,并以界面渲染過程為例,從布局、繪制、合成和渲染三個階段講述了Flutter的實現(xiàn)原理。相信大家對Flutter已經(jīng)有一個整體認(rèn)知,趕快一起上手操作起來吧!

Flutter組件(Widget)的局部刷新方式

Flutter中有兩個常用的狀態(tài)Widget分為StatefulWidget和StatelessWidget,分別為動態(tài)視圖和靜態(tài)視圖,視圖的更新需要調(diào)用StatefulWidget的setState方法,這會遍歷調(diào)用子Widget的build方法。如果一個頁面內(nèi)容比較復(fù)雜時,會包含多個widget,如果直接調(diào)用setState,會遍歷所有子Widget的build,這樣會造成很多不必要的開銷,所以非常有必要了解Flutter中局部刷新的方式:

globalkey唯一定義了某個element,它使你能夠訪問與element相關(guān)聯(lián)的其他對象,例如buildContext、state等。應(yīng)用場景:跨widget訪問狀態(tài)。

例如:可以通過key.currentState拿到它的狀態(tài)對象,然后就可以調(diào)用其中的onPressed方法。

Flutter框架內(nèi)部提供了一個非常小巧精致的組件,專門用于局部組件的刷新。適用于值改動的刷新。

實現(xiàn)原理:在 initState 中對傳入的可監(jiān)聽對象進行監(jiān)聽,執(zhí)行 _valueChanged 方法,_valueChanged 中進行了 setState 來觸發(fā)當(dāng)前狀態(tài)的刷新。觸發(fā) build 方法,從而觸發(fā) widget.builder 回調(diào),這樣就實現(xiàn)了局部刷新。可以看到這里回調(diào)的 child 是組件傳入的 child,所以直接使用,這就是對 child 的優(yōu)化的根源。

可以看到 ValueListenableBuilder 實現(xiàn)局部刷新的本質(zhì),也是進行組件的抽離,讓組件狀態(tài)的改變框定在狀態(tài)內(nèi)部,并通過 builder 回調(diào)控制局部刷新,暴露給用戶使用。

通過這個可以創(chuàng)建一個支持局部刷新的widget樹,比如你可以在StatelessWidget里面刷新某個布局,但是不需要改變成StatefulWidget;也可以在StatefulWidget中使用做部分刷新而不需要刷新整個頁面,這個刷新是不會調(diào)用Widget build(BuildContext context)刷新整個布局樹的。

異步UI更新:

很多時候我們會依賴一些異步數(shù)據(jù)來動態(tài)更新UI,比如在打開一個頁面時我們需要先從互聯(lián)網(wǎng)上獲取數(shù)據(jù),在獲取數(shù)據(jù)的過程中顯示一個加載框,等獲取到數(shù)據(jù)時我們再渲染頁面;又比如我們想展示Stream(比如文件流、互聯(lián)網(wǎng)數(shù)據(jù)接收流)的進度。當(dāng)然StatefulWidget我們完全可以實現(xiàn)以上功能。但由于在實際開發(fā)中依賴異步數(shù)據(jù)更新UI的這種場景非常常見,并且當(dāng)StatefulWidget中控件樹較大時,更新一個屬性導(dǎo)致整個樹重建,消耗性能,因此Flutter專門提供了FutureBuilder和SteamBuilder兩個組件來快速實現(xiàn)這種功能。

通常情況下,子Widget無法單獨感知父Widget的變化,當(dāng)父state變化時,通過其build重建所有子widget;

InheriteddWidget可以避免這種全局創(chuàng)建,實現(xiàn)局部子Widget更新。InheritedWidget提供了一種在Widget樹中從上到下傳遞、共享數(shù)據(jù)的方式。Flutter SDK正是通過InheritedWidget來共享應(yīng)用主題和Locale等信息。

InheritedWidgetData

TestData

InheritedTest1Page

provider是Google I/O 2019大會上宣布的現(xiàn)在官方推薦的管理方式,而ChangeNotifierProvider可以說是Provider的一種:

yaml文件需要引入provider: ^3.1.0

頂層嵌套ChangeNotifierProvider

創(chuàng)建共享數(shù)據(jù)類DataInfo:

數(shù)據(jù)類需要with ChangeNotifier 以使用 notifyListeners()函數(shù)通知監(jiān)聽者更新界面。

使用Provider.of(context)獲取DataInfo

nextPage:

使用Consumer包住需要使用共享數(shù)據(jù)的Widget

RepaintBoundary就是重繪邊界,用于重繪時獨立于父視圖。頁面需要更新的頁面結(jié)構(gòu)可以用 RepaintBoundary組件嵌套,flutter 會將包含的組件獨立出一層"畫布",去繪制。官方很多組件 外層也包了層 RepaintBoundary 標(biāo)簽。如果你的自定義view比較復(fù)雜,應(yīng)該盡可能的避免重繪。

以上總結(jié)了幾種Flutter的局部刷新的方式,可根據(jù)實際需要使用不同的方式,最適合的才是最好的。

flutter-動畫

1.動畫原理:在一段時間內(nèi)快速的多次改變UI外觀,由于人眼會產(chǎn)生視覺暫留所以最終看到的就是一個連續(xù)的動畫。

UI的一次改變稱為一個動畫幀,對應(yīng)一次屏幕刷新。

FPS:幀率,每秒的動畫幀數(shù)。

flutter動畫分為兩類:

常見動畫模式:

是一個抽象類,主要的功能是保存動畫的值和狀態(tài)。常用的一個Animation類是Animation double ,是一個在一段時間內(nèi)依次生成一個區(qū)間之間的值的類,可以是線性或者曲線或者其他。

可以生成除double之外的其他類型值,如:Animation Color 或 Animation Size 。

是一個動畫控制器,控制動畫的播放狀態(tài),在屏幕刷新的每一幀,就會生成一個新的值。

包含動畫的啟動forward()、停止stop() 、反向播放 reverse()等方法,在給定的時間段內(nèi)線性的生成從0.0到1.0(默認(rèn)區(qū)間)的數(shù)字。

curve:描述動畫的曲線過程。

curvedAnimation:指定動畫的曲線。

常用Curve:

繼承自Animatable T ,表示的就是一個 Animation 對象的取值范圍,只需要設(shè)置開始和結(jié)束的邊界值(值也支持泛型)。 它唯一的工作就是定義輸入范圍到輸出范圍的映射。

例如,Tween可能會生成從紅到藍之間的色值,或者從0到255。

Tween.animate:返回一個Animation。

映射過程:

1). Tween.animation通過傳入 aniamtionController 獲得一個_AnimatedEvaluation 類型的 animation 對象(基類為 Animation), 并且將 aniamtionController 和 Tween 對象傳入了 _AnimatedEvaluation 對象。

2). animation.value方法即是調(diào)用 _evaluatable.evaluate(parent)方法, 而 _evaluatable 和 parent 分別為 Tween 對象和 AnimationController 對象。

3). 這里的 animation 其實就是前面的 AnimationController 對象, transform 方法里面的 animation.value則就是 AnimationController 線性生成的 0.0~1.0 直接的值。 在 lerp 方法里面我們可以看到這個 0.0~1.0 的值被映射到了 begin 和 end 范圍內(nèi)了。

接收一個TickerProvider類型的對象,它的主要職責(zé)是創(chuàng)建Ticker。

防止屏幕外動畫消耗資源。

[圖片上傳失敗...(image-115b94-1636441483468)]

過程:

回調(diào):

不使用addListener()和setState()來給widget添加動畫。

使用AnimatedWidget,將widget分離出來,創(chuàng)建一個可重用動畫的widget,AnimatedWidget中會自動調(diào)用addListener()和setState()

AnimatedModalBarrier、DecoratedBoxTransition、FadeTransition、PositionedTransition、RelativePositionedTransition、RotationTransition、ScaleTransition、SizeTransition、SlideTransition

如何渲染過渡,把渲染過程也抽象出來:

AnimatedBuilder的示例包括: BottomSheet、 PopupMenu、ProgressIndicator、RefreshIndicator、Scaffold、SnackBar、TabBar。

MaterialPageRoute:平臺風(fēng)格一致的路由切換動畫

CupertinoPageRoute:左右切換風(fēng)格

自定義:PageRouteBuilder

1.要創(chuàng)建交織動畫,需要使用多個動畫對象(Animation)。

2.一個AnimationController控制所有的動畫對象。

3.給每一個動畫對象指定時間間隔(Interval)

可以同時對其新、舊子元素添加顯示、隱藏動畫.

當(dāng)AnimatedSwitcher的child發(fā)生變化時(類型或Key不同),舊child會執(zhí)行隱藏動畫,新child會執(zhí)行執(zhí)行顯示動畫。

希望大家支持一下,感謝

Flutter(6):基礎(chǔ)組件之Image

Image是一個用于展示圖片的組件。支持 JPEG、PNG、GIF、Animated GIF、WebP、Animated WebP、BMP 和 WBMP 等格式。

Image.asset - 用于從資源目錄的顯示圖片,需要在 pubspec.yaml 文件中聲明。

Image.network - 用于從網(wǎng)絡(luò)上顯示圖片。

Image.file - 用于從文件里顯示圖片。

Image.memory - 用于從內(nèi)存里(Uint8List)顯示圖片。

alignment → AlignmentGeometry - 圖像邊界內(nèi)對齊圖像。

centerSlice → Rect - 九片圖像的中心切片。

color → Color - 該顏色與每個圖像像素混合colorBlendMode。

colorBlendMode → BlendMode - 用于 color 與此圖像結(jié)合使用。

fit → BoxFit - 圖像在布局中分配的空間。

gaplessPlayback → bool - 當(dāng)圖像提供者發(fā)生變化時,是繼續(xù)顯示舊圖像(true)還是暫時不顯示(false)。

image → ImageProvider - 要顯示的圖像。

matchTextDirection → bool - 是否在圖像的方向上繪制圖像 TextDirection。

repeat → ImageRepeat - 未充分容器時,是否重復(fù)圖片。

height → double - 圖像的高度。

width → double - 圖像的寬度。

加載資源圖片需要將圖片資源放入工程中,例如:新建images文件夾,將圖片放在該文件夾下,圖片適配則是使用ios的方式1X,2X,3X:

然后在pubspec.yaml中配置assets:

加載資源/網(wǎng)絡(luò)/本地文件圖片/內(nèi)存圖片:

占位圖加載圖片:

圓形圖片:1.裁剪實現(xiàn) 2.CircleAvatar實現(xiàn) 3.Container邊框?qū)崿F(xiàn)

圓角圖片:1.裁剪實現(xiàn) 2.Container邊框?qū)崿F(xiàn)

BoxFit.contain 全圖居中顯示但不充滿,顯示原比例

BoxFit.cover 圖片可能拉伸,也可能裁剪,但是充滿容器

BoxFit.fill 全圖顯示且填充滿,圖片可能會拉伸

BoxFit.fitHeight 圖片可能拉伸,可能裁剪,高度充滿

BoxFit.fitWidth 圖片可能拉伸,可能裁剪,寬度充滿

BoxFit.scaleDown 效果和contain差不多, 但是只能縮小圖片,不能放大圖片

下一節(jié)學(xué)習(xí)基礎(chǔ)組件之Text

Flutter 94: 初識 MediaQuery

當(dāng)我們同時為手機和平板適配編寫 app 針對不同屏幕尺寸進行 UI 布局或當(dāng)用戶偏好設(shè)置較大字號或是想要最大限度等減少動畫等;此時就需要 MediaQuery 來幫我們獲取所用設(shè)備的信息以及用戶設(shè)置的偏好信息;

MediaQuery 一直存在于 WidgetsApp 和 MaterialApp 中, MediaQuery 繼承自 InheritedWidget 是一個單獨的 Widget ,但一般通過 MediaQuery.of(context) 來獲取相關(guān)信息;

當(dāng)相關(guān)信息發(fā)生變化,例如屏幕旋轉(zhuǎn)等時,屏幕中 Widget 會重新構(gòu)建,以保持最新狀態(tài);我們可以通過 MediaQuery 構(gòu)造函數(shù)和提供的靜態(tài)方法手動設(shè)置對應(yīng)的相關(guān)信息;

MediaQueryData 包含關(guān)于媒介的相關(guān)信息;一般通過 MediaQuery.of(context) 獲取;

size 為媒介的尺寸大小,以邏輯像素為單位;

devicePixelRatio 為像素密度;與設(shè)備物理像素有關(guān),與橫豎屏等無關(guān);

orientation 為橫豎屏, Orientation.landscape 為橫屏, Orientation.portrait 為豎屏;

textScaleFactor 為

每個邏輯像素的字體像素數(shù),小菜理解為字體的像素比;注意,小菜設(shè)置了默認(rèn)字體像素密度為標(biāo)準(zhǔn)的 1.2 倍之后調(diào)整設(shè)備系統(tǒng)字號,其 1.2 倍依舊是以標(biāo)準(zhǔn)字號為基礎(chǔ)擴大 1.2 倍;

platformBrightness 為當(dāng)前設(shè)備的亮度模式;注意調(diào)整屏幕亮度并不會改變該模式,與當(dāng)前系統(tǒng)支持的黑暗模式和明亮模式相關(guān);

alwaysUse24HourFormat 為當(dāng)前設(shè)備是否為 24 小時制;

accessibleNavigation 為是否使用 TalkBack 或 VoiceOver 之類的輔助功能與應(yīng)用程序進行交互,用以輔助視力障礙人群;

invertColors 為是否使用顏色反轉(zhuǎn),主要用于 iOS 設(shè)備;

highContrast 為用戶是否要求前景與背景之間的對比度高,主要用于 iOS 設(shè)備;

disableAnimations 為平臺是否要求禁用或減少動畫;

boldText 為平臺是否要求使用粗體;

padding 為屏幕內(nèi)邊距,一般是劉海兒屏或異形屏中被系統(tǒng)遮擋部分邊距;

viewInsets 為鍵盤彈出時等遮擋屏幕邊距,其中 viewInsets.bottom 為鍵盤高度;

systemGestureInsets 為手勢邊距,如 Android Q 之后添加的向左滑動關(guān)閉頁面等;

viewPadding 小菜理解為視圖內(nèi)邊距,為屏幕被劉海兒屏或異形屏中被系統(tǒng)遮擋部分,從 MediaQuery 邊界的邊緣計算;此值是保持不變;例如,屏幕底部的軟件鍵盤可能會覆蓋并占用需要底部填充的相同區(qū)域,因此不會影響此值;

physicalDepth 為設(shè)備物理層級,小菜暫時還未想到對應(yīng)的應(yīng)用場景;

小菜在嘗試獲取其他子 Widget Size 時,有兩點需要注意,首先要設(shè)置一個全局的 GlobalKey 來獲取當(dāng)前位置, key 需要為唯一的;第二通過 GlobalKey().currentContext 獲取 BuildContext 上下文環(huán)境,從而獲取對應(yīng)尺寸;

MediaQuery 案例嘗試

小菜對于部分 MediaQueryData 的應(yīng)用和理解還不夠深入;如有錯誤請多多指導(dǎo)!

本文題目:flutter邊界,flutter margin
網(wǎng)站地址:http://vcdvsql.cn/article2/dsigeic.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)網(wǎng)站策劃App設(shè)計網(wǎng)站排名網(wǎng)站設(shè)計網(wǎng)站維護

廣告

聲明:本網(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)

成都網(wǎng)頁設(shè)計公司