摘要:上一篇我們實(shí)現(xiàn)了新聞列表,但在網(wǎng)絡(luò)不好的時(shí)候列表會(huì)白屏,因此為了提高使用體驗(yàn),往列表中加入懶加載效果。其次,引入一個(gè)內(nèi)置的手勢(shì)控件,用于支持下拉刷新列表的效果如下圖將異步執(zhí)行也進(jìn)行了控件化處理,即。
上一篇我們實(shí)現(xiàn)了新聞列表,但在網(wǎng)絡(luò)不好的時(shí)候列表會(huì)白屏,因此為了提高使用體驗(yàn),往列表中加入懶加載效果。其次,引入一個(gè)Flutter內(nèi)置的手勢(shì)控件,用于支持下拉刷新列表的效果如下圖:
Flutter將異步執(zhí)行也進(jìn)行了控件化處理,即:Future。不過我還沒完全掌握怎么使用Future,只能把學(xué)到的跟大家分享一下,以后玩6了再補(bǔ)充。前面的分享中大家應(yīng)該也接觸并使用到了Future,比如IO操作的HTTP請(qǐng)求。除了通過async和await關(guān)鍵字以外,還可以用一個(gè)更方便的控件,可生成代碼在異步執(zhí)行時(shí)間軸上的快照,并按照自己的需求觸發(fā)需要的事件,這就是FutureBuilder控件。
FutureBuilder用法和實(shí)現(xiàn)先簡(jiǎn)單講講FutureBuilder。
//FutureBuilder控件 new FutureBuilder( future: _calculation, // 用戶定義的需要異步執(zhí)行的代碼,類型為Future 或者null的變量或函數(shù) builder: (BuildContext context, AsyncSnapshot snapshot) { //snapshot就是_calculation在時(shí)間軸上執(zhí)行過程的狀態(tài)快照 switch (snapshot.connectionState) { case ConnectionState.none: return new Text("Press button to start"); //如果_calculation未執(zhí)行則提示:請(qǐng)點(diǎn)擊開始 case ConnectionState.waiting: return new Text("Awaiting result..."); //如果_calculation正在執(zhí)行則提示:加載中 default: //如果_calculation執(zhí)行完畢 if (snapshot.hasError) //若_calculation執(zhí)行出現(xiàn)異常 return new Text("Error: ${snapshot.error}"); else //若_calculation執(zhí)行正常完成 return new Text("Result: ${snapshot.data}"); } }, )
FutureBuilder通過子屬性future獲取用戶需要異步處理的代碼,用builder回調(diào)函數(shù)暴露出異步執(zhí)行過程中的快照。我們通過builder的參數(shù)snapshot暴露的快照屬性,定義好對(duì)應(yīng)狀態(tài)下的處理代碼,即可實(shí)現(xiàn)異步執(zhí)行時(shí)的交互邏輯。
看起來似乎有點(diǎn)暈菜,可能還是不知道怎么用,讓我們看看下面這段實(shí)戰(zhàn)代碼:
snapshot.connectionState就是異步函數(shù)get(widget.newsType)的執(zhí)行狀態(tài),用戶通過定義在ConnectionState.none和ConnectionState.waiting狀態(tài)下,輸出一個(gè)居中(Center)顯示并且內(nèi)置文字(Text)為_loading..._的卡片(Card),其意義即:當(dāng)異步函數(shù)get(widget.newsType)未執(zhí)行和正在執(zhí)行時(shí),屏幕正中央顯示文字:_loading..._。
當(dāng)get(widget.newsType)執(zhí)行完畢后,snapshot.connectionState的值即變?yōu)?b>ConnectionState.done,此時(shí)即可輸出根據(jù)HTTP請(qǐng)求獲取到的數(shù)據(jù)生成對(duì)應(yīng)的ListItem。由于ConnectionState.done是除了ConnectionState.none和ConnectionState.waiting以外的唯一值,所以代碼中在switch下用default即可。
由于通過FutureBuilder內(nèi)的builder()函數(shù)即可操控控件的狀態(tài)和重繪,碼農(nóng)不必通過自己寫異步狀態(tài)的判斷和多次使用setState()實(shí)現(xiàn)頁面上加載中和加載完成顯示效果的切換,因?yàn)?strong>FutureBuilder內(nèi)部自帶了執(zhí)行setState()的方法。
懶加載就這么輕松實(shí)現(xiàn)了,玩家還可以自己定義更漂亮的加載中的提示控件,FutureBuilder的控件化非常的純凈和徹底,它只做異步監(jiān)視,沒有內(nèi)置可視化控件,視覺上的處理完全交由玩家自行定義,可玩度非常高,相信很多IO操作都會(huì)用到這個(gè)控件。RefreshIndicator的用法和實(shí)現(xiàn)
RefreshIndicator是Flutter基于Material設(shè)計(jì)語言內(nèi)置的控件,集合了下拉手勢(shì)、加載指示器和刷新操作一體,可玩性比FutureBuilder差了一大截,不過大家也用過Material設(shè)計(jì)語言的其他控件,視覺效果也不賴的,先看看控件的基本結(jié)構(gòu):
RefreshIndicator( //RefreshIndicator的子元素必須是一個(gè)可以滾動(dòng)的控件 //如果你遇到不符合條件的控件,請(qǐng)將其用可以滾動(dòng)的控件(如ListView、PageView等)包裝一下 child: new ScrollableWidget, onRefresh: loadData, //onRefresh的回調(diào)必須是一個(gè)Future類型 )
這個(gè)控件的使用非常簡(jiǎn)單,相信大家很容易理解,然后我們來看看實(shí)戰(zhàn)代碼:
是不是很簡(jiǎn)單,如果你想對(duì)某個(gè)控件實(shí)現(xiàn)下拉手勢(shì)刷新的效果,用RefreshIndicator包裝一下,分分鐘搞定。但需要注意的就是onRefresh的回調(diào)函數(shù)必須是Future
全篇的代碼,大家可以到我的Git中下載,將來我還會(huì)在這個(gè)APP中添加更多的功能和代碼注釋,喜歡的同學(xué)也可以star我一下,哈哈哈,讓我也浪一波。
本篇內(nèi)容不多,對(duì)Future欲望強(qiáng)烈的玩家,完全可以在IDE中Ctrl+鼠標(biāo)左鍵點(diǎn)擊代碼中的Future或FutureBuilder關(guān)鍵字,到Flutter源碼中查看其原理和說明,當(dāng)然了,和官網(wǎng)的內(nèi)容是一模一樣的。
官方文檔更新很頻繁,看得出谷歌推Flutter真的是誠意滿滿,喜歡Flutter的小伙伴,也可以加入到Flutter圈子或flutter 中文社區(qū)(官方QQ群:338252156),群里有前后端及全棧各路大神鎮(zhèn)場(chǎng)子,加入進(jìn)來沒事就寫寫APP掙點(diǎn)外快(這個(gè)真的有),順便翻譯翻譯官方英文原稿拉一票粉絲,一舉多得何樂而不為呢。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/94030.html
摘要:當(dāng)我們搭建好了整個(gè)的頁面框架,現(xiàn)在我往頁里加點(diǎn)東西各種分類的新聞列表。由于需要請(qǐng)求外部數(shù)據(jù),因此引入一個(gè)較為方便的庫。于是乎,在初始化對(duì)象時(shí)發(fā)起請(qǐng)求應(yīng)該是個(gè)不錯(cuò)的辦法具體是怎么初始化數(shù)據(jù)的,第三步會(huì)講到,踩了不少坑。 當(dāng)我們搭建好了整個(gè)APP的頁面框架,現(xiàn)在我往Tab頁里加點(diǎn)東西:各種分類的新聞列表。也可以參考我的Git,上面有要點(diǎn)注釋。 showImg(https://segment...
摘要:前言最近比較熱門,但是成體系的文章并不多,前期避免不了踩坑我這篇文章主要介紹如何使用實(shí)現(xiàn)一個(gè)比較復(fù)雜的手勢(shì)交互,順便分享一下我在使用過程中遇到的一些小坑,減少大家入坑作者鏈接先睹為快本項(xiàng)目支持運(yùn)行,效果如下對(duì)了,順便分享一下生成的小竅門,建 前言 Flutter最近比較熱門,但是Flutter成體系的文章并不多,前期避免不了踩坑;我這篇文章主要介紹如何使用Flutter實(shí)現(xiàn)一個(gè)比較復(fù)雜...
摘要:前言最近比較熱門,但是成體系的文章并不多,前期避免不了踩坑我這篇文章主要介紹如何使用實(shí)現(xiàn)一個(gè)比較復(fù)雜的手勢(shì)交互,順便分享一下我在使用過程中遇到的一些小坑,減少大家入坑作者鏈接先睹為快本項(xiàng)目支持運(yùn)行,效果如下對(duì)了,順便分享一下生成的小竅門,建 前言 Flutter最近比較熱門,但是Flutter成體系的文章并不多,前期避免不了踩坑;我這篇文章主要介紹如何使用Flutter實(shí)現(xiàn)一個(gè)比較復(fù)雜...
摘要:如果沒有碰撞結(jié)果,那么通過將事件分發(fā)到全局處理。提供手勢(shì)事件競(jìng)技信息的實(shí)體,內(nèi)封裝參與事件競(jìng)技的成員。這樣勝利的會(huì)通過回調(diào)到中,設(shè)置為標(biāo)志為勝利區(qū)域,然后執(zhí)行和發(fā)出事件響應(yīng)觸發(fā)給這個(gè)控件。本篇將帶你深入了解 Flutter 中的手勢(shì)事件傳遞、事件分發(fā)、事件沖突競(jìng)爭(zhēng),滑動(dòng)流暢等等的原理,幫你構(gòu)建一個(gè)完整的 Flutter 閉環(huán)手勢(shì)知識(shí)體系,這也許是目前最全面的手勢(shì)事件和滑動(dòng)源碼的深入文章了。 ...
摘要:為了達(dá)到更好的顯示效果,最好禁用系統(tǒng)的,如上給添加。頭部固定高度在此高度上顯示刷新狀態(tài)底部高度設(shè)置最大的越界高度靈活的設(shè)置是否禁用上下拉。是否允許越界回彈。表示向上拉下拉釋放時(shí)回調(diào)的狀態(tài)。 TwinklingRefreshLayout v1.04 版精心重構(gòu),優(yōu)化 UI、刷新及越界動(dòng)畫效果,修復(fù)眾多 bug,完美發(fā)布!TwinklingRefreshLayout延伸了Google的Sw...
閱讀 2089·2021-11-24 10:34
閱讀 3064·2021-11-22 11:58
閱讀 3723·2021-09-28 09:35
閱讀 1736·2019-08-30 15:53
閱讀 2787·2019-08-30 14:11
閱讀 1560·2019-08-29 17:31
閱讀 548·2019-08-26 13:53
閱讀 2151·2019-08-26 13:45