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