当前位置: 首页 > news >正文

【Flutter】使用ScrollController配合EasyRefresh实现列表预加载:在还未滑动到底部时加载下一页数据

需求/背景

在我们的业务场景中,列表的加载使用easy_refresh组件:

https://pub.dev/packages/easy_refresh

大概效果是往上滑动到一定的offset会触发一个上滑加载,可以触发一些网络请求拉取列表后面的数据来展示。

这种模式一般在一页翻完以后,才会触发加载,此时需要等待加载完以后才能看到新的数据。现在的需求是,想要在即将滑到当前页面底部的时候,预先加载后面的数据,这样表面上看来没有了中间的等待感,可以提升用户体验

思路

首先easy_refresh组件没有提供“预加载”相关的参数,所以我们需要自己去实现。分析需求,我们如何得知触发预加载的这个时机呢?可以比较容易的想到,如果可以监听到滑动的距离,那么就可以根据滑动距离触发加载,比如当监听到用户已经上滑了约一个手机高度那么高(一页)时,触发预加载。

监听滑动的offset,可以联想到使用ScrollController实现。

用法

double _currentOffset = 0; // 记录上一次触发了预加载的位置
ScrollController scrollController; // 列表controller,赋给用于展示元素的ListView
EasyRefreshController refreshController = EasyRefreshController(controlFinishLoad: true, controlFinishRefresh: true); // EasyRefresh组件的controller设置

在对应位置监听scrollController:

scrollController.addListener(() => preLoad());

preLoad方法:

  /// 通过检查当前滑动的位置触发加载.void preLoad() async {if (scrollController.offset - _currentOffset > appHeight) {_currentOffset = scrollController.offset;if (!isNoMore) {await updateItems();  // 加载一页数据}if (isNoMore) refreshController.finishLoad(IndicatorResult.noMore);}}
  • isNoMore:
    判断是否为最后一页,不同的业务场景可能不一样,我是根据拉取的数据数量是否小于我要求的数量来判断的,比如我请求api的时候要拉取20条数据,如果此时返回的不足20条,则说明已经拉到了最后一页。

  • refreshController:
    赋给EasyRefresh组件,这里要finishLoad是因为,在EasyRefresh组件中也有onLoad回调,原本的上拉加载和预加载是同时要有的,为了避免预加载到最后一页,再上滑的时候又发多余的请求,在这里需要及时将加载状态设为IndicatorResult.noMore。

  • appHeight: 屏幕高度,如果项目里面有使用Getx,则计算方式为:

    double appHeight = View.of(Get.context!).physicalSize.height / Get.pixelRatio;
    

    这里使用appHeight作为判断标准,是与业务相关的,这个时候根据我们api的速度等情况,上滑起来比较丝滑:即当往上滑动了一个屏幕这么多的距离时,触发预加载。这个参数可以根据实际情况设置的大一点或小一点。

相关文章:

【Flutter】使用ScrollController配合EasyRefresh实现列表预加载:在还未滑动到底部时加载下一页数据

需求/背景 在我们的业务场景中,列表的加载使用easy_refresh组件: https://pub.dev/packages/easy_refresh 大概效果是往上滑动到一定的offset会触发一个上滑加载,可以触发一些网络请求拉取列表后面的数据来展示。 这种模式一般在一页翻完…...

【2025 Rust学习 --- 11 实用工具特型01】

清理特型Drop 当一个值的拥有者消失时,Rust 会丢弃(drop)该值。丢弃一个值就必须释放 该值拥有的任何其他值、堆存储和系统资源。 丢弃可能发生在多种情况下: 当变量超出作用域时;在表达式语句的末尾;当…...

网络安全基础以及概念

1. 安全领域的概念 1.1 网络产品 1. EDR:终端检测与响应(Endpoint Detection and Response),终端主要包括我们的笔记本、台式机、手机、服务器等,EDR是一种运行在终端上安全软件,主要负责监控网络流量、可疑进程、注册表活动等其他安全相关的事件与活动。当发现有威胁是自…...

windows和linux的抓包方式

1.实验准备: 一台windows主机,一台linux主机 wireshark使用: 打开wireshark,这些有波动的就代表可以有流量经过该网卡,选择一张有流量经过的网卡 可以看到很多的流量,然后可以使用过滤器来过滤想要的流量…...

【Uniapp-Vue3】v-if条件渲染及v-show的选择对比

如果我们想让元素根据响应式变量的值进行显示或隐藏可以使用v-if或v-show 一、v-show 另一种控制显示的方法就是使用v-show,使用方法和v-if一样,为true显示,为false则不显示。 二、v-if v-if除了可以像v-show一样单独使用外,还…...

宝塔面板使用 GoAccess Web 日志分析教程

宝塔面板是一个简单方便的服务器运维面板,但其网站统计功能是收费的。而 GoAccess 是一个用 C 编写的免费开源 Web日志分析器,本文将介绍如何在宝塔面板中开启 GoAccess Web 日志分析功能。 内容索引 下载安装 GoAccess在宝塔面板中添加日志切割的计划任务将 Web 日志输出到…...

Windows 安装 Docker 和 Docker Compose

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template 🌺 仓库主页: GitCode︱ Gitee ︱ Github 💖 欢迎点赞 👍 收藏 ⭐评论 …...

arcgis中用python脚本批量给多个要素类的相同字段赋值

1、python脚本 import arcpy# 设置工作空间路径 arcpy.env.workspace = r"D:\test.gdb"# 要素集名称 feature_dataset = "test"# 线要素类名称列表,初始化为空 line_feature_classes = []# 遍历要素集获取所有线要素类 for fc in arcpy.ListFeatureClass…...

目标客户营销(ABM)结合开源AI智能名片2+1链动模式S2B2C商城小程序的策略与实践

摘要:在数字化营销日益盛行的今天,目标客户营销(Account Based Marketing, ABM)作为一种高度定制化的营销策略,正逐步成为企业获取高质量客户、提升市场竞争力的重要手段。与此同时,开源AI智能名片21链动模…...

《异步编程之美》— 全栈修仙《Java 8 CompletableFuture 对比 ES6 Promise 以及Spring @Async》

哈喽,大家好!在平常开发过程中会遇到许多意想不到的坑,本篇文章就记录在开发过程中遇到一些常见的问题,看了许多博主的异步编程,我只能说一言难尽。本文详细的讲解了异步编程之美,是不可多得的好文&#xf…...

新模型设计:Hybrid Quantum-Classical Neural Network (HQCNN) for Image Classification

新模型设计:Hybrid Quantum-Classical Neural Network (HQCNN) for Image Classification 目录 新模型设计:Hybrid Quantum-Classical Neural Network (HQCNN) for Image Classification引言1. Hybrid Quantum-Classical Neural Network 简介2. Hybrid Quantum-Classical Neu…...

iOS 中spring动画的使用

我们先来看以下两个动画的效果 上面的位移动画,一个是普通的动画,一个是spring动画,可以明显的看出来,spring动画在动画的前期更快一些,给人的感觉干脆,利落 以下是代码 - (void)normalAnimation {[UIV…...

初学stm32 --- DMA直接存储器

目录 DMA介绍 STM32F1 DMA框图 DMA处理过程 DMA通道 DMA优先级 DMA相关寄存器介绍 F1 DMA通道x配置寄存器(DMA_CCRx) DMA中断状态寄存器(DMA_ISR) DMA中断标志清除寄存器(DMA_IFCR) DMA通道x传输…...

校医院挂号及预约 APP 的设计与实现

标题:校医院挂号及预约 APP 的设计与实现 内容:1.摘要 随着移动互联网的发展,越来越多的人开始使用手机应用程序来解决生活中的各种问题。本项目旨在设计和实现一款校医院挂号及预约 APP,以提高校医院的服务效率和质量,方便师生就医。本文介…...

代理模式详解与应用

代理模式(Proxy Pattern),也称为委托模式或 surrogate 模式,是一种结构型设计模式。它为其他对象提供一个代理以控制对这个对象的访问。通过引入代理对象,可以在不改变原始对象接口的前提下,添加额外的功能…...

Model-based RL自动出价算法的演进之路

▐ 导读 近年来,强化学习自动出价算法已成为智能投放领域的标志性技术,然而其所存在的在离线不一致、线上数据覆盖空间受限等关键问题尚未被完全解决。在本文中,我们提出一种Model-based RL(MBRL)自动出价算法训练新范…...

.NET AI 开发人员库 --AI Dev Gallery简单示例--问答机器人

资源及介绍接上篇 nuget引用以下组件 效果展示: 内存和cpu占有: 代码如下:路径换成自己的模型路径 模型请从上篇文尾下载 internal class Program{private static CancellationTokenSource? cts;private static IChatClient? model;privat…...

框架部分面试题学习

IOC容器,AOP IOC :依赖反转,将对象的创建,组装,管理的控制权限从应用程序反转到IOC容器中。由springboot的来实现对象的自动装配和注入。 当某个类使用了Componnet 注解后,标记为一个组件。那么这个类在项…...

tdengine数据库使用java连接

1 首先给你的项目添加依赖 <dependency> <groupId>com.taosdata.jdbc</groupId> <artifactId>taos-jdbcdriver</artifactId> <version>3.4.0</version> <!-- 表示依赖不会传递 --> </dependency> 注意&am…...

Java 模板变量替换——字符串替换器(思路Mybatis的GenericTokenParser)

Java 模板变量替换——字符串替换器&#xff08;思路Mybatis的GenericTokenParser&#xff09; 思路字符串替换器 思路 模板变量替换无非是寻找出字符串&#xff08;模板&#xff09;中的特殊标记&#xff0c;用对应的变量进行字符串替换。 提到变量替换&#xff0c;大家第一能…...

跨界融合:人工智能与区块链如何重新定义数据安全?

引言&#xff1a;数据安全的挑战与现状 在信息化驱动的数字化时代&#xff0c;数据已成为企业和个人最重要的资产之一。然而&#xff0c;随着网络技术的逐步优化和数据量的爆发式增长&#xff0c;数据安全问题也愈变突出。 数据安全现状&#xff1a;– 数据泄露驱动相关事件驱…...

android 自定义SwitchCompat,Radiobutton,SeekBar样式

纯代码的笔记记录。 自定义SwitchCompat按钮的样式 先自定义中间的圆球switch_thumb_bg.xml <?xml version"1.0" encoding"utf-8"?> <shape xmlns:android"http://schemas.android.com/apk/res/android"android:shape"oval&q…...

计算机网络的定义与发展历程

计算机网络的定义 计算机网络是指通过通信设备和传输介质将分布在不同地点的计算机及其相关设备&#xff08;如打印机、服务器等&#xff09;连接起来&#xff0c;按照一定的通信协议进行数据交换与资源共享的系统。计算机网络的基本功能包括&#xff1a;信息的传输、资源共享…...

对比学习 (Contrastive Learning) 算法详解与PyTorch实现

对比学习 (Contrastive Learning) 算法详解与PyTorch实现 目录 对比学习 (Contrastive Learning) 算法详解与PyTorch实现1. 对比学习 (Contrastive Learning) 算法概述1.1 自监督学习1.2 对比学习的优势2. 对比学习的核心技术2.1 正样本对与负样本对2.2 对比损失函数2.3 数据增…...

DBeaver执行本地的sql语句文件避免直接在客户端运行卡顿

直接在客户端运行 SQL 语句和通过加载本地文件执行 SQL 语句可能会出现不同的性能表现&#xff0c;原因可能包括以下几点&#xff1a; 客户端资源使用&#xff1a; 当你在客户端界面直接输入和执行 SQL 语句时&#xff0c;客户端可能会消耗资源来维护用户界面、语法高亮、自动完…...

C++ 的 pair 和 tuple

1 std::pair 1.1 C 98 的 std::pair 1.1.1 std::pair 的构造 ​ C 的二元组 std::pair<> 在 C 98 标准中就存在了&#xff0c;其定义如下&#xff1a; template<class T1, class T2> struct pair;std::pair<> 是个类模板&#xff0c;它有两个成员&#x…...

Zookeeper 集群安装

Zookeeper 集群 主机 IP SoftWare Port OS Myidnode1 192.168.230.128 apache-zookeeper-3.7.1 2181 Centos 7 1 node2 192.168.230.129 apache-zookeeper-3.7.1...

git merge与rebase区别以及实际应用

在 Git 中&#xff0c;merge 和 rebase 是两种将分支的更改合并到一起的常用方法。虽然它们都可以实现类似的目标&#xff0c;但它们的工作方式和效果有所不同。 1. Git Merge 定义&#xff1a;git merge 是将两个分支的历史合并在一起的一种操作。当你执行 git merge 时&…...

kvm虚拟机出现应用程序无法正常启动报0xc0000142错误

场景&#xff1a;我的是window10虚拟机&#xff0c;在运行我的软件的时候&#xff0c;出现0xc0000142错误&#xff0c;原因可能是cpu型号问题&#xff0c;某些虚拟cpu可能没有特定的指令&#xff0c;只需要修改虚拟机配置文件以下参数即可...

Redis 安装与 Spring Boot 集成指南

安装 Redis 和将其与 Spring Boot 应用集成是构建高效缓存解决方案的常见步骤。以下是详细的指南&#xff0c;帮助你在本地环境中安装 Redis&#xff0c;并在 Spring Boot 项目中配置和使用它。 1. 安装 Redis Windows 环境 Redis 官方并不直接支持 Windows&#xff0c;但你…...

手机代码网站有哪些问题/太原关键词优化报价

Matlab目录操作及fgetl函数 获取当前目录 pwd命令 apwd();进入指定目录 aF:\code; cd(a);或者 cd F:\codematlab如何读取文本文件并逐行显示 以下是自己写的一个函数&#xff0c;在窗口输出显示指定文件中的内容 %显示日志文件&#xff08;所有文本文件&#xff09;的内…...

导入表格数据做地图网站/网站推广哪家好

---------------------------------------------------------------------------------------- 转载于:https://www.cnblogs.com/xioxu/archive/2008/09/23/1297518.html...

网站代码 输入文字 跳出内容/平面设计培训

前段时间在网上看到了一篇滴答词典的项目文章&#xff0c;实现简单的单词查找、整句翻译和生词本功能&#xff0c;但是该项目年代久远&#xff0c;所用的API已不再提供数据&#xff0c;我决定利用它的已有框架实现其功能&#xff0c;主要用到的技术有GSON和Volley以及SQLite相关…...

泉州网站建设选择讯呢/网络软文发布平台

转载&#xff1a; https://blog.51cto.com/darrenmemos/2151566 Redis Cluster特点 (1)Redis Cluster 共有16384(0-16383)个hash slots,数据写入时&#xff0c;根据CRC16(key)%16384 hash slots分配到不同的节点上&#xff1b; (2)当整个集群部分节点crash不影响继续使用&am…...

深圳市网站建设公司好不好/营销型网站分为哪几种

face recognition 项目实际使用 最近在一个公众号上看到一个推荐的github上的项目&#xff0c;号称是最简单&#xff0c;最容易上手的人脸识别项目&#xff0c;折腾了两天才算把这个模块装好&#xff0c;其实大部分时间都花在了安装各种依赖包上&#xff0c;cmake&#xff0c;…...

58这种网站怎么做/重庆网站

一、在图形界面显示图片的两种方法 一般情况下&#xff0c;想要在GUI中显示图片&#xff0c;我们会通过&#xff1a; – 实例化一个QLable()部件&#xff1b; – 实例化一个QPixmap()图形类&#xff1b; – 通过QLabel()部件的setPixmap()方法设置QLabel()部件的图形&#xff…...