上一篇文章用Scaffold widget搭建了一个带底部导航栏的的项目架构,这篇文章就来介绍一下在flutter中怎么实现一个带下拉刷新和上拉加载更多的一个列表,这里用到了pull_to_refresh的第三方库。

1、在pubspec.yaml文件中加入一行代码,导入第三方库。

 dependencies:
pull_to_refresh: ^1.6.1

2、新建一个类,继承自StatefulWidget来添加一个新的页面,在build方法中,返回一个 Scaffold 控件,在appbar参数中可以定义你想要的标题栏样式,在body参数中定义你要实现页面的主题内容,这里我要实现一个带刷新和加载功能的列表,所以我们在外层嵌套一个pull_to_refresh库中的SmartRefresher控件,下面是该控件的构造方法,支持下面这些参数,常用的参数都已经备注。

SmartRefresher(
{Key key,
@required this.controller,//控制内部状态 ,必选参数
this.child, //你的内容部件
this.header, //头部指示器构造,默认值 ClassicHeader
this.footer, //尾部指示器构造 默认值 ClassicHeader
this.enablePullDown: true, //激活下拉刷新,默认开启
this.enablePullUp: false,// 激活上拉加载更多,默认关闭
this.enableTwoLevel: false, //是否允许打开头部指示器二楼的功能,默认不允许
this.onRefresh, //进入下拉刷新时的回调
this.onLoading, //进入上拉加载时的回调
this.onTwoLevel, //当准备打开二楼时的回调
this.onOffsetChange,
this.dragStartBehavior,
this.primary,
this.cacheExtent,
this.semanticChildCount,
this.reverse,
this.physics,
this.scrollDirection,
this.scrollController})

其中有一个必传参数,controller@required修饰的参数表示必传的意思),该参数是RefreshController类型参数,可以通过该对象的一些方法主动触发下拉刷新,上拉加载,开启二楼等主动功能,

 //  请求顶部指示器刷新,触发onRefresh
void requestRefresh(
{Duration duration: const Duration(milliseconds: 300),
Curve curve: Curves.linear});
// 请求底部指示器加载数据,触发onLoading
void requestLoading(
{Duration duration: const Duration(milliseconds: 300),
Curve curve: Curves.linear}) ;
// 主动打开二楼
void requestTwoLevel(
{Duration duration: const Duration(milliseconds: 300),
Curve curve: Curves.linear}); // 顶部指示器刷新成功,是否要还原底部没有更多数据状态
void refreshCompleted({bool resetFooterState:false});
// 不显示任何状态,直接变成idle状态隐藏掉
void refreshToIdle();
// 顶部指示器刷新失败
void refreshFailed();
// 关闭二楼
void twoLevelComplete(
{Duration duration: const Duration(milliseconds: 500),
Curve curve: Curves.linear};
// 底部指示器加载完成
void loadComplete();
// 底部指示器进入一个没有更多数据的状态
void loadNoData();
// 底部加载失败
void loadFailed()
// 刷新底部指示器状态为idle
void resetNoData();

更多功能可以参考pull_to_refresh主页,这是目前dart中功能最全的刷新加载更多组件拉。

3、在StatefulWidget中嵌套一个列表组件,在flutter中官方给我们提供了一个可以用来加载列表数据的一个组件ListView,和Android中的ListView控件名称一样,很容易理解。

但是一般情况下我们会用ListView.builder的来构建一个列表组件,因为直接使用ListView构建的时候,不管有多少条数据都会一次性加载出来,但是ListView.builder构建的话,有一个延时加载策略,值加载当前屏幕显示的数据,相对而言其性能会更好写。所以当数据比较多的时候,推荐用ListView.builder构建来构建列表组件。

 @override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("文章列表")),
body: SmartRefresher(
controller: _refreshController,
enablePullUp: true,
onRefresh: onRefresh, //自定义的刷新方法
onLoading: loadMore, //自定义加载更多方法
header: WaterDropHeader(),
footer: ClassicFooter(),
child: ListView.builder(
itemBuilder: (context, index) => ItemPage(_articles[index]),
itemCount: _articles.length)));
}

这里要注意一个问题,之前我一位ListView如果想要填充满整个屏幕的话是需要设置高度充满的,所以我就自作聪明的在ListView的外面嵌套来一个Expanded 来填充布局铺满屏幕,结果弄来半天,都不能手动下拉刷新和加载更多,最后,分析发现是填充的问题,结果去掉之后就ok了,并且ListView和Android 中一样都是可以根据item的个数自动适应是否铺满全屏,所以外面不需要再嵌套其他的约束组件来。

Flutter学习四之实现一个支持刷新加载的列表的更多相关文章

  1. js中对arry数组的各种操作小结 瀑布流AJAX无刷新加载数据列表--当页面滚动到Id时再继续加载数据 web前端url传递值 js加密解密 HTML中让表单input等文本框为只读不可编辑的方法 js监听用户的键盘敲击事件,兼容各大主流浏览器 HTML特殊字符

    js中对arry数组的各种操作小结   最近工作比较轻松,于是就花时间从头到尾的对js进行了详细的学习和复习,在看书的过程中,发现自己平时在做项目的过程中有很多地方想得不过全面,写的不够合理,所以说啊 ...

  2. 瀑布流AJAX无刷新加载数据列表--当页面滚动到Id时再继续加载数据

    瀑布流加载显示数据,在当下已经用的很普遍,尤其是我们在做网上商城时,在产品列表页面已经被普遍使用. 对于实现瀑布流布局的解决方案主要有以下两种方式: 1.对每一条显示数据使用绝对定位+浮动的方式,这样 ...

  3. Flutter学习六之实现一个带筛选的列表页面

    上期实现了一个网络轮播图的效果,自定义了一个轮播图组件,继承自StatefulWidget,我们知道Flutter中并没有像Android中activity的概念.页面见的跳转是通过路由从一个全屏组件 ...

  4. 【SpringBoot 基础系列】实现一个自定义配置加载器(应用篇)

    [SpringBoot 基础系列]实现一个自定义配置加载器(应用篇) Spring 中提供了@Value注解,用来绑定配置,可以实现从配置文件中,读取对应的配置并赋值给成员变量:某些时候,我们的配置可 ...

  5. Android UI--自定义ListView(实现下拉刷新+加载更多)

    Android UI--自定义ListView(实现下拉刷新+加载更多) 关于实现ListView下拉刷新和加载更多的实现,我想网上一搜就一堆.不过我就没发现比较实用的,要不就是实现起来太复杂,要不就 ...

  6. android 在自定义的listview(有刷新加载项)列表中,数据过少时不能铺满整个屏幕时,header和footer同时显示问题

    android  在自定义的listview(有刷新加载项)列表中,数据过少时,当刷新时,加载项也会显示,这是很头疼的一个问题,查阅了一些资料,总结了一个比较不错的方法: 原来代码: @Overrid ...

  7. [jQuery插件]手写一个图片懒加载实现

    教你做图片懒加载插件 那一年 那一年,我还年轻 刚接手一个ASP.NET MVC 的 web 项目, (C#/jQuery/Bootstrap) 并没有做 web 的经验,没有预留学习时间, (作为项 ...

  8. [学习总结]9、Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)

    这个图片异步加载并缓存的类已经被很多开发者所使用,是最常用的几个开源库之一,主流的应用,随便反编译几个火的项目,都可以见到它的身影. 可是有的人并不知道如何去使用这库如何进行配置,网上查到的信息对于刚 ...

  9. 分页插件思想:pc加载更多功能和移动端下拉刷新加载数据

    感觉一个人玩lol也没意思了,玩会手机,看到这个下拉刷新功能就写了这个demo! 这个demo写的比较随意,咱不能当做插件使用,基本思想是没问题的,要用就自己封装吧! 直接上代码分析下吧! 布局: & ...

随机推荐

  1. Java中实现十进制数转换为二进制的三种方法

    第一种:除基倒取余法 这是最符合我们平时的数学逻辑思维的,即输入一个十进制数n,每次用n除以2,把余数记下来,再用商去除以2...依次循环,直到商为0结束,把余数倒着依次排列,就构成了转换后的二进制数 ...

  2. Webfunny知识分享:JS错误监控

    现在的前端开发已不再是刀耕火种的年代了,各种框架.编译工具层出不穷,前端监控系统也不甘其后,遍地开花. 前端正承受着越来越重的职责,前端的业务也变得越来越复杂,此时此刻我们就更需要一套完善的监控系统来 ...

  3. python基础 Day11

    python Day11 函数中默认参数的陷阱 只针对默认参数是可变的数据类型(如果你的默认参数指向的是可变的数据类型,那么你无论调用多少次默认参数,都是同一个) def test(name,list ...

  4. 9.hbase相关进程作用

    1.协调服务组件Zookeeper Zookeeper的作用如下: 1. 保证任何时候,集群中只有一个HMaster: 2. 存储所有的HRegion的寻址入口: 3. 实时监控HRegionServ ...

  5. maven命令下载jar包

    mvn install:install-file -Dfile=jar包保存的本地路径 -DgroupId=jar保存的父级路径 -DartifactId=jar包文件夹名称 -Dversion=版本 ...

  6. 你所不知道的Spring的@Autowired实现细节

    前言 相信很多Java开发都遇到过一个面试题:Resource和Autowired的区别是什么?这个问题的答案相信基本都清楚,但是这两者在Spring中是如何实现的呢?这就要分析Spring源码才能知 ...

  7. 自我介绍网页填写表格PHP,JavaScript,html,css代码

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. sublime Text 3安装 Sublime Package Control(这个可以用于安装各种插件)时显示默认安装的c盘内存不够的解决方案

    首先先关闭st3 之后在安装的路径下创建Data文件夹,然后打开st3(sublime Text 3简写)CTRL+`打开命令行输入以下内容,直接回车,等待下载完成就可以了import urllib. ...

  9. Unity中的枚举和标志

    译林军 宿学龙|2014-04-10 08:56|9007次浏览|Unity(377)0 枚举和标志 今天的主题是枚举,它是C#语言中的一个很有帮助的工具,可以增强代码的清晰度以及准确性. 枚举一系列 ...

  10. unity physics相关

    1. With careful positioning and sizing, compound colliders can often approximate the shape of an obj ...