Flutter 项目实战 下拉刷新、上拉加载 九

Flutter 项目实战 下拉刷新、上拉加载 九下拉刷新和上拉加载更多可以更好的分页加载数据

/ 不同列表样式 /

Flutter 项目实战 下拉刷新、上拉加载 九
普通列表下拉刷新与上拉加载

Flutter 项目实战 下拉刷新、上拉加载 九
GridView 列表下拉刷新和上拉加载

​​​​

        / 自定义下拉刷新、上拉加载样式 /

作为一名Flutter开发者 , 在选择依赖库的时候 需要注意的几个点 :

. 依赖库的评分 pull_to_refresh

 Flutter 项目实战 下拉刷新、上拉加载 九 

. 依赖库最后更新的时间 

 Flutter 项目实战 下拉刷新、上拉加载 九

 . 依赖库问题的反馈情况

 Flutter 项目实战 下拉刷新、上拉加载 九

 . 依赖库的来源

  pull_to_refresh

Flutter 项目实战 下拉刷新、上拉加载 九

自定义下拉刷新头部样式

ClassicHeader classicHeader() { return ClassicHeader( releaseText: '松开手刷新', refreshingText: '刷新中', completeText: '刷新完成', failedText: '刷新失败', idleText: '下拉刷新', completeIcon: const Icon(Icons.done, color: Colors.red), idleIcon: const Icon(Icons.arrow_downward, color: Colors.red), releaseIcon: const Icon(Icons.refresh, color: Colors.red), failedIcon: const Icon(Icons.error, color: Colors.red), refreshingIcon: cirProInt(), ); }

旋转动画

Container cirProInt() { return Container( child: CircularProgressIndicator( valueColor: AlwaysStoppedAnimation(Colors.red), strokeWidth: 4.0, backgroundColor: Colors.blue, ), width: 20.0, height: 20.0, ); }

 自定义上拉加载更多底部样式

  . 简单定义

ClassicFooter classicFooter() { return ClassicFooter( height: 100.0, loadingText: '加载中...', noDataText: '暂无数据', failedText: '加载失败', idleText: '上拉加载', ); }

Flutter 项目实战 下拉刷新、上拉加载 九

. 自定义上拉加载

  根据不同的加载状态显示不同的提示 ; 设置底部自定义视图点击可以加载更多数据 .

Flutter 项目实战 下拉刷新、上拉加载 九

Flutter 项目实战 下拉刷新、上拉加载 九

CustomFooter? customerFooter(State state, RefreshController controller, {ILoadDataCallBack? callBack}) { return CustomFooter( height: 40.0, builder: (BuildContext context, LoadStatus? mode) { ///上拉加载提示 String loadTips = ''; ///是否加载中 bool isLoading = false; ///是否可点击加载更多 bool isCanClick = false; if (mode == LoadStatus.idle) { loadTips = '上拉加载更多数据'; isLoading = false; isCanClick = false; } else if (mode == LoadStatus.loading) { isLoading = true; isCanClick = false; loadTips = '数据加载中...'; } else if (mode == LoadStatus.failed) { loadTips = '加载失败,上拉加载更多数据'; isCanClick = false; isLoading = false; } else if (mode == LoadStatus.canLoading) { loadTips = '点击加载更多数据'; isLoading = false; isCanClick = true; } else { isLoading = false; loadTips = '暂无数据,点击可重新加载数据'; isCanClick = true; } return GestureDetector( onTap: () { if (isCanClick) { controller.footerMode!.value = LoadStatus.canLoading; isLoading = true; print('上拉加载更多 $isCanClick'); } }, child: Container( height: 40.0, color: Colors.transparent, child: Center( child: isLoading ? Row( mainAxisAlignment: MainAxisAlignment.center, children: [ cirProInt(), Text( '\t\t$loadTips', style: TextStyle( color: Color(0xFFBDBDBD), fontSize: 14.0), ), ], ) : Text( '$loadTips', style: TextStyle(color: Color(0xFFBDBDBD), fontSize: 14.0), ), ), )); }, loadStyle: LoadStyle.ShowAlways, ); } ///加载更多数据 typedef void ILoadDataCallBack();

 . 使用自定义加载更多 customerFooter

Flutter 项目实战 下拉刷新、上拉加载 九  

Flutter 项目实战 下拉刷新、上拉加载 九

 /  列表滚动是否可优化 /

通过开发者工具 AS 查看 Frame rendering times (大概意思就是每秒视图渲染多少帧)

. 理想状态下每秒渲染的帧数是接近1秒钟60帧 ,下面的状态是比1秒钟60帧低了很多 . 列表滚动的过程中需要渲染的列表的每个视图 视图里面包含了一张图片 . 可以尝试不加载图片 , 观察一下每一秒绘制多少帧 .

Flutter 项目实战 下拉刷新、上拉加载 九
列表每一项

Flutter 项目实战 下拉刷新、上拉加载 九

. 取消图片加载 ,观察列表滚动时 每秒钟渲染的帧数 , 有明显的上升趋势 . 所以为了进一步优化, 我们需要在滚动列表时 , 列表停止滚动加载视图 .

Flutter 项目实战 下拉刷新、上拉加载 九
列表每一项

Flutter 项目实战 下拉刷新、上拉加载 九

. 监听列表滚动状态  ( NotificationListener ) 

Flutter 项目实战 下拉刷新、上拉加载 九
列表滚动状态

bool notificationFunction(Notification notification) { ///通知类型 switch (notification.runtimeType) { case ScrollStartNotification: print("开始滚动"); ///刷新页面 不加载图片 isLoadingPic = false; break; case ScrollUpdateNotification: print("正在滚动"); break; case ScrollEndNotification: print("滚动停止"); ///刷新页面 加载图片 setState(() { isLoadingPic = true; }); break; case OverscrollNotification: print("滚动到边界"); break; } return true; } 

. 列表滚动过程中不渲染图片到列表, 滚动完成渲染 并查看每秒绘制多少帧 到情况 .

Flutter 项目实战 下拉刷新、上拉加载 九
通过滚动状态控制图片的加载

 Flutter 项目实战 下拉刷新、上拉加载 九

 Flutter 项目实战 下拉刷新、上拉加载 九

 免费接口 京东云

下拉刷新、上拉加载更多案例

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231428.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python生兔子问题(递归算法)_python递归实现斐波那契数列

    python生兔子问题(递归算法)_python递归实现斐波那契数列兔子产子1.问题描述有一对兔子,从出生后的第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子,假设所有的兔子都不死,问30个月内每个月的兔子总对数为多少?2.问题分析兔子产子

    2022年8月7日
    5
  • 用什么软件写html语言,写html代码用什么软件

    用什么软件写html语言,写html代码用什么软件写html代码的软件:1、SublimeText;2、Dreamweaver;3、WebStorm;4、HBuilder;5、Notepad;6、VSCode;7、Vim;8、AptanaStudio;9、IntelliJIDEA。本教程操作环境:windows7系统、HTML5版、DellG3电脑。1、SublimeTextSublimeText是一个跨平台的代码编辑器,同时支持W…

    2022年5月30日
    59
  • js删除某个数组_js数组删除对象

    js删除某个数组_js数组删除对象Array.prototype.remove=function(val){ varindex=this.indexOf(val); if(index>-1){ this.splice(index,1); } };vardata=[1,2,3,4,5,6]data.remove(index);//你要删除的数

    2022年9月30日
    2
  • 哈佛结构与普林斯顿结构_普林斯顿大学和哈佛大学哪个更厉害

    哈佛结构与普林斯顿结构_普林斯顿大学和哈佛大学哪个更厉害1. 冯·诺依曼结构   冯·诺依曼结构,又称为普林斯顿体系结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。取指令和取操作数都在同一总线上,通过分时复用的方式进行;缺点是在高速运行时,不能达到同时取指令和取操作数,从而形成了传输过程的瓶颈。由于程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同,如英特尔公司的8086中央处理器的程序指

    2022年10月5日
    1
  • SynchronousQueue的使用

    SynchronousQueue的使用https://blog.csdn.net/cn_yaojin/article/details/80852395原文地址:https://blog.csdn.net/zmx729618/article/details/52980158SynchronousQueue是这样一种阻塞队列,其中每个put必须等待一个take,反之亦然。同步队列没有任何内部容量,甚至连一个队…

    2022年6月22日
    26
  • Typora教程(附安装包)「建议收藏」

    Typora教程(附安装包)「建议收藏」Typora安装包:链接:https://pan.baidu.com/s/14fTQQmPQmf08pi833RT6Cg提取码:j712复制这段内容后打开百度网盘手机App,操作更方便哦

    2022年5月19日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号