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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java创建WebService服务及客户端实现

    Java创建WebService服务及客户端实现简介WebService是一种服务的提供方式,通过WebService,不同应用间相互间调用变的很方便,网络上有很多常用的WebService服务,如:http://developer.51cto.com/art/200908/147125.htm,不同的语言平台对WebService都有实现,Java的WebService实现,比较流行的有Axis2、Jaxws,…

    2022年7月13日
    22
  • linux busybox安装,busybox的编译、使用及安装

    linux busybox安装,busybox的编译、使用及安装busybox是什么?(1)busybox是Linux上的一个应用程序(application),即只有一个ELF文件头。(2)它整合了许多Linux上常用的工具和命令(utilities),如rm,ls,gzip,tftp等。对于这些工具和命令,busybox中的实现可能不是最全的,但却是最常用的,因此它的特点就是短小精悍,特别适合对尺寸很敏感的嵌入式系统。(3)busybox的官方网站…

    2022年7月25日
    30
  • aMule 无法登录服务器问题

    aMule 无法登录服务器问题

    2021年5月1日
    156
  • JAVA 解析xml的工具类

    JAVA 解析xml的工具类packagecom xml util importjava io IOException importjava io StringReader importjava util ArrayList importjava util List importjava util Map importjava util Set importjava util TreeMap importnet sf json JSONArray importnet sf json JSONO

    2026年1月25日
    1
  • matlab 用循环求和,matlab循环求和函数[通俗易懂]

    matlab 用循环求和,matlab循环求和函数[通俗易懂]matlab求和的出错symsum是符号运算,要先用syms定义符号变量用法详见docsymsum如何用matlab解带求和函数sum的方程举个例子吧:D=[345];A=7;fsolve(@(X)sum(10.^(X-D))-A,0)则ans=3.7998就这么简单.(还想补充说明一点,fsolve中第一个变量是一个函数句柄,第二个变量matlab求和.符号运算通过符号运算把这个式子拆开什么意…

    2022年10月6日
    3
  • 《哈佛大学幸福课》笔记

    《哈佛大学幸福课》笔记题外话:2020.7.25-2021.4.24,视频总时长29小时,看了9个月才看完。刚看的时候又是老毛病急于求成,想一口气看完,结果到8月底看到第4课就放弃了,9月整整中断了一个月,10月才重新拾起来。拾起来也是定了个计划,慢下来,每周只看50分钟,上课做笔记记下最有感触的知识,用一年的时间看完,这样才慢慢坚持了下来。花了大概4个小时整理笔记。这门课一共分为10章,每章一个主题。B站最多播放量视频和网易云课堂上的都是33堂课的版本,给每堂课又都分别起了个名字,很混乱且让人觉得莫名其妙,凸现不了主题,这也

    2022年7月18日
    23

发表回复

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

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