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

flutter刷新原理,flutter頁面跳轉(zhuǎn)刷新

Flutter Provider實(shí)現(xiàn)原理

ChangeNotifierProvider、ChangeNotifier、Consumer的關(guān)系

十載的昌圖網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。營銷型網(wǎng)站建設(shè)的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整昌圖建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“昌圖網(wǎng)站設(shè)計(jì)”,“昌圖網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

1、ChangeNotifierProvider的父類ListenableProvider,ListenableProvider中實(shí)現(xiàn)了_startListening方法,_startListening主要是將Element的刷新方法添加到ChangeNotifier中的_listeners中

2、ListenableProvider將startListening傳入其父類InheritedProvider,InheritedProvider主要是創(chuàng)建delegate = _CreateInheritedProvider。這個(gè)delegate就是_CreateInheritedProvider中delegate.startListening中的delegate

1、ChangNotifier負(fù)責(zé)更新UI

ChangeNotifier中notifyListeners,通過遍歷_listeners,實(shí)現(xiàn)強(qiáng)制刷新UI

1、Consumer:包裹待刷新UI,在buildWithChild中將Provider.ofT(context)傳入builder方法

2、解析 Provider.ofT(context)

Provider.ofT(context)是獲取ChangeNotifier對(duì)象的方法

Provider.of中通過傳入的context,獲取父視圖為inheritedElement的對(duì)象

獲取到inheritedElement,通過inheritedElement.getValue的方式獲取ChangeNotifier對(duì)象

7、繼續(xù)查看inheritedElement?.value。通過斷點(diǎn)可以進(jìn)入_CreateInheritedProvider 類中g(shù)et Value方法。調(diào)用startListening將當(dāng)前Consumer包裹的element添加到Prorivder的_listeners數(shù)組中

通過調(diào)用notifyListeners()來刷新所有Consumer完整的Provider執(zhí)行流程大概就是這樣,流程圖如下

Flutter面試:渲染原理

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

(一)布局

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

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

二)繪制

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

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

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

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

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

(三)合成和渲染

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

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

四、總結(jié)

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

flutter刷新頁面的方法

這種方法最常見,但是有些地方引用的話,刷新的成本比較大,刷新的是整個(gè)頁面,數(shù)據(jù)太多加載太慢的話,會(huì)有閃爍的現(xiàn)象

這種方法類似于iOS中的set方法,通過設(shè)置某個(gè)屬性的時(shí)候,去刷新某個(gè)控件。在flutter中這種刷新方式,是對(duì)上面setState(){}方法的改進(jìn),根本的方法還是setState(){},只不過是通過方法去刷新某個(gè)控件。如下:

首先在pubspec.yaml中添加provider依賴

下面通過provider來實(shí)現(xiàn)一個(gè)發(fā)送驗(yàn)證碼的案例。

創(chuàng)建一個(gè)TimerModel文件

頁面布局如下:

flutter-動(dòng)畫

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

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

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

flutter動(dòng)畫分為兩類:

常見動(dòng)畫模式:

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

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

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

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

curve:描述動(dòng)畫的曲線過程。

curvedAnimation:指定動(dòng)畫的曲線。

常用Curve:

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

例如,Tween可能會(huì)生成從紅到藍(lán)之間的色值,或者從0到255。

Tween.animate:返回一個(gè)Animation。

映射過程:

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

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

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

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

防止屏幕外動(dòng)畫消耗資源。

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

過程:

回調(diào):

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

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

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

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

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

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

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

自定義:PageRouteBuilder

1.要?jiǎng)?chuàng)建交織動(dòng)畫,需要使用多個(gè)動(dòng)畫對(duì)象(Animation)。

2.一個(gè)AnimationController控制所有的動(dòng)畫對(duì)象。

3.給每一個(gè)動(dòng)畫對(duì)象指定時(shí)間間隔(Interval)

可以同時(shí)對(duì)其新、舊子元素添加顯示、隱藏動(dòng)畫.

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

希望大家支持一下,感謝

Flutter Bloc實(shí)現(xiàn)原理

1、繼承SingleChildStatelessWidget,就是一個(gè)widget,通過create 傳入一個(gè)Bloc對(duì)象

1、Bloc繼承自BlocBase,BlocBase中創(chuàng)建了StreamController對(duì)象,為多訂閱對(duì)象

其中onCounterEvent((event, emit)為初始化創(chuàng)建_eventController監(jiān)聽

2、Bloc中創(chuàng)建_eventController,為事件通知

3、BlocBase創(chuàng)建_stateController,為狀態(tài)刷新通知

4、add方法是執(zhí)行廣播通知

5、處理完數(shù)據(jù)之后執(zhí)行emit()方法,其中emit方法是stateController廣播

1、 BlocBuilder繼承自BlocBuilderBase,_BlocBuilderBaseState中build方法返回的是BlocListener

2、BlocListener繼承BlocListenerBase,_BlocListenerBaseState中_subscribe()添加監(jiān)聽stateController廣播通知

分享標(biāo)題:flutter刷新原理,flutter頁面跳轉(zhuǎn)刷新
URL標(biāo)題:http://vcdvsql.cn/article0/dsdeiio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作ChatGPT響應(yīng)式網(wǎng)站虛擬主機(jī)搜索引擎優(yōu)化電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)