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

Flutter自定义通用防抖的实现

在前端项目开发中,点击事件的防抖是一个永远无法错开的点,特别是针对一些复杂的业务场景,如果不做好防抖操作,就会导致页面或功能触发多次,引发异常或闪退。

在Flutter中可以通过扩展函数的特性 对Function增加全局扩展函数,实现防抖效果。

具体如下:

extension FunctionExt on Function {VoidCallback throttle() {return FunctionProxy(this).throttle;}// 立即执行目标操作,同时给出一个延迟的时间,// 在该时间范围内如果再次触发了事件,该次事件会被忽略,直到超过该时间范围后触发事件才会被处理。VoidCallback throttleWithTimeout({int? timeout}) {return FunctionProxy(this, timeout: timeout).throttleWithTimeout;}// 在触发事件时,不立即执行目标操作,而是给出一个延迟的时间,// 在该时间范围内如果再次触发了事件,则重置延迟时间,直到延迟时间结束才会执行目标操作。VoidCallback debounce({int? timeout}) {return FunctionProxy(this, timeout: timeout).debounce;}
}class FunctionProxy {static final Map<String, bool> _funcThrottle = {};static final Map<String, Timer> _funcDebounce = {};final Function? target;final int timeout;FunctionProxy(this.target, {int? timeout}) : timeout = timeout ?? 500;// 节流(默认延迟)void throttle() async {String key = hashCode.toString();bool enable = _funcThrottle[key] ?? true;if (enable) {_funcThrottle[key] = false;try {await target?.call();} catch (e) {rethrow;} finally {_funcThrottle.remove(key);}}}// 节流(自定义延迟)void throttleWithTimeout() {String key = hashCode.toString();bool enable = _funcThrottle[key] ?? true;if (enable) {_funcThrottle[key] = false;Timer(Duration(milliseconds: timeout), () {_funcThrottle.remove(key);});target?.call();}}//延迟顺序执行的防抖void debounce() {String key = hashCode.toString();Timer? timer = _funcDebounce[key];timer?.cancel();timer = Timer(Duration(milliseconds: timeout), () {Timer? t = _funcDebounce.remove(key);t?.cancel();target?.call();});_funcDebounce[key] = timer;}
}

在使用的地方

              onBackPressed: () {}.throttleWithTimeout(timeout: 500)

这种方案只是提供了一种防抖的实现,当然也可以自定义通用的Button,通过点击事件触发的时间自行判断处理。

相关文章:

Flutter自定义通用防抖的实现

在前端项目开发中&#xff0c;点击事件的防抖是一个永远无法错开的点&#xff0c;特别是针对一些复杂的业务场景&#xff0c;如果不做好防抖操作&#xff0c;就会导致页面或功能触发多次&#xff0c;引发异常或闪退。 在Flutter中可以通过扩展函数的特性 对Function增加全局扩…...

C# Unity 面向对象补全计划 之 继承(字段与属性)

本文仅作学习笔记与交流&#xff0c;不作任何商业用途&#xff0c;作者能力有限&#xff0c;如有不足还请斧正 本系列旨在通过补全学习之后&#xff0c;给出任意类图都能实现并做到逻辑上严丝合缝 Q&#xff1a;为什么要单讲继承字段与属性&#xff0c;不讲继承方法了吗&#x…...

leetcode202. 快乐数,双指针法巧用

leetcode202. 快乐数 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。 如果这个过程…...

基于Cobbler实现多版本系统批量部署

一、实验题目 基于Cobbler实现多版本操作系统的批量部署。 二、实验目的 掌握Cobbler服务器的安装与配置方法。 学会使用Cobbler进行多版本操作系统的批量部署。 理解PXE网络启动原理及其在操作系统部署中的应用。 提高在实际生产环境中快速部署和管理操作系统的能力。 …...

一投就中不是梦,录取率>80%,最快1个月就见刊,计算机沾边就收,认可度还不低

本次模术狮精心整理5本期刊&#xff0c;最快1个月就见刊&#xff0c;计算机沾边就收&#xff0c;认可度还不低&#xff01; 1 Knowledge-Based Systems ▲ 图片来源&#xff1a;Knowledge-Based Systems官网 期刊简介&#xff1a;《Knowledge-Based Systems》是人工智能领域的…...

【课程系列06】某乎AI大模型全栈工程师-第6期

网盘链接 链接&#xff1a;https://pan.baidu.com/s/1QLkRW_DmIm1q9XvNiOGwtQ --来自百度网盘超级会员v6的分享 课程目标 【知乎大模型课程】学习的四个维度 &#x1f449;指挥层&#xff1a;学高阶指令工程 AI编程等&#xff0c;指挥大模型完成90%代码任务&#xff0c;包…...

Prompt——3分钟掌握,润色论文的7条经典指令。帮助很大,一定要看!

这是一篇帮助你润色论文的ChatGPT指令合集&#xff0c;整理了润色过程中语法优化、审阅校对、专业风格等7个主要方面。 建议收藏&#xff0c;需要的时候直接CtrlV即可&#xff0c;一定对你科研有所帮助~ 1. 修复语法和句法 第一个提示是修复语法和句法。这是任何写作的关键部…...

ARM学习(31)编译器对overlay方式的支持

ARM学习&#xff08;31&#xff09;编译器对overlay方式的支持 1、overlay介绍 overlay&#xff1a;重叠得意思&#xff0c;就是可以重复利用得空间&#xff0c;一般在内存上使用这种空间。比如以Windows操作系统为例&#xff0c;其存储空间&#xff08;ROM/FLASH&#xff09;…...

【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常

问题现象 BeetISQL中间件版本&#xff1a;2.13.8.RELEASE 客户在调用BeetISQL提供的api向yashandb的表中执行batch insert并将返回sequence设置到传入的java bean时&#xff0c;报如下异常&#xff1a; 问题的风险及影响 影响业务流程正常执行&#xff0c;无法获得batch ins…...

软件测试——用例篇(上)

概念 什么是测试⽤例&#xff1f; 测试⽤例&#xff08;Test Case&#xff09;是为了实施测试⽽向被测试的系统提供的⼀组集合&#xff0c;这组集合包含&#xff1a;测试环境、操作步骤、测试数据、预期结果等要素 设计测试⽤例原则⼀&#xff1a; 测试⽤例中⼀个必需部分是对…...

Flink中三种模式:YARN Session 模式、YARN Per-Job 模式和 YARN Application 模式提交任务命令

在 Apache Flink 中,YARN 提供了多种模式来提交和管理作业,每种模式都有其独特的特点和适用场景。主要有以下三种模式:YARN Session 模式、YARN Per-Job 模式和 YARN Application 模式。 1. YARN Session 模式 在 YARN Session 模式中,一个长时间运行的 Flink 会话(Sess…...

DBMS-1.2 关系运算

本文章的素材与知识均来自于李国良老师的数据库管理系统课程。 关系代数 一.基本关系代数运算 基本关系代数运算包括&#xff1a;选择、投影、并、差、笛卡尔积、重命名。 1.选择&#xff08;select&#xff09; 选择运算用于从关系R中获取满足条件的元组。 &#xff08;1…...

Python——继承

一、继承 1. 什么是继承&#xff1f; 继承是一种面向对象编程的机制&#xff0c;允许一个类&#xff08;子类&#xff09;从另一个类&#xff08;父类&#xff09;继承属性和方法。子类可以扩展或修改父类的功能。 2. 如何实现继承&#xff1f; 在Python中&#xff0c;实现…...

程序员转型AI大模型好转吗?成功率高吗?

前言 在程序员圈子中&#xff0c;技术转型近年来一直是热门话题。随着AI技术的迅猛发展&#xff0c;优秀人才短缺&#xff0c;程序员向AI大模型转型似乎成为了一条通往职场先机的路径。但是&#xff0c;这条转型之路是否容易走&#xff0c;成功率又如何呢&#xff1f; 一、程…...

关于 Postman 这些你都知道吗?

Postman是接口测试工具&#xff0c;在做接口测试的时候&#xff0c;Postman相当于一个客户端&#xff0c;它可以模拟用户发起的各种http请求&#xff0c;将请求的数据发送到服务端&#xff0c;获取对应的结果&#xff0c;从而测试接口是否能够满足业务功能要求&#xff0c;很直…...

ReentrantLock

ReentrantLock ReentrantLock 是一个可重入的互斥锁&#xff0c;它提供了比 synchronized 关键字更灵活的锁机制。它属于 java.util.concurrent.locks 包。 特点&#xff1a; 可重入性&#xff1a;同一个线程可以多次获取锁而不会造成死锁&#xff0c;锁的计数器会递增。公平…...

python | TypeError: list indices must be integers or slices, not tuple

python | TypeError: list indices must be integers or slices, not tuple 在Python编程中&#xff0c;TypeError: list indices must be integers or slices, not tuple 是一个常见的错误。此错误通常发生在尝试使用非整数&#xff08;如元组&#xff09;作为列表索引时。本…...

链码简介及MATLAB提取彩色图像链码

一、链码 链码&#xff08;又称为freeman code&#xff09;是一种通过带有给定方向的单位长度的线段序列来描述轮廓边界的方法,常被用来在图像处理、计算机图形学、模式识别等领域中表示曲线和区域边界。在二维图像中&#xff0c;链码可以表示为一系列的方向码&#xff0c;每个…...

二叉树,二叉查找树,平衡二叉树

一.绪论: 二.数据结构(二叉树): 1.简介: 1)每一个节点&#xff08;也叫结点&#xff09;都是一个独立的对象-->当中不仅要存数据值&#xff0c;还要存父节点地址值&#xff0c;左子节点地址值&#xff0c;右子 节点地址值 2)没有父节点或者子节点的节点就记为null 2.遍历方…...

《零散知识点 · SpringBoot 整合邮件功能》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...