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

flutter滾動組合,flutter滑動組件

Flutter 之 可滾動組件 -- 理論知識點(十四)

Flutter 中有兩種布局模型:

成都創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)公司一直秉承“誠信做人,踏實做事”的原則,不欺瞞客戶,是我們最起碼的底線! 以服務(wù)為基礎(chǔ),以質(zhì)量求生存,以技術(shù)求發(fā)展,成交一個客戶多一個朋友!專注中小微企業(yè)官網(wǎng)定制,成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè),塑造企業(yè)網(wǎng)絡(luò)形象打造互聯(lián)網(wǎng)企業(yè)效應(yīng)。

基于 RenderBox 的盒模型布局。

基于 Sliver ( RenderSliver ) 按需加載列表布局。

通常可滾動組件的子組件可能會非常多、占用的總高度也會非常大;如果要一次性將子組件全部構(gòu)建出將會非常昂貴!為此,F(xiàn)lutter中提出一個Sliver(中文為“薄片”的意思)概念,Sliver 可以包含一個或多個子組件。Sliver 的主要作用是配合:加載子組件并確定每一個子組件的布局和繪制信息,如果 Sliver 可以包含多個子組件時,通常會實現(xiàn)按需加載模型。

只有當(dāng) Sliver 出現(xiàn)在視口中時才會去構(gòu)建它,這種模型也稱為“基于Sliver的列表按需加載模型”。可滾動組件中有很多都支持基于Sliver的按需加載模型,如 ListView 、 GridView ,但是也有不支持該模型的,如 SingleChildScrollView 。

Flutter 中的可滾動主要由三個角色組成: Scrollable 、 Viewport 和 Sliver :

具體布局過程:

比如有一個 ListView,大小撐滿屏幕,假設(shè)它有 100 個列表項(都是RenderBox)且每個列表項高度相同,結(jié)構(gòu)如圖6-1所示:

圖中白色區(qū)域為設(shè)備屏幕,也是 Scrollable 、 Viewport 和 Sliver 所占用的空間,三者所占用的空間重合,父子關(guān)系為:Sliver 父組件為 Viewport,Viewport的 父組件為 Scrollable 。注意ListView 中只有一個 Sliver,在 Sliver 中實現(xiàn)了子組件的按需加載。

其中頂部和底部灰色的區(qū)域為 cacheExtent,它表示預(yù)渲染的高度,需要注意這是在可視區(qū)域之外,如果 RenderBox 進(jìn)入這個區(qū)域內(nèi),即使它還未顯示在屏幕上,也是要先進(jìn)行構(gòu)建的,預(yù)渲染是為了后面進(jìn)入 Viewport 的時候更絲滑。cacheExtent 的默認(rèn)值是 250,在構(gòu)建可滾動列表時我們可以指定這個值,這個值最終會傳給 Viewport。

用于處理滑動手勢,確定滑動偏移,滑動偏移變化時構(gòu)建 Viewport,我們看一下其關(guān)鍵的屬性:

在可滾動組件的坐標(biāo)描述中,通常將滾動方向稱為主軸,非滾動方向稱為縱軸。由于可滾動組件的默認(rèn)方向一般都是沿垂直方向,所以默認(rèn)情況下主軸就是指垂直方向,水平方向同理。

Viewport 比較簡單,用于渲染當(dāng)前視口中需要顯示 Sliver。

需要注意的是:

Sliver 主要作用是對子組件進(jìn)行構(gòu)建和布局,比如 ListView 的 Sliver 需要實現(xiàn)子組件(列表項)按需加載功能,只有當(dāng)列表項進(jìn)入預(yù)渲染區(qū)域時才會去對它進(jìn)行構(gòu)建和布局、渲染。

Sliver 對應(yīng)的渲染對象類型是 RenderSliver,RenderSliver 和 RenderBox 的相同點是都繼承自 RenderObject 類,不同點是在布局的時候約束信息不同。RenderBox 在布局時父組件傳遞給它的約束信息對應(yīng)的是 BoxConstraints ,只包含最大寬高的約束;而 RenderSliver 在布局時父組件(列表)傳遞給它的約束是對應(yīng)的是 SliverConstraints 。關(guān)于 Sliver 的布局協(xié)議,我們將在本章最后一節(jié)中介紹。

幾乎所有的可滾動組件在構(gòu)造時都能指定 scrollDirection (滑動的主軸)、 reverse (滑動方向是否反向)、 controller 、 physics 、 cacheExtent ,這些屬性最終會透傳給對應(yīng)的 Scrollable 和 Viewport,這些屬性我們可以認(rèn)為是可滾動組件的通用屬性,后續(xù)再介紹具體的可滾動組件時將不再贅述。

可滾動組件都有一個 controller 屬性,通過該屬性我們可以指定一個 ScrollController 來控制可滾動組件的滾動,比如可以通過ScrollController來同步多個組件的滑動聯(lián)動。由于 ScrollController 是需要結(jié)合可滾動組件一起工作,所以本章中,我們會在介紹完 ListView 后詳細(xì)介紹 ScrollController。

Scrollbar是一個Material風(fēng)格的滾動指示器(滾動條),如果要給可滾動組件添加滾動條,只需將Scrollbar作為可滾動組件的任意一個父級組件即可,如:

Scrollbar 和 CupertinoScrollbar 都是通過監(jiān)聽滾動通知來確定滾動條位置的。關(guān)于的滾動通知的詳細(xì)內(nèi)容我們將在本章最后一節(jié)中專門介紹。

CupertinoScrollbar是 iOS 風(fēng)格的滾動條,如果你使用的是Scrollbar,那么在iOS平臺它會自動切換為CupertinoScrollbar

Flutter 可滾動組件 之 SingleChildScrollView (十五)

SingleChildScrollView 源碼定義如下:

需要注意的是, 通常 SingleChildScrollView 只應(yīng)在期望的內(nèi)容不會超過屏幕太多時使用 ,這是因為 SingleChildScrollView 不支持基于 Sliver 的延遲加載模型,所以如果預(yù)計視口可能包含超出屏幕尺寸太多的內(nèi)容時,那么使用 SingleChildScrollView 將會非常昂貴(性能差),此時應(yīng)該使用一些支持Sliver延遲加載的可滾動組件,如 ListView 。

示例1

下面是一個將大寫字母 A-Z 沿垂直方向顯示的例子,由于垂直方向空間會超過屏幕視口高度,所以我們使用SingleChildScrollView:

示例2

示例3 - 橫向滾動

Flutter 可滾動組件 之 GridView (十七)

GridView可以構(gòu)建一個二維網(wǎng)格列表

默認(rèn)構(gòu)造函數(shù)如下:

我們可以看到,GridView和ListView的大多數(shù)參數(shù)都是相同的,它們的含義也都相同的。我們唯一需要關(guān)注的是gridDelegate參數(shù),類型是SliverGridDelegate,它的作用是控制GridView子組件如何排列(layout)。

SliverGridDelegate 是一個抽象類,定義了GridView Layout相關(guān)接口,子類需要通過實現(xiàn)它們來實現(xiàn)具體的布局算法。Flutter中提供了兩個 SliverGridDelegate 的子類 SliverGridDelegateWithFixedCrossAxisCount 和 SliverGridDelegateWithMaxCrossAxisExtent

SliverGridDelegateWithFixedCrossAxisCount

該子類實現(xiàn)了一個橫軸為固定數(shù)量子元素的layout算法,其構(gòu)造函數(shù)為:

可以發(fā)現(xiàn),子元素的大小是通過crossAxisCount和childAspectRatio兩個參數(shù)共同決定的。注意,這里的子元素指的是子組件的最大顯示空間,注意確保子組件的實際大小不要超出子元素的空間。

示例

SliverGridDelegateWithMaxCrossAxisExtent

該子類實現(xiàn)了一個橫軸子元素為固定最大長度的layout算法,其構(gòu)造函數(shù)為

maxCrossAxisExtent為子元素在橫軸上的最大長度,之所以是“最大”長度,是因為橫軸方向每個子元素的長度仍然是等分的,舉個例子,如果ViewPort的橫軸長度是450,那么當(dāng)maxCrossAxisExtent的值在區(qū)間[450/4,450/3)內(nèi)的話,子元素最終實際長度都為112.5,而childAspectRatio所指的子元素橫軸和主軸的長度比為最終的長度比。其它參數(shù)和SliverGridDelegateWithFixedCrossAxisCount相同。

示例

GridView.count構(gòu)造函數(shù)內(nèi)部使用了SliverGridDelegateWithFixedCrossAxisCount,我們通過它可以快速的創(chuàng)建橫軸固定數(shù)量子元素的GridView

示例

GridView.extent構(gòu)造函數(shù)內(nèi)部使用了SliverGridDelegateWithMaxCrossAxisExtent,我們通過它可以快速的創(chuàng)建橫軸子元素為固定最大長度的的GridView

示例

上面我們介紹的GridView都需要一個widget數(shù)組作為其子元素,這些方式都會提前將所有子widget都構(gòu)建好,所以只適用于子widget數(shù)量比較少時,當(dāng)子widget比較多時,我們可以通過GridView.builder來動態(tài)創(chuàng)建子widget。GridView.builder 必須指定的參數(shù)有兩個:

示例

假設(shè)我們需要從一個異步數(shù)據(jù)源(如網(wǎng)絡(luò))分批獲取一些Icon,然后用GridView來展示:

_retrieveIcons():在此方法中我們通過Future.delayed來模擬從異步數(shù)據(jù)源獲取數(shù)據(jù),每次獲取數(shù)據(jù)需要200毫秒,獲取成功后將新數(shù)據(jù)添加到_icons,然后調(diào)用setState重新構(gòu)建。

在 itemBuilder 中,如果顯示到最后一個時,判斷是否需要繼續(xù)獲取數(shù)據(jù),然后返回一個Icon。

GridView.builder 源碼定義如下:

它主要要傳兩個參數(shù) gridDelegate 和 childrenDelegate ,gridDelegate是SliverGridDelegate類型,SliverGridDelegate它有兩個子類,就是我們上文中說的 SliverGridDelegateWithFixedCrossAxisCount 和 SliverGridDelegateWithMaxCrossAxisExtent ,childrenDelegate 是SliverChildDelegate類型,SliverChildDelegate也有兩個子類 SliverChildBuilderDelegate 和 SliverChildListDelegate ,一個是通過Builder創(chuàng)建Item,一個是指定所有item。和ListView 很類似

示例

補(bǔ)充知識點:

GridView中的Sliver是SliverGrid

ListView 和 GridView 都是繼承于BoxScrollView,BoxScrollView中存在一個抽象方法buildChildLayout,這個buildChildLayout方法是在提供Sliver,GridView中關(guān)于buildChildLayout實現(xiàn)如下:

Flutter 仿京東商品詳情頁嵌套滾動組件

這是領(lǐng)苗確認(rèn)記錄詳情頁需要展示給用戶的內(nèi)容,大家可以看到這個頁面要承載很多的信息,要向下滾動一段很長的距離才能展示完,想要實現(xiàn)的效果是在頁面的頂部有一個TabBar,用戶可以通過點擊TabBar進(jìn)行錨點(jumpTo到指定位置),AppBar下的整個頁面是可以自由滾動的,在滾動過程中AppBar始終固定在頂部,TabBar在第一次進(jìn)入詳情頁的時候不顯示,只有在向下滑動的時候會由透明漸變?yōu)椴煌该鞑⒐潭ㄔ陧敳浚瑫r當(dāng)頁面滑動到TabBar錨點位置的時候TabBar會切換到對應(yīng)的下標(biāo),也就是要實現(xiàn)TabBar和ScrollView聯(lián)動的雙向控制,Tabbar的切換可以控制頁面的跳轉(zhuǎn),頁面的滑動又可以反過來控制TabBar的切換,類似與京東、淘寶的商品詳情頁效果。

SliverAppBar基本已經(jīng)達(dá)到了我們想要的效果,但在界面頂部會有塊空白區(qū)域試了很多方法怎么都去不掉,最后看了SliverAppBar這個控件的源碼發(fā)現(xiàn)是它自帶的初始高度。

這個沒法設(shè)置或消除,不可能直接去改源碼,所以后來換了一種實現(xiàn)思路,舍棄了SliverAppBar這個控件,以Stack的形式將TabBar置于ScrollView之上也能達(dá)到我們想要的效果,那么問題來了,如何實現(xiàn)TabBar的滾動漸變?很容易想到Opacity透明度控件,通過滾動監(jiān)聽來控制TabBar透明度的改變,借助Notificaion可以完美實現(xiàn)我們的需求。

Notification是Flutter中一個重要的機(jī)制,在Widget樹中,每一個節(jié)點都可以分發(fā)通知(Notification)與父(包括祖先)Widget通信,通知會沿著當(dāng)前節(jié)點(context)向上傳遞,所有父節(jié)點都可以通過NotificationListener來監(jiān)聽自己關(guān)注的通知,F(xiàn)lutter中稱這種通知由子向父的傳遞為“通知冒泡”(Notification Bubbling)。

  Flutter中很多地方使用了通知,如可滾動(Scrollable) Widget中滑動時就會分發(fā)ScrollNotification,而Scrollbar正是通過監(jiān)聽ScrollNotification來確定滾動條位置的。除了ScrollNotification,F(xiàn)lutter中還有SizeChangedLayoutNotification、KeepAliveNotification 、LayoutChangedNotification等。

通過NotificationListener監(jiān)聽滾動事件和通過ScrollController有兩個主要的不同:

通過改造后,目前這個組件的原型已經(jīng)實現(xiàn)并且可以滿足我們的需求,最后就是對該demo進(jìn)行完善使其能夠完美接入我們的業(yè)務(wù),做到技術(shù)賦能業(yè)務(wù)。

在一個頁面滾動區(qū)域不是很長的情況下不建議使用,只有當(dāng)頁面足夠長的情況下使用這個組件效果會比較好,因為如果一個頁面過短,點擊TabBar最后一欄進(jìn)行錨點時,頁面最后一個子模塊內(nèi)容無法置頂,只會將頁面最后的內(nèi)容推到屏幕范圍內(nèi),并且由于TabBar監(jiān)聽到的是滾動的位置,會導(dǎo)致TabBar無法切換到對應(yīng)的下標(biāo),看上去會像個bug,其實是因為底部已經(jīng)沒有內(nèi)容了。

這個組件本身并沒有太大的技術(shù)難度,但是有一些比較細(xì)節(jié)的小邏輯得處理好,并且從中衍生出來的很多瑣碎的小的知識點都可以進(jìn)行拓展。 在組件開發(fā)的過程中遇到問題時不局限于控件本身的設(shè)計模式,轉(zhuǎn)變開發(fā)思維去找尋一些比較新穎的解決方案可能會有意外的收獲。同時技術(shù)不能脫離于業(yè)務(wù),技術(shù)賦能業(yè)務(wù)才能創(chuàng)造價值。

Flutter:手把手教你使用滾動型列表組件:ListView

ListView的基礎(chǔ)創(chuàng)建使用有三種方式:

通過默認(rèn)構(gòu)造函數(shù)來創(chuàng)建列表,應(yīng)用場景 = 短列表

這種方式創(chuàng)建的列表存在一個問題:對于那些長列表或者需要較昂貴渲染開銷的子組件,即使還沒有出現(xiàn)在屏幕中但仍然會被ListView所創(chuàng)建,這將是一項較大的開銷,使用不當(dāng)可能引起性能問題甚至卡頓。

長列表

列表子項之間需要分割線

ListView的進(jìn)階使用主要包括:下拉刷新 上拉加載

在Flutter中,ListView結(jié)合RefreshIndicator組件實現(xiàn)下拉刷新

通過包裹一層RefreshIndicator,自定義onRefresh回調(diào)方法實現(xiàn)

方式有兩種:

通過ListView.controller屬性可以判斷ListView是否滑動到了底部,再進(jìn)行上拉加載

NotificationListener是一個Widget,可監(jiān)聽子Widget發(fā)出的Notification

ListView在滑動時中會發(fā)出ScrollNotification類型的通知,可通過監(jiān)聽該通知得到ListView的滑動狀態(tài),判斷是否滑動到了底部,從而進(jìn)行上拉加載

NotificationListener有一個onNotification屬性,定義了監(jiān)聽的回調(diào)方法,通過它來處理加載更多邏輯

不定期分享關(guān)于 安卓開發(fā) 的干貨,追求 短、平、快 ,但 卻不缺深度 。

Flutter ScrollView(滾動視圖)

ScrollView 是一個帶有滾動的視圖組件。

ScrollView 由三部分組成:

ScrollView 有以下常用屬性:

注:ScrollView 是一個抽象類,通常使用 CustomScrollView。

SliverAppBar 可以實現(xiàn)背景,標(biāo)題,頂部導(dǎo)航欄聯(lián)動,漸隱漸出動畫。

文章名稱:flutter滾動組合,flutter滑動組件
網(wǎng)站URL:http://chinadenli.net/article49/dsggjeh.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃動態(tài)網(wǎng)站小程序開發(fā)App設(shè)計自適應(yīng)網(wǎng)站網(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)

微信小程序開發(fā)