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

創(chuàng)新互聯(lián)專(zhuān)注于企業(yè)營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、網(wǎng)站重做改版、鹽田網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5頁(yè)面制作、商城網(wǎng)站開(kāi)發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性?xún)r(jià)比高,為鹽田等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。
ScrollController構(gòu)造函數(shù)如下:
ScrollController常用的屬性和方法:
ScrollController間接繼承自Listenable,我們可以根據(jù)ScrollController來(lái)監(jiān)聽(tīng)滾動(dòng)事件,如:
示例
我們創(chuàng)建一個(gè)ListView,當(dāng)滾動(dòng)位置發(fā)生變化時(shí),我們先打印出當(dāng)前滾動(dòng)位置,然后判斷當(dāng)前位置是否超過(guò)1000像素,如果超過(guò)則在屏幕右下角顯示一個(gè)“返回頂部”的按鈕,該按鈕點(diǎn)擊后可以使ListView恢復(fù)到初始位置;如果沒(méi)有超過(guò)1000像素,則隱藏“返回頂部”按鈕。
ScrollPosition是用來(lái)保存可滾動(dòng)組件的滾動(dòng)位置的。一個(gè)ScrollController對(duì)象可以同時(shí)被多個(gè)可滾動(dòng)組件使用,ScrollController會(huì)為每一個(gè)可滾動(dòng)組件創(chuàng)建一個(gè)ScrollPosition對(duì)象,這些ScrollPosition保存在ScrollController的positions屬性中(ListScrollPosition)。ScrollPosition是真正保存滑動(dòng)位置信息的對(duì)象,offset只是一個(gè)便捷屬性
一個(gè) ScrollController 雖然可以對(duì)應(yīng)多個(gè)可滾動(dòng)組件,但是有一些操作,如讀取滾動(dòng)位置 offset ,則需要一對(duì)一!但是我們?nèi)匀豢梢栽谝粚?duì)多的情況下,通過(guò)其它方法讀取滾動(dòng)位置,舉個(gè)例子,假設(shè)一個(gè) ScrollController 同時(shí)被兩個(gè)可滾動(dòng)組件使用,那么我們可以通過(guò)如下方式分別讀取他們的滾動(dòng)位置:
我們可以通過(guò) controller.positions.length 來(lái)確定 controller 被幾個(gè)可滾動(dòng)組件使用。
ScrollPosition 有兩個(gè)常用方法: animateTo() 和 jumpTo() ,它們是真正來(lái)控制跳轉(zhuǎn)滾動(dòng)位置的方法, ScrollController 的這兩個(gè)同名方法,內(nèi)部最終都會(huì)調(diào)用 ScrollPosition 的。
我們來(lái)介紹一下 ScrollController 的另外三個(gè)方法:
當(dāng) ScrollController 和可滾動(dòng)組件關(guān)聯(lián)時(shí),可滾動(dòng)組件首先會(huì)調(diào)用 ScrollController 的 createScrollPosition() 方法來(lái)創(chuàng)建一個(gè) ScrollPosition 來(lái)存儲(chǔ)滾動(dòng)位置信息,接著,可滾動(dòng)組件會(huì)調(diào)用 attach() 方法,將創(chuàng)建的 ScrollPosition 添加到 ScrollController 的 positions 屬性中,這一步稱(chēng)為“注冊(cè)位置”,只有注冊(cè)后 animateTo() 和 jumpTo() 才可以被調(diào)用。
當(dāng)可滾動(dòng)組件銷(xiāo)毀時(shí),會(huì)調(diào)用 ScrollController 的 detach() 方法,將其 ScrollPosition 對(duì)象從 ScrollController 的 positions 屬性中移除,這一步稱(chēng)為“注銷(xiāo)位置”,注銷(xiāo)后 animateTo() 和 jumpTo() 將不能再被調(diào)用。
需要注意的是, ScrollController 的 animateTo() 和 jumpTo() 內(nèi)部會(huì)調(diào)用所有 ScrollPosition 的 animateTo() 和 jumpTo() ,以實(shí)現(xiàn)所有和該 ScrollController 關(guān)聯(lián)的可滾動(dòng)組件都滾動(dòng)到指定的位置。
Flutter Widget樹(shù)中子Widget可以通過(guò)發(fā)送通知(Notification)與父(包括祖先)Widget通信。父級(jí)組件可以通過(guò)NotificationListener組件來(lái)監(jiān)聽(tīng)自己關(guān)注的通知
可滾動(dòng)組件在滾動(dòng)時(shí)會(huì)發(fā)送 ScrollNotification 類(lèi)型的通知, ScrollBar 正是通過(guò)監(jiān)聽(tīng)滾動(dòng)通知來(lái)實(shí)現(xiàn)的。通過(guò) NotificationListener 監(jiān)聽(tīng)滾動(dòng)事件和通過(guò) ScrollController 有兩個(gè)主要的不同:
示例
下面,我們監(jiān)聽(tīng)ListView的滾動(dòng)通知,然后顯示當(dāng)前滾動(dòng)進(jìn)度百分比:
在接收到滾動(dòng)事件時(shí),參數(shù)類(lèi)型為ScrollNotification,它包括一個(gè)metrics屬性,它的類(lèi)型是ScrollMetrics,該屬性包含當(dāng)前ViewPort及滾動(dòng)位置等信息:
對(duì)于滾動(dòng)的視圖,我們經(jīng)常需要監(jiān)聽(tīng)它的一些滾動(dòng)事件,在監(jiān)聽(tīng)到的時(shí)候去做對(duì)應(yīng)的一些事情。
比如視圖滾動(dòng)到底部時(shí),我們可能希望做上拉加載更多;
比如滾動(dòng)到一定位置時(shí)顯示一個(gè)回到頂部的按鈕,點(diǎn)擊回到頂部的按鈕,回到頂部;
比如監(jiān)聽(tīng)滾動(dòng)什么時(shí)候開(kāi)始,什么時(shí)候結(jié)束;
在Flutter中監(jiān)聽(tīng)滾動(dòng)相關(guān)的內(nèi)容由兩部分組成:ScrollController和ScrollNotification。
ScrollController
在Flutter中,Widget并不是最終渲染到屏幕上的元素(真正渲染的是RenderObject),因此通常這種監(jiān)聽(tīng)事件以及相關(guān)的信息并不能直接從Widget中獲取,而是必須通過(guò)對(duì)應(yīng)的Widget的Controller來(lái)實(shí)現(xiàn)。
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)、銷(xiāo)毀等事件。
我們來(lái)做一個(gè)案例,當(dāng)滾動(dòng)到1000位置的時(shí)候,顯示一個(gè)回到頂部的按鈕:
jumpTo(double offset)、animateTo(double offset,...):這兩個(gè)方法用于跳轉(zhuǎn)到指定的位置,它們不同之處在于,后者在跳轉(zhuǎn)時(shí)會(huì)執(zhí)行一個(gè)動(dòng)畫(huà),而前者不會(huì)。
ScrollController間接繼承自Listenable,我們可以根據(jù)ScrollController來(lái)監(jiān)聽(tīng)滾動(dòng)事件。
Flutter自帶了一種效果還是挺酷的可以拉伸和收縮的AppBar,就是SliverAppBar。效果就是下拉的時(shí)候,AppBar會(huì)擴(kuò)大,往上滑的時(shí)候,AppBar會(huì)收縮回去,回到頂部。
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)、銷(xiāo)毀等事件。
我們來(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)度
注意: 滾動(dòng)組件添加: physics: ClampingScrollPhysics() 可以處理IOS系統(tǒng)的物理滾動(dòng)的效果(即橡皮筋效果)
ListView 是最常用的可滾動(dòng)組件之一,可以沿一個(gè)方向線(xiàn)性排布所有子組件,并且它也支持基于Sliver的延遲構(gòu)建模型
默認(rèn)構(gòu)造函數(shù):
ListView.builder:
ListView.separated:
ListView.separated 可以在生成的列表項(xiàng)之間添加一個(gè)分割組件,它比 ListView.builder 多了一個(gè) separatorBuilder 參數(shù),該參數(shù)是一個(gè)分割組件生成器。
RefreshIndicator 下拉刷新:
RefreshIndicator 是 Material 風(fēng)格的下拉刷新組件。
CupertinoSliverRefreshControl 下拉刷新:
CupertinoSliverRefreshControl 是 ios 風(fēng)格的下拉刷新控件。
上拉加載的功能,需要用到 ScrollController + ListView組件:
網(wǎng)站標(biāo)題:flutter滾回頂部,flutter滑動(dòng)懸停頭部
標(biāo)題網(wǎng)址:http://chinadenli.net/article34/dseigse.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、企業(yè)建站、網(wǎng)站改版、網(wǎng)站策劃、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)