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.mzph.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 根据上面网站提供的修改方法…