下拉刷新

很简单,直接使用 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;});}
}
复制代码

Flutter下拉刷新,上拉加载更多数据相关推荐

  1. (仿头条APP项目)6.点击过的新闻列表文字变灰和下拉刷新与滚动加载新闻数据

    文章目录 一.点击过的新闻列表文字变灰 效果图 实现思路 导入ormlite数据库类依赖 利用ormlite创建数据库和表 创建数据库类MyDbHelper 创建数据库中的新闻实体类NewInfo 页 ...

  2. uni-app下拉刷新触底加载更多

    首先在pages.json 配置文件中配置    "enablePullDownRefresh": true  需要在哪用加载就配置在路由的style里 两个事件 //下拉刷新 o ...

  3. recyclerview的数据刷新(下拉刷新和自动加载更多)以及添加提示语(例如:“数据已加载完毕”)

    下拉加载更多的核心是SwipeRefreshLayout搭配Recyclerview进行使用.布局为 <android.support.v4.widget.SwipeRefreshLayout ...

  4. Android 自定义 ListView 上下拉动“刷新最新”和“加载更多”歌曲列表

    本文内容 环境 测试数据 项目结构 演示 参考资料 本文演示,上拉刷新最新的歌曲列表,和下拉加载更多的歌曲列表.所谓"刷新最新"和"加载更多"是指日期.演示代码 ...

  5. Flutter开发之ListView下拉刷新上拉加载更多(35)

    在Flutter开发之ListView组件(21) 文章中,我们了解了ListView组件的基本使用.但是数据比较少,没有涉及分页加载.而实际开发中,下拉刷新和分页加载几乎是所有APP的标配.在iOS ...

  6. 分享轮子-flutter下拉刷新上拉加载

    flutter下拉上拉组件轮子 什么是flutter? 首先说下flutter,估计这个应该挺多人没听过flutter这个框架,它是一个google推出的跨平台的移动应用UI框架,和React Nat ...

  7. 开启Fluter基础之旅五-------ListView 3D滚动、Flipper效果、ListView下拉刷新上拉加载、ListView重排序...

    继续来来操练Flutter的基础,对于Flutter的学习也有一段时间了,实操项目还木有做过,所以待这次基础学完之后就打算用一个项目对之前所学的进行一下巩固,不然光学这些零散的知识点最终还是不会Flu ...

  8. ajax 下拉刷新 上拉加载更多,局部刷新iscroll控件的具体使用(下拉刷新,上拉加载更多)...

    标签下,这是调用iscroll的必要条件,否则会出现不能刷新或者不能滑动页面的情况.此外还有商量刷新及下拉刷新的标签,在iscroll中有这两个标签的样式,若不想用默认的样式,也可通过覆盖的方式添加其 ...

  9. 下拉加载 实现 java_[Java教程]iscroll5实现一个下拉刷新上拉加载的效果

    [Java教程]iscroll5实现一个下拉刷新上拉加载的效果 0 2016-08-24 15:00:08 直接上代码!!! * { margin: 0; padding: 0; } ul, li { ...

最新文章

  1. BGA封装芯片手工焊接攻略
  2. 独家 | 如何创建用于离线估算业务指标的测试集?(附代码链接)
  3. 黄仁勋的“数据梦” 英伟达豪掷69亿美金虎口夺食
  4. Unable to open a test connection to the given database.
  5. 获取android设备唯一编号_android 获取手机设备的唯一码(IMIE )
  6. 笔记本多硬盘win7下U盘安装Cnetos7引导问题!
  7. 大数据进入人工智能时代:2017年大数据生态地图新鲜出炉
  8. [转载] c++的vector赋值方法汇总
  9. 计算机多余自动启动项,去掉多余的开机启动项
  10. 百度地图API获取行政区域边界(省、市、区县)
  11. 一口气说出 OAuth2.0 的四种授权方式,面试官会高看一眼
  12. Beautiful Songs
  13. c#上位机plc通讯读位
  14. 刚刚,Google AI 部门换帅,李飞飞宣布离职!
  15. 用Python学《微积分B》(多元函数Taylor公式)
  16. 驱动之家驱动界定说明
  17. c语言编程最大公约数穷举发,C语言基本算法 :1.求最大公约数与最小公倍数
  18. 计算机组成原理习题 第七章 外围设备
  19. 22.1.4猫和老鼠
  20. 宣传单彩页_印刷一份彩页宣传单张有五个注意事项

热门文章

  1. Java 捕获 mybatis异常_3 springboot集成mybatis和全局异常捕获
  2. java钱币换算_Java编写钱币转换为大写程序
  3. 换发型算法_GitHub - fredliu168/yry: yry(颜如玉)—— 一个实现人脸融合的算法,可以接近腾讯天天P图疯狂变脸功能的效果...
  4. c语言中语句作用,学习C语言的用途~
  5. mybatis依赖_这大概就是公司一直用Mybatis的原因!真的太强了
  6. 站怎么点都是一样_抖音怎么做?这几样一样都不能少,你都做到了吗?
  7. 计算机主机箱前后都有什么,目前四种热门的主机机箱设计都有哪些优缺点?
  8. mysql权限系统的工作原理_Mysql权限系统工作原理
  9. 5条件筛选功能_一分钟,彻底学会Excel高级筛选,坐等升职加薪!
  10. java is-a_java中 is - a和 has - a的区别