Flutter下拉刷新,上拉加載更多數據

下拉刷新

很簡單,直接使用 RefreshIndicator 組件, onRefresh 為重新獲取數據的方法

  Widget build(BuildContext context) {return Scaffold(body: Container(padding: EdgeInsets.all(2.0),child: RefreshIndicator(onRefresh: _refresh,backgroundColor: Colors.blue,child: ListView.builder(itemCount: _dataList.length,itemBuilder: (context, index) {return ListItem(_dataList[index]);},),),),);}Future<Null> _refresh() async {_dataList.clear();await _loadFirstListData();return;}
復制代碼

上拉加載更多

我們先看一下效果

  • 讓我們先從最原始的十條的數據開始
class MyHomePage extends StatefulWidget {@override_MyHomePageState createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> {List<int> items = List.generate(10, (i) => i);@overridevoid initState() {super.initState();}@overridevoid dispose() {super.dispose();}@overrideWidget build(BuildContext context) {return new Scaffold(appBar: AppBar(title: Text("Infinite ListView"),),body: ListView.builder(itemCount: items.length,itemBuilder: (context, index) {return ListTile(title: new Text("Number $index"));},),);}
}
復制代碼

  • 現在我們要編寫一個加載更多數據的方法,用來模擬 http 請求
Future<List<int>> fakeRequest(int from, int to) async {return Future.delayed(Duration(seconds: 2), () {return List.generate(to - from, (i) => i + from);});
}
復制代碼

  • 現在我們想要讓用戶將 ListView 滑動到最末端的觸發 fakeRequest 來加載更多數據,最簡單的實現方式就是使用 ScrollController 來完成,ScrollController 會監聽滾動事件,當 ListView 滾動到末端的時候他會發出一個請求。在這里還有一件需要注意的事就是為了避免對服務器不斷地請求,我們需要做一個標記 isPerformingRequest 只有當它為 false 的時候才允許對后臺進行請求。
class _MyHomePageState extends State<MyHomePage> {List<int> items = List.generate(10, (i) => i);ScrollController _scrollController = new ScrollController();bool isPerformingRequest = false;@overridevoid initState() {super.initState();_scrollController.addListener(() {if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent) {_getMoreData();}});}@overridevoid dispose() {_scrollController.dispose();super.dispose();}_getMoreData() async {if (!isPerformingRequest) {setState(() => isPerformingRequest = true);List<int> newEntries = await fakeRequest(items.length, items.length + 10);setState(() {items.addAll(newEntries);isPerformingRequest = false;});}}@overrideWidget build(BuildContext context) {return new Scaffold(appBar: AppBar(title: Text("Infinite ListView"),),body: ListView.builder(itemCount: items.length,itemBuilder: (context, index) {return ListTile(title: new Text("Number $index"));},controller: _scrollController,),);}
}
復制代碼

如果你現在運行程序你將會看到我們的列表已經可以實現動態加載了,但是這距離我們的目標還很遠,我們需要添加一些標志動作讓用戶這道請求已經開始。


  • 接下來我們要用到 CircularProgressIndicator 去完成這個加載標志
Widget _buildProgressIndicator() {return new Padding(padding: const EdgeInsets.all(8.0),child: new Center(child: new Opacity(opacity: isPerformingRequest ? 1.0 : 0.0,child: new CircularProgressIndicator(),),),);
}
復制代碼
  • 現在我們將這個加載標志放到我們的 ListView 中去,注意這里要給 itemCount 加出一塊空間來放置我們的 _buildProgressIndicator
@override
Widget build(BuildContext context) {return new Scaffold(appBar: AppBar(title: Text("Infinite ListView"),),body: ListView.builder(itemCount: items.length + 1,itemBuilder: (context, index) {if (index == items.length) {return _buildProgressIndicator();} else {return ListTile(title: new Text("Number $index"));}},controller: _scrollController,),);
}
復制代碼
  • 到這里加載更多數據的功能基本完成了,為了更加美觀我們還要處理當沒有請求到更多數據的時候動作,在這里我們添加一個動畫沒有更多數據的時候 ListView 向下移動覆蓋正在加載更多數據的標志
_getMoreData() async {if (!isPerformingRequest) {setState(() => isPerformingRequest = true);List<int> newEntries = await fakeRequest(items.length, items.length); //returns empty listif (newEntries.isEmpty) {double edge = 50.0;double offsetFromBottom = _scrollController.position.maxScrollExtent - _scrollController.position.pixels;if (offsetFromBottom < edge) {_scrollController.animateTo(_scrollController.offset - (edge -offsetFromBottom),duration: new Duration(milliseconds: 500),curve: Curves.easeOut);}}setState(() {items.addAll(newEntries);isPerformingRequest = false;});}
}
復制代碼

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/538305.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538305.shtml
英文地址,請注明出處:http://en.pswp.cn/news/538305.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

qt 批量裁剪圖片_照片變素描,不用下載App,好用的在線圖片處理及圖庫

我們要處理圖片時&#xff0c;無論是在電腦還是手機上&#xff0c;往往都需要下載軟件&#xff0c;但如果你只是臨時用一下的話&#xff0c;下載軟件難免顯得工程有點浩大。下面就推薦幾個圖片處理網站&#xff0c;打開網頁就能用。1、圖片處理 funny。pho。to這個網站提供了很…

Intellij IDEA15:建立Scala的Maven項目

原文鏈接&#xff1a;http://blog.csdn.net/silentwolfyh/article/details/51172369 ------------------------------------------------------------------------------------ 在創建Scala的Maven之前要安裝JavaJDK 、 Scala 的JDK 、 Maven配置&#xff0c;請參考下面 Int…

linux臨時啟動進程命令,Linux常用命令(一)服務控制及優化啟動過程

Linux常用命令(一)服務控制及優化啟動過程一、Red hat系統開機引導過程1、linux操作系統的引導過程一般包括以下幾個階段&#xff1a;開機自檢、MBR引導、GRUB菜單、加載Linux內核、init進程初始化。2、Linux系統中的進程使用數字進行標記&#xff0c;每個進程的身份標記號稱為…

linux 解決端口占用

2019獨角獸企業重金招聘Python工程師標準>>> 1. netstat -apn|grep 9876 2.kill -9 端口號 --------- java 在linux后臺運行的命令 ------------- nohup java -jar demo-shiro-0.0.1-SNAPSHOT.jar >temp.txt & 轉載于:https://my.oschina.net/likaixuan0/…

天鋒w2019_什么樣的商務手機才顯得高端?這款天鋒W2019可能適合你

不同的人群有不同的需求&#xff0c;不同于普通的手機用戶&#xff0c;商務人士所需的手機需要能體現商務人士的身價。商務人士需要帶著手機出入各種商務場所&#xff0c;進行會議、談判、簽約等商務事宜&#xff0c;一款普通的手機無法體現商務人士的高端和深度。同時商務人士…

IDEA中 @override報錯的解決方法

原文路徑&#xff1a;http://www.cnblogs.com/printN/p/6870036.html ------------------------------------ 今天用IDEA導入一個java工程時&#xff0c;碰上一個問題&#xff0c;代碼中所有override處標紅&#xff0c;并提示&#xff1a;override不支持對接口的實現。 網上百…

Linux目錄的可寫意味著,Linux權限分析 - osc_h5427nyq的個人空間 - OSCHINA - 中文開源技術交流社區...

在學習Linux的權限之前&#xff0c;我們先來理解幾個概念:可讀&#xff0c;可寫 、可執行Linux的文件和目錄有以下三種方式&#xff1a;r 、w 、x:可讀&#xff0c;可寫 、可執行r-可讀(read)w-可寫(write)x-可執行(execute)所有者 、所屬組 、其他人Linux的文件和目錄又可以有…

【深度學習篇】--Windows 64下tensorflow-gpu安裝到應用

一、前述 一直以為自己的筆記本不支持tensflow-gpu的運行&#xff0c;結果每次運行模型都要好久。偶然間一個想法&#xff0c;想試試自己的筆記本&#xff0c;結果竟然神奇的發現能用GPU。于是分享一下安裝步驟. 二、具體 因為版本之間有嚴格的對應關系&#xff0c;所以本文就將…

idea中Error:java: Compilation failed: internal java compiler error

Error:java: Compilation failed: internal java compiler error 原因是沒有設置好 java compiler&#xff0c;檢查下 File-----setting---compiler----java compoler

c#輸入三個數選出最大的_C#寫一個輸入三個整數,按大到小順序輸出的小程序...

滿意答案pf481549682013.07.05采納率&#xff1a;52% 等級&#xff1a;12已幫助&#xff1a;9321人int[] arr new int[3];for (int i 0; i < arr.Length; i){Console.WriteLine("請輸入第" (i 1) "個數");arr[i] Convert.ToInt32(Console.Read…

linux查詢內核參數命令,Linux內核啟動參數詳解

1.環境:Ubuntu 16.04Linux linuxidc 4.4.0-89-generic #112-Ubuntu SMP Mon Jul 31 19:38:41 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux2.查看當前linux內核的啟動參數:cat /proc/cmdline筆者的輸出內容如下:BOOT_IMAGE/boot/vmlinuz-4.4.0-89-generic rootUUIDbef418fa-4202-4…

access注入漏洞

and exists(select from msysobjects) >0 判斷是否為access數據庫and exists(select from sysobjects) > 0 判斷是否為sql server數據庫 and exists(select from admin) 查看是否存在admin表 代表所有&#xff0c;可修改字段名order by 數值 判斷字段長度,正常則證明字…

java中的Iterator和Iterable 區別

原文&#xff1a;http://perfy315.iteye.com/blog/1459201 ---------------------------------------------------------- java.lang.Iterable java.util.Iterator 來自百度知道&#xff1a; Iterator是迭代器類&#xff0c;而Iterable是接口。 好多類都實現了Iterable接…

linux版本fedora,技術|初級:如何更新 Fedora Linux 系統

本快速教程介紹了更新 Fedora Linux 安裝的多種方法。安裝 Fedora 之后&#xff0c;我做的第一件事就是嘗試安裝一些軟件。我打開軟件中心&#xff0c;發現該軟件中心已“損壞”。 我無法從中安裝任何應用程序。我不確定我的系統出了什么問題。在團隊內部討論時&#xff0c;Abh…

設計師學習HTML/CSS之路-11

不了解前端的UI不是好美工&#xff0c;以下是慕課網HTMLCSS基礎教程學習筆記&#xff0c;不廢話&#xff0c;Start! 第12章 CSS布局模型 11-1 元素分類 在CSS中&#xff0c;html中的標簽元素大體被分為三種不同的類型&#xff1a;塊狀元素、內聯元素(又叫行內元素)和內聯塊狀元…

yum安裝docker No package docker available

一開始以為是阿里的mirror沒有這個包。后來才知道&#xff0c;是需要更新下epel第三方軟件庫 centos6.5運行命令yum install docker.io&#xff0c;發生錯誤 No package docker available yum沒有找到docker包&#xff0c;更新epel第三方軟件庫&#xff0c;運行命令&#xff1a…

pytorch 對抗樣本_【煉丹技巧】功守道:NLP中的對抗訓練 + PyTorch實現

本文分享一個“萬物皆可盤”的NLP對抗訓練實現&#xff0c;只需要四行代碼即可調用。盤他。最近&#xff0c;微軟的FreeLB-Roberta [1] 靠著對抗訓練 (Adversarial Training)在GLUE榜上超越了Facebook原生的Roberta&#xff0c;追一科技也用到了這個方法僅憑單模型 [2] 就在CoQ…

linux 開源郵件 系統,4 個開源的命令行郵件客戶端

無論你承認與否&#xff0c;email并沒有消亡。對那些對命令行至死不渝的 Linux 高級用戶而言&#xff0c;離開 shell 轉而使用傳統的桌面或網頁版郵件客戶端并不適應。歸根結底&#xff0c;命令行最善于處理文件&#xff0c;特別是文本文件&#xff0c;能使效率倍增。幸運的是&…

kafka清理數據日志

背景問題&#xff1a; 使用kafka的路上踩過不少坑&#xff0c;其中一個就是在測試環境使用kafka一陣子以后&#xff0c;發現其日志目錄變的很大&#xff0c;占了磁盤很大空間&#xff0c;定位到指定目錄下發現其中一個系統自動創建的 topic&#xff0c;__consumer_offsets-45&a…

修改docker-倉庫資源地址Error response from daemon: Get https://index.docker.io/v1/search

[rootzengmg /]# docker search centosError response from daemon: Get https://index.docker.io/v1/search?qcentos: read tcp 52.200.132.201:443: i/o timeout docker在中國已經有了倉庫&#xff1a;https://www.docker-cn.com/registry-mirror 根據上面網站提供的修改方法…