NotificationListener 可以監(jiān)聽 PageView 的改變,比如滑動(dòng)的距離,頁面索引等,目前只使用的了索引。里面的一些方法挺有用的。

創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的彌勒網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
使用 AnimatedContainer 組件保證切換以后會(huì)有流程的過渡效果,表現(xiàn)的會(huì)平滑一些。
首先,返回?cái)?shù)據(jù)需要包含圖片的寬高信息,就像這樣:
如果返回的只有圖片信息沒有寬高數(shù)據(jù)可以使用以下方法去獲得圖片的信息,這樣也可以得到圖片的寬高信息,不太建議,還是直接叫后端給,我們也方便處理,要是后端說他們給不了就拿上磚頭去叫他們加,就想偷懶。
自適應(yīng)輪播圖的高度我們需要原始圖片的寬高比,或者知道原始圖的寬高。顯示的時(shí)候按照原始的寬高比進(jìn)行等比例縮放。
_controller.page 獲取到的是一個(gè)浮點(diǎn)數(shù),類似 1.0325441 ,使用 round 四舍五入出現(xiàn)的效果就是我們拖到一半或以上就可以得到下一個(gè) activeIndex , activeIndex 是一個(gè)整數(shù)。
我們動(dòng)態(tài)獲取了圖片的寬度以后放入 AnimatedContainer 就可以有過渡效果,真機(jī)和模擬器測試都很流暢,可以已60幀渲染。
在本博客中,我們將探討Flutter中的堆疊式卡輪播。 我們還將實(shí)現(xiàn)一個(gè)演示程序,并學(xué)習(xí)在您的flutter應(yīng)用程序中使用 stacked_card_carousel 包創(chuàng)建一個(gè)帶有垂直輪播的堆疊卡。
用于創(chuàng)建帶有堆疊卡片的垂直輪播的小部件。 下面的演示視頻顯示了如何在Flutter中創(chuàng)建帶有垂直旋轉(zhuǎn)木馬的堆疊卡。 它顯示了在您的flutter應(yīng)用程序中如何使用stacked_card_carousel軟件包來使用堆疊式卡輪播。 它顯示了垂直圓盤傳送帶滑動(dòng)卡的列表,所有卡向上滑動(dòng)并堆疊,稱為堆疊式卡傳送帶。 它會(huì)顯示在您的設(shè)備上。
堆疊式卡輪播的一些屬性是:
在lib文件夾中創(chuàng)建一個(gè)名為style_card.dart的新dart文件。
首先,我們創(chuàng)建StyleCard類,將在后續(xù)的DEMO中調(diào)用它
我們將制作一個(gè) card 控件. 在card控件中, 我們加入一個(gè)elevation 屬性和一個(gè)column控件。 在column中, 我們加入一個(gè)container用于包含image, title 和 description. 然后在stacked_card_demo頁面中使用它。
在lib文件夾中創(chuàng)建一個(gè)新的名為stacked_card_demo.dart的dart文件。
現(xiàn)在,我們將創(chuàng)建一個(gè)styleCards列表,并在其中添加一個(gè)StyleCard類。
我們創(chuàng)建了八個(gè)卡片控件,并在其中添加了image,title和description。 程序運(yùn)行后,我們將看到一個(gè)卡片列表, 當(dāng)用戶向上滑動(dòng)時(shí),所有卡片都將堆疊在一起; 當(dāng)用戶向下滑動(dòng)時(shí),卡片都將回到原始位置;
效果如下:
Demo地址:
使用 flutter_swiper 輪播庫。
使用 AspectRatio 結(jié)合實(shí)現(xiàn)效果,設(shè)置對應(yīng)的比例。
先制作一個(gè)縱軸滾動(dòng)的pageview
然后我們利用time組件實(shí)現(xiàn)自動(dòng)輪播,這里面有個(gè)小技巧,掌握了這個(gè)小技巧就可以做無縫的循環(huán)播放,比如我有 a b c三項(xiàng),我們在構(gòu)造pageview item的時(shí)候人為的構(gòu)造成a b c a,在c的后面加上a,當(dāng)c滾動(dòng)到a的時(shí)候,比如每次動(dòng)畫變換時(shí)間是500毫秒,那么就延遲500好秒快速的跳到第一個(gè)a頁面,剛好等它滾動(dòng)完就快速變換
在視覺上完全看不出來,這樣就造成了無縫循環(huán)滾動(dòng)的假象,同理如果你想反方向也可以無縫循環(huán)滾動(dòng),那么你在構(gòu)造pageview item的時(shí)候就可以 這樣c a b c a構(gòu)造,只要控制好邏輯,完全沒有任何問題
最近一個(gè)項(xiàng)目要實(shí)現(xiàn)可以無限循環(huán)的PageView,主要思路是在初始化pageview的list的時(shí)候在開始和結(jié)尾多加一個(gè)結(jié)尾和開頭的widget,當(dāng)滑動(dòng)到開頭和結(jié)尾的時(shí)候手動(dòng)進(jìn)行頁面的切換,詳細(xì)可以搜索pageview無限輪播。
這種方法有一個(gè)要點(diǎn)就是要維護(hù)兩個(gè)索引,一個(gè)是內(nèi)部list的索引,一個(gè)是外部顯示的索引,由于list的容量是比顯示的數(shù)量多2的,所以如果要在外部進(jìn)行一些比如指示器或者計(jì)時(shí)器功能要進(jìn)行和頁面同步顯示或者切換頁面操作時(shí),需要將顯示的索引轉(zhuǎn)換成list的索引。
不過網(wǎng)上說的都是一些比較簡單的實(shí)現(xiàn),看到比較多的就是當(dāng)滑動(dòng)到要手動(dòng)切換的時(shí)候進(jìn)行一個(gè)時(shí)延,這樣可以避免直接切換頁面造成的卡頓和跳動(dòng)現(xiàn)象。但是存在一個(gè)問題,如果要同時(shí)實(shí)現(xiàn)一個(gè)跟隨頁面切換的指示器,就會(huì)出現(xiàn)當(dāng)頁面切換過去之后指示器才會(huì)跟著過去,因?yàn)轫撁媲袚Q的時(shí)候執(zhí)行了時(shí)延,而時(shí)延之后才會(huì)真正改變索引,此時(shí)才會(huì)setstate,之后指示器才能響應(yīng)到索引的切換,但是如果在時(shí)延之前就切換的話又會(huì)出現(xiàn)指示器先行的情況。因此這種方法其實(shí)是存在一些問題的。
所以解決這個(gè)問題的關(guān)鍵在于如何進(jìn)行頁面切換的判斷。這里可以有兩種思路實(shí)現(xiàn),第一種是實(shí)現(xiàn)viewpage的onpagechanged方法,在里面進(jìn)行邏輯的判斷,然后用controller來進(jìn)行頁面跳轉(zhuǎn),不過這種方法存在當(dāng)controller跳轉(zhuǎn)的時(shí)候又會(huì)回調(diào)onpagechanged,所以就會(huì)出現(xiàn)多次對索引不必要操作,而且如果有比如計(jì)時(shí)器等額外的功能的話可能不方便將頁面邏輯分開,而且依舊無法解決指示器延遲問題,同時(shí)也很難進(jìn)行細(xì)粒度的操作。
第二種方法我們就要去看pageview的源碼了,從源碼的角度來解決問題才是正確的方法。首先我們點(diǎn)進(jìn)去pageview的源碼
看到這里其實(shí)已經(jīng)有一些思路了,我們之前難點(diǎn)在于重寫了onpagechanged方法導(dǎo)致問題無法很好的解決,現(xiàn)在我們找到了onpagechanged調(diào)用的地方,只要找辦法避免掉就可以實(shí)現(xiàn)了。
當(dāng)然這里我們要說到NotificationListener,以及flutter對應(yīng)的冒泡事件傳輸機(jī)制,這里大家可以去看看這篇 文章 。
我來總結(jié)一下,其實(shí)就是flutter對于notification這個(gè)組件,有一中事件規(guī)則叫冒泡傳遞,底層的notification如果在它的 onNotification寫的邏輯中返回是false以及它不是根結(jié)點(diǎn),就會(huì)去向上遍歷尋找它的祖先notification組件,知道遇到root節(jié)點(diǎn)或者某一個(gè)返回true,則事件傳遞結(jié)束。
而且在onNotification中可以對多種事件進(jìn)行監(jiān)聽和處理,所以我們可以把對viewpage頁面跳轉(zhuǎn)對索引處理的邏輯寫在這里,而且我們可以分別處理比如滑動(dòng)開始的start事件和結(jié)束的end事件,分別進(jìn)行細(xì)粒度的邏輯的處理,這樣就可以在外部進(jìn)行操作和別的功能實(shí)現(xiàn)了。
因此不僅無限輪播事件可以通過這種方法來解決,如果有其他的操作也可以這樣進(jìn)行處理,而且因?yàn)槲覀儧]有傳入onpagechanged方法,所以不存在多次調(diào)用的問題,pageview那里判斷onpagechanged是null方法就不會(huì)進(jìn)去了,會(huì)直接我們寫在pageview外面的notification的邏輯。
最后的結(jié)構(gòu)大概這樣
現(xiàn)在的小目標(biāo)是要實(shí)現(xiàn)一個(gè) 「圖片輪播」的效果,我們在 Android 中可以使用 ViewPager 結(jié)合 handler 或者 Timer 去實(shí)現(xiàn)。
而我們在 Flutter 中,其實(shí)也是類似的。
那么,在 Flutter 中,代替 Android 中的 ViewPager 組件是 PageView ,而且,這個(gè) PageView 相比 ViewPager 擴(kuò)展性更高。
我們來看一下
Flutter PageView 官網(wǎng)
根據(jù)官網(wǎng)的介紹, PageView 在需要展示的頁面很多時(shí),有「控件復(fù)用」功能,而且,我們還可以通過
來設(shè)置滾動(dòng)的方向,也就是說,我們還可以完成「縱向滾動(dòng)」,真的很棒有么有?
偷的小米官網(wǎng)的輪播圖
看一下效果圖
GestureDetector ,或者直接返回一個(gè) button 類型的 Widget 即可
ok,了解了這個(gè)PageView,接下來,我們想法子搞一個(gè)「輪播效果」,請見下一篇文章。
當(dāng)前名稱:flutter寫輪播,flutter 輪播
網(wǎng)站路徑:http://chinadenli.net/article33/dsidsps.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、電子商務(wù)、品牌網(wǎng)站建設(shè)、面包屑導(dǎo)航、標(biāo)簽優(yōu)化、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)