欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

包含flutter全局事件的詞條

flutter 中監(jiān)聽(tīng)滑動(dòng)事件

在移動(dòng)端,各個(gè)平臺(tái)或 UI 系統(tǒng)的原始指針事件模型基本都是一致,即:一次完整的事件分為三個(gè)階段:手指按下、手指移動(dòng)、和手指抬起,而更高級(jí)別的手勢(shì)(如點(diǎn)擊、雙擊、拖動(dòng)等)都是基于這些原始事件的。

成都做網(wǎng)站、網(wǎng)站制作中從網(wǎng)站色彩、結(jié)構(gòu)布局、欄目設(shè)置、關(guān)鍵詞群組等細(xì)微處著手,突出企業(yè)的產(chǎn)品/服務(wù)/品牌,幫助企業(yè)鎖定精準(zhǔn)用戶,提高在線咨詢和轉(zhuǎn)化,使成都網(wǎng)站營(yíng)銷成為有效果、有回報(bào)的無(wú)錫營(yíng)銷推廣。成都創(chuàng)新互聯(lián)公司專業(yè)成都網(wǎng)站建設(shè)10年了,客戶滿意度97.8%,歡迎成都創(chuàng)新互聯(lián)客戶聯(lián)系。

Flutter 中可以使用 Listener widget 來(lái)監(jiān)聽(tīng)原始觸摸事件,它也是一個(gè)功能性 widget。

Listener 的常見(jiàn)屬性

用法如下:

加載更多需要對(duì) ListView 進(jìn)行監(jiān)聽(tīng),所以需要進(jìn)行監(jiān)聽(tīng)器的設(shè)置,在 State 中進(jìn)行監(jiān)聽(tīng)器的初始化。

2、使用上述的 Listener 來(lái)監(jiān)聽(tīng),通過(guò) Listener 的 onPointerMove(手指在屏幕上滑動(dòng))來(lái)監(jiān)聽(tīng)滑動(dòng)的距離,當(dāng)滑動(dòng)到底部時(shí)加載更多數(shù)據(jù)

Flutter | 使用 InkResponse和 InkWell組件 實(shí)現(xiàn)事件操作

效果比較多的是動(dòng)態(tài)體驗(yàn),可以編寫后查看效果;

參考自 CSDN的Flutter入門課程

Flutter開(kāi)發(fā) -- [12 - 監(jiān)聽(tīng)滾動(dòng)事件]

ListView、GridView的組件控制器是ScrollController,我們可以通過(guò)它來(lái)獲取視圖的滾動(dòng)信息,并且可以調(diào)用里面的方法來(lái)更新視圖的滾動(dòng)位置。

另外,通常情況下,我們會(huì)根據(jù)滾動(dòng)的位置來(lái)改變一些Widget的狀態(tài)信息,所以ScrollController通常會(huì)和StatefulWidget一起來(lái)使用,并且會(huì)在其中控制它的初始化、監(jiān)聽(tīng)、銷毀等事件。

我們來(lái)做一個(gè)案例,當(dāng)滾動(dòng)到1000位置的時(shí)候,顯示一個(gè)回到頂部的按鈕:

如果我們希望監(jiān)聽(tīng)什么時(shí)候開(kāi)始滾動(dòng),什么時(shí)候結(jié)束滾動(dòng),這個(gè)時(shí)候我們可以通過(guò) NotificationListener 。

案例: 列表滾動(dòng), 并且在中間顯示滾動(dòng)進(jìn)度

flutter源碼系列 PageView源碼分析以及監(jiān)聽(tīng)事件

最近一個(gè)項(xiàng)目要實(shí)現(xiàn)可以無(wú)限循環(huán)的PageView,主要思路是在初始化pageview的list的時(shí)候在開(kāi)始和結(jié)尾多加一個(gè)結(jié)尾和開(kāi)頭的widget,當(dāng)滑動(dòng)到開(kāi)頭和結(jié)尾的時(shí)候手動(dòng)進(jìn)行頁(yè)面的切換,詳細(xì)可以搜索pageview無(wú)限輪播。

這種方法有一個(gè)要點(diǎn)就是要維護(hù)兩個(gè)索引,一個(gè)是內(nèi)部list的索引,一個(gè)是外部顯示的索引,由于list的容量是比顯示的數(shù)量多2的,所以如果要在外部進(jìn)行一些比如指示器或者計(jì)時(shí)器功能要進(jìn)行和頁(yè)面同步顯示或者切換頁(yè)面操作時(shí),需要將顯示的索引轉(zhuǎn)換成list的索引。

不過(guò)網(wǎng)上說(shuō)的都是一些比較簡(jiǎn)單的實(shí)現(xiàn),看到比較多的就是當(dāng)滑動(dòng)到要手動(dòng)切換的時(shí)候進(jìn)行一個(gè)時(shí)延,這樣可以避免直接切換頁(yè)面造成的卡頓和跳動(dòng)現(xiàn)象。但是存在一個(gè)問(wèn)題,如果要同時(shí)實(shí)現(xiàn)一個(gè)跟隨頁(yè)面切換的指示器,就會(huì)出現(xiàn)當(dāng)頁(yè)面切換過(guò)去之后指示器才會(huì)跟著過(guò)去,因?yàn)轫?yè)面切換的時(shí)候執(zhí)行了時(shí)延,而時(shí)延之后才會(huì)真正改變索引,此時(shí)才會(huì)setstate,之后指示器才能響應(yīng)到索引的切換,但是如果在時(shí)延之前就切換的話又會(huì)出現(xiàn)指示器先行的情況。因此這種方法其實(shí)是存在一些問(wèn)題的。

所以解決這個(gè)問(wèn)題的關(guān)鍵在于如何進(jìn)行頁(yè)面切換的判斷。這里可以有兩種思路實(shí)現(xiàn),第一種是實(shí)現(xiàn)viewpage的onpagechanged方法,在里面進(jìn)行邏輯的判斷,然后用controller來(lái)進(jìn)行頁(yè)面跳轉(zhuǎn),不過(guò)這種方法存在當(dāng)controller跳轉(zhuǎn)的時(shí)候又會(huì)回調(diào)onpagechanged,所以就會(huì)出現(xiàn)多次對(duì)索引不必要操作,而且如果有比如計(jì)時(shí)器等額外的功能的話可能不方便將頁(yè)面邏輯分開(kāi),而且依舊無(wú)法解決指示器延遲問(wèn)題,同時(shí)也很難進(jìn)行細(xì)粒度的操作。

第二種方法我們就要去看pageview的源碼了,從源碼的角度來(lái)解決問(wèn)題才是正確的方法。首先我們點(diǎn)進(jìn)去pageview的源碼

看到這里其實(shí)已經(jīng)有一些思路了,我們之前難點(diǎn)在于重寫了onpagechanged方法導(dǎo)致問(wèn)題無(wú)法很好的解決,現(xiàn)在我們找到了onpagechanged調(diào)用的地方,只要找辦法避免掉就可以實(shí)現(xiàn)了。

當(dāng)然這里我們要說(shuō)到NotificationListener,以及flutter對(duì)應(yīng)的冒泡事件傳輸機(jī)制,這里大家可以去看看這篇 文章 。

我來(lái)總結(jié)一下,其實(shí)就是flutter對(duì)于notification這個(gè)組件,有一中事件規(guī)則叫冒泡傳遞,底層的notification如果在它的 onNotification寫的邏輯中返回是false以及它不是根結(jié)點(diǎn),就會(huì)去向上遍歷尋找它的祖先notification組件,知道遇到root節(jié)點(diǎn)或者某一個(gè)返回true,則事件傳遞結(jié)束。

而且在onNotification中可以對(duì)多種事件進(jìn)行監(jiān)聽(tīng)和處理,所以我們可以把對(duì)viewpage頁(yè)面跳轉(zhuǎn)對(duì)索引處理的邏輯寫在這里,而且我們可以分別處理比如滑動(dòng)開(kāi)始的start事件和結(jié)束的end事件,分別進(jìn)行細(xì)粒度的邏輯的處理,這樣就可以在外部進(jìn)行操作和別的功能實(shí)現(xiàn)了。

因此不僅無(wú)限輪播事件可以通過(guò)這種方法來(lái)解決,如果有其他的操作也可以這樣進(jìn)行處理,而且因?yàn)槲覀儧](méi)有傳入onpagechanged方法,所以不存在多次調(diào)用的問(wèn)題,pageview那里判斷onpagechanged是null方法就不會(huì)進(jìn)去了,會(huì)直接我們寫在pageview外面的notification的邏輯。

最后的結(jié)構(gòu)大概這樣

Flutter 全局List Widget 不刷新問(wèn)題

我是在StatefulWidget里面設(shè)置了一個(gè)全局的List,然后動(dòng)態(tài)改變List里面的內(nèi)容,然后使用setState刷新,結(jié)果發(fā)現(xiàn)沒(méi)有用,點(diǎn)擊一下雖然會(huì)多出一個(gè)新的Item,但是還是原來(lái)那個(gè),就是List長(zhǎng)度、內(nèi)容不同,Widget顯示的是同一個(gè)Widget。

比如:九宮格添加圖片,第一個(gè)是添加圖片,點(diǎn)擊添加圖片把圖片放到List里面,然后setState刷新,結(jié)果發(fā)現(xiàn)頁(yè)面沒(méi)變化,觸碰添加圖片Item,就會(huì)多出一個(gè)添加圖片Item。

根據(jù)Flutter基于不可變數(shù)據(jù)的原理,我們直接把List換一個(gè)引用,創(chuàng)建一個(gè)新的List。

Flutter里的viewWillAppear

首先要在main.dart文件里創(chuàng)建全局路由監(jiān)聽(tīng)對(duì)象

傳入MaterialApp的navigatorObservers屬性里

在需要的頁(yè)面里使用routeObserver加入監(jiān)聽(tīng):

1.在該頁(yè)面的State混入RouteAware

2.重寫didChangeDependencies方法加入監(jiān)聽(tīng)

3.在頁(yè)面dispose時(shí)銷毀監(jiān)聽(tīng)

4.重寫需要監(jiān)聽(tīng)的事件方法

當(dāng)Push到該頁(yè)面時(shí):

當(dāng)Pop到該頁(yè)面時(shí):

當(dāng)該頁(yè)面Push到其他頁(yè)面時(shí):

當(dāng)該頁(yè)面被Pop時(shí):

2022.6.11:

注冊(cè)監(jiān)聽(tīng)入?yún)㈩愋陀凶兓?/p>

文章名稱:包含flutter全局事件的詞條
文章網(wǎng)址:http://chinadenli.net/article34/dsecspe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化網(wǎng)頁(yè)設(shè)計(jì)公司網(wǎng)站導(dǎo)航用戶體驗(yàn)網(wǎng)站排名面包屑導(dǎo)航

廣告

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

網(wǎng)站托管運(yùn)營(yíng)