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

班戈ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書(shū)銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書(shū)合作)期待與您的合作!
通過(guò)默認(rèn)構(gòu)造函數(shù)來(lái)創(chuàng)建列表,應(yīng)用場(chǎng)景 = 短列表
這種方式創(chuàng)建的列表存在一個(gè)問(wèn)題:對(duì)于那些長(zhǎng)列表或者需要較昂貴渲染開(kāi)銷的子組件,即使還沒(méi)有出現(xiàn)在屏幕中但仍然會(huì)被ListView所創(chuàng)建,這將是一項(xiàng)較大的開(kāi)銷,使用不當(dāng)可能引起性能問(wèn)題甚至卡頓。
長(zhǎng)列表
列表子項(xiàng)之間需要分割線
ListView的進(jìn)階使用主要包括:下拉刷新 上拉加載
在Flutter中,ListView結(jié)合RefreshIndicator組件實(shí)現(xiàn)下拉刷新
通過(guò)包裹一層RefreshIndicator,自定義onRefresh回調(diào)方法實(shí)現(xiàn)
方式有兩種:
通過(guò)ListView.controller屬性可以判斷ListView是否滑動(dòng)到了底部,再進(jìn)行上拉加載
NotificationListener是一個(gè)Widget,可監(jiān)聽(tīng)子Widget發(fā)出的Notification
ListView在滑動(dòng)時(shí)中會(huì)發(fā)出ScrollNotification類型的通知,可通過(guò)監(jiān)聽(tīng)該通知得到ListView的滑動(dòng)狀態(tài),判斷是否滑動(dòng)到了底部,從而進(jìn)行上拉加載
NotificationListener有一個(gè)onNotification屬性,定義了監(jiān)聽(tīng)的回調(diào)方法,通過(guò)它來(lái)處理加載更多邏輯
不定期分享關(guān)于 安卓開(kāi)發(fā) 的干貨,追求 短、平、快 ,但 卻不缺深度 。
描述了屏幕上指針(觸摸、鼠標(biāo)、觸控筆)的位置和移動(dòng)。
Flutter中可以使用Listener(功能性組件)來(lái)監(jiān)聽(tīng)原始觸摸事件
例1
例2
例3
忽略PointerEvent
手勢(shì): 描述由一個(gè)或多個(gè)指針移動(dòng)組成的語(yǔ)義動(dòng)作,如拖動(dòng)、縮放、雙擊等。
Material大多數(shù)widget已經(jīng)對(duì)tap或手勢(shì)做出了響應(yīng)。 例如 IconButton和 FlatButton 響應(yīng)單擊,ListView響應(yīng)滑動(dòng)事件觸發(fā)滾動(dòng)。
用于手勢(shì)識(shí)別的功能性組件,通過(guò)它可以來(lái)識(shí)別各種手勢(shì)。
例(單擊)
例(添加Material觸摸水波效果 InkWell組件)
例(滑動(dòng)關(guān)閉 Dismissable組件)
例(單擊、雙擊、長(zhǎng)按)
例(滑動(dòng))
例(掃動(dòng)---單一方向)
例(縮放)
GestureRecognizer是一個(gè)抽象類。
一種手勢(shì)的識(shí)別器對(duì)應(yīng)一個(gè)GestureRecognizer的子類。
例
由于手勢(shì)競(jìng)爭(zhēng)最終只有一個(gè)勝出者,所以,當(dāng)有多個(gè)手勢(shì)識(shí)別器時(shí),可能會(huì)產(chǎn)生沖突。
例
例
在APP中經(jīng)常會(huì)需要一個(gè)廣播機(jī)制,用以跨頁(yè)面通知。比如一個(gè)需要登錄的APP中,頁(yè)面會(huì)關(guān)注用戶登錄或注銷事件,來(lái)進(jìn)行一些狀態(tài)更新。
這時(shí)候,一個(gè)事件總線便會(huì)非常有用,事件總線通常實(shí)現(xiàn)了訂閱者模式,訂閱者模式包含發(fā)布者和訂閱者兩種角色,可以通過(guò)事件總線來(lái)觸發(fā)事件和監(jiān)聽(tīng)事件。
對(duì)于一些簡(jiǎn)單的應(yīng)用,事件總線是足以滿足業(yè)務(wù)需求的,如果決定使用狀態(tài)管理包的話,一定要想清楚APP是否真的有必要使用它,防止“化簡(jiǎn)為繁”、過(guò)度設(shè)計(jì)。
例
在widget樹(shù)中,每一個(gè)節(jié)點(diǎn)都可以分發(fā)通知,通知會(huì)沿著當(dāng)前節(jié)點(diǎn)向上傳遞,所有父節(jié)點(diǎn)都可以通過(guò)NotificationListener來(lái)監(jiān)聽(tīng)通知。
Flutter中將這種由子向父的傳遞通知的機(jī)制稱為通知冒泡(Notification Bubbling)。
通知冒泡和用戶觸摸事件冒泡是相似的,但有一點(diǎn)不同:通知冒泡可以中止,但用戶觸摸事件不行。
通知冒泡和Web開(kāi)發(fā)中瀏覽器事件冒泡原理是相似的,都是事件從出發(fā)源逐層向上傳遞,可以在上層節(jié)點(diǎn)任意位置來(lái)監(jiān)聽(tīng)通知/事件,也可以終止冒泡過(guò)程,終止冒泡后,通知將不會(huì)再向上傳遞。
Flutter的UI框架實(shí)現(xiàn)中,除了在可滾動(dòng)組件在滾動(dòng)過(guò)程中會(huì)發(fā)出ScrollNotification之外,還有一些其它的通知,如SizeChangedLayoutNotification、KeepAliveNotification 、LayoutChangedNotification等,F(xiàn)lutter正是通過(guò)這種通知機(jī)制來(lái)使父元素可以在一些特定時(shí)機(jī)來(lái)做一些事情。
例
例
例
阻止冒泡
通知冒泡原理
1.webview_flutter
2.flutter_inappwebview
3.flutter_webview_plugin
筆者最近發(fā)現(xiàn)webview_flutter在Android端嵌套帶有較長(zhǎng)的Webview頁(yè)面時(shí)偶?xì)W會(huì)存在卡頓問(wèn)題表現(xiàn)為加速向下滑動(dòng)到頁(yè)面底部,然后從底部慢慢像上滑就不起作用了,體驗(yàn)很不好,經(jīng)過(guò)一天的排查和實(shí)驗(yàn)發(fā)現(xiàn)是webview_flutter插件自己的問(wèn)題,用原生嵌套WebView并沒(méi)有問(wèn)題,后來(lái)改成flutter_webview_plugin問(wèn)題可以解決,但是flutter_webview_plugin插件并不是基于flutter渲染的并不能在嵌套webview的頁(yè)面自定義flutter樣式層,后來(lái)發(fā)現(xiàn)使用flutter_inappwebview插件能夠完美解決問(wèn)題。推薦你們用flutter_inappwebview。
小菜在業(yè)務(wù)開(kāi)發(fā)過(guò)程中會(huì)自定義 Slider 滑動(dòng)條,而在自定義之前,小菜先簡(jiǎn)單了解一下 Flutter 自帶的 Slider ;
簡(jiǎn)單分析源碼可得, Slider 是一個(gè)有狀態(tài)的 StatefulWidget 組件,屬性也很清晰易懂,其中滑動(dòng)過(guò)程中對(duì)應(yīng)的 value 值和 onChanged 回調(diào)是必須參數(shù);
value 未滑動(dòng)過(guò)程中對(duì)應(yīng)的值,在 min 和 max 之間; onChanged 是在滑動(dòng)過(guò)程中回調(diào),當(dāng) onChanged 為 null 或 value 所在的 min 和 max 集合范圍為空時(shí), Slider 禁止滑動(dòng);
min 和 max 為滑動(dòng)條范圍,而 value 的取值范圍是在 min 和 max 之間,無(wú)論 value 為正還是負(fù),均需要在 min 和 max 之間;
activeColor 為滑動(dòng)條已滑動(dòng)過(guò)的顏色; inactiveColor 為滑動(dòng)條中未滑動(dòng)的顏色;兩者均可以在 SliderTheme 中設(shè)置;
label 為滑動(dòng)條滑動(dòng)到某一節(jié)點(diǎn)的標(biāo)簽文案; divisions 是把 min 和 max 等分為 divisions 份數(shù);只有在 divisions 生效時(shí), label 才會(huì)展示;
onChangeStart 和 onChangeEnd 分別對(duì)應(yīng)滑動(dòng)過(guò)程中 value 值何時(shí)開(kāi)始更改或何時(shí)完成更改時(shí)對(duì)應(yīng)的回調(diào);
Slider 的主題效果可以通過(guò) SliderTheme 或 ThemeData.sliderTheme 中獲取更新,相較于 Slider 只提供已滑動(dòng)和未滑動(dòng)顏色效果,屬性粒度更細(xì);
activeTrackColor 和 inactiveTrackColor 分別對(duì)應(yīng) Slider 已滑動(dòng)過(guò)和未滑動(dòng)過(guò)的軌道顏色;
thumbColor 對(duì)應(yīng)滑動(dòng)按鈕顏色,而 overlayColor 對(duì)應(yīng)滑動(dòng)按鈕映射的疊層顏色,通常設(shè)置為半透明狀態(tài); overlayShape 對(duì)應(yīng)疊層樣式;
valueIndicatorColor 對(duì)應(yīng) label 氣泡顏色; valueIndicatorShape 對(duì)應(yīng)氣泡內(nèi)文字屬性; valueIndicatorShape 對(duì)應(yīng)氣泡樣式,可以再此進(jìn)行自定義氣泡;
activeTickMarkColor 對(duì)應(yīng)已選中刻度顏色; inactiveTickMarkColor 對(duì)應(yīng)未選中刻度顏色; tickMarkShape 對(duì)應(yīng)刻度樣式;
trackHeight 為 Slider 軌道高度; trackShape 對(duì)應(yīng)軌道樣式,主要再此處進(jìn)行自定義樣式;
對(duì)于不可滑動(dòng)狀態(tài), SliderThemeData 提供了對(duì)應(yīng)屬性;
Slider 案例源碼
小菜本節(jié)暫未涉及自定義滑動(dòng)條樣式,對(duì)于底層的 Slider 了解還不夠深入;如有錯(cuò)誤,請(qǐng)多多指導(dǎo)!
在移動(dòng)端,各個(gè)平臺(tái)或 UI 系統(tǒng)的原始指針事件模型基本都是一致,即:一次完整的事件分為三個(gè)階段:手指按下、手指移動(dòng)、和手指抬起,而更高級(jí)別的手勢(shì)(如點(diǎn)擊、雙擊、拖動(dòng)等)都是基于這些原始事件的。
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ù)
基本和AppBar一樣,只是他只能在CustomScrollView中使用,應(yīng)該很常見(jiàn),滑動(dòng)的時(shí)候固定appbar,就需要用到他.
大部分和appbar一樣,主要說(shuō)下重要的幾個(gè):
是否將導(dǎo)航欄部分固定在appbar的位置.這個(gè)需求在實(shí)際中很常用. 看看效果圖.
當(dāng) pinned = false:
可以看到appbar并沒(méi)有固定在最上面,而是根據(jù)內(nèi)容劃出了界面.
當(dāng) pinned = true :
這個(gè)應(yīng)該是需求中經(jīng)常用到的效果了.
當(dāng)floating = false :
當(dāng)floating = true:
仔細(xì)看 ,區(qū)別是在列表整體向下滑動(dòng)時(shí),appbar開(kāi)始顯示的位置不同.
當(dāng)為false時(shí) ,向下滑動(dòng)時(shí),會(huì)先降列表內(nèi)容滑動(dòng)頂部,然后appbar會(huì)跟著列表滑動(dòng)顯示出來(lái).如上圖
當(dāng)為true時(shí), 向下滑動(dòng)時(shí),appbar會(huì)先跟著列表滑動(dòng)顯示出來(lái). 然后繼續(xù)列表的滑動(dòng). 如上圖
不能單獨(dú)使用要配合 ****floating 和 ****pinned
具體效果看官網(wǎng)地址
是否展開(kāi),默認(rèn)false,直接看值為true的效果圖,就明白了.
可以再里面添加擴(kuò)展的內(nèi)容:
通過(guò)測(cè)試發(fā)現(xiàn) **后面不是 FlexibleSpaceBar 的話, stretch = true 無(wú)效. **
和Padding一樣.子控件是 sliver 類型...
上圖中在padding中添加了一個(gè)背景色為青色的容器widget
里面可以設(shè)置不是 sliver 類型的widget。如上圖中的 padding中添加的 container
就兩個(gè)協(xié)議,一個(gè)是布局協(xié)議一個(gè)展示協(xié)議.基本和GridView一樣.也有count和extext... 不設(shè)置個(gè)數(shù)默認(rèn)無(wú)數(shù)個(gè)
SliverChildListDelegate 這種方式前提是知道cell個(gè)數(shù),比較少,好搭建
SliverChildBuilderDelegate 這種方式,可以根據(jù)數(shù)組去創(chuàng)建,不知道cell個(gè)數(shù)
和listview差不多.也是協(xié)議 不設(shè)置個(gè)數(shù)默認(rèn)無(wú)數(shù)個(gè)
標(biāo)題名稱:flutter滑動(dòng)開(kāi)關(guān),flutter懸浮窗口
網(wǎng)站URL:http://chinadenli.net/article20/dsegijo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、關(guān)鍵詞優(yōu)化、網(wǎng)站策劃、云服務(wù)器、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)公司
聲明:本網(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)