上一篇文章用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. Spring注解驱动开发02(作用域和懒加载)

    Spring中bean的作用域 默认情况下,Spring只为每个在IOC容器里声明的bean创建唯一一个实例,整个IOC容器范围内都能共享该实例:所有后续的getBean()调用和bean引用都将返回 ...

  2. 为什么 max() 应该写成 b < a ? a : b 呢?

    在 < C++ Templates 2nd Edition >Chapter 1 中,作者将 max() 模板定义如下: template <typename T> T max ...

  3. oracle 分页的两种方式

    实例:查询5-8名学生的姓名与成绩 --oracle的分页1 between 方式(分三次查询,第一次只作排序,第二次给表加上rownum序列,第三次为查询结果) select s.scorenumb ...

  4. go chan 缓存与阻塞

    原文链接:Go语言第十一课 并发(三)Channel缓存与阻塞 Channel的缓存 前面介绍过channel的创建方法: channel_test := make(chan string) 其实它完 ...

  5. HDU 6609 离散化+权值线段树

    题意 有一个长度为\(n\)的数组W; 对于每一个\(i\)(\(1<=i<=n\)),你可以选择中任意一些元素W[k] (\(1<=k<i\)),将他们的值改变为0,使得\( ...

  6. 5. java 的类和对象

    1.什么是类 类 :是一组相关属性和行为的集合.可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该类事物.现实中,描述一类事物:属性 :就是该事物的状态信息.行为 :就是该事物能够做什么. ...

  7. 外贸网站SEO优化哪家公司好

    http://www.wocaoseo.com/thread-98-1-1.html        随着b2c的崛起,越来越多的企业已经放弃挂在第三方面台销售,而是选择去建独立的商场,拥有一个属于自已 ...

  8. go语言之字符串、指针、数组、切片、结构struct、面向对象

    一: 字符串 概述: Go 语言将字符串作为 种原生的基本数据类型,字 符串的初始化可以使用字符串字面量. (1)字符串是常量,可以通过类 数组 索引访问其字节单元,但是不能修改某个字节的值 (2)宇 ...

  9. 在Spring中拦截器的使用

    Filter Filter是Servlet容器实现的,并不是由Spring 实现的 下面是一个例子 import java.io.IOException; import javax.servlet.F ...

  10. 【JAVA】给大家推荐一道有意思的java测试题。你知道答案吗?

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985, QQ986945193 公众号:程序员小冰 public class Test { /** * * ...