Flutter中防抖动和节流策略

什么是防抖和节流?

函数节流(throttle)与 函数防抖(debounce)都是为了限制函数的执行频次,以优化函数触发频率过高导致的响应速度跟不上触发频率,出现延迟,假死或卡顿的现象
是应对频繁触发事件的优化方案。

防抖(debounce)

防抖就是防止抖动,避免事件的重复触发。
防抖可以概括为触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间。
n 秒后执行该事件,若在n秒后被重复触发,则重新计时
简单的说,如果某一事件被连续快速地触发多次,只会执行最后那一次。

  • 使用场景

· input 搜索录入,用户不断录入值
· window触发resize事件
· mousemove 鼠标滑动事件
· scroll滚动条滑动请求、上拉触底加载更多
· 表单验证,按钮的提交事件

节流(throttle)

节流就是减少流量,将频繁触发的事件减少,并每隔一段时间执行。会控制事件触发的频率。所以节流会稀释函数的执行频率。
n 秒内只运行一次,若在n秒内重复触发,只有一次生效。
如果连续快速地触发多次,在规定的时间内,只触发一次。如限制1s,则1s内只执行一次,无论怎样,都在会1s内执行相应的操作。

  • 使用场景

· 获取验证码
·鼠标不断点击触发,mousedown(规定时间内只触发一次)
·mousemove 鼠标滑动事件
·滚动条滑动请求、上拉触底加载更多
·搜索、提交等按钮功能

防抖和节流之间的差别:

相同点: 目的都是,降低回调函数的执行频率,节省计算资源

不同点:
· 防抖,是在一段连续操作结束之后,处理回调
· 节流,是在一段连续操作中,每一段时间只执行一次,在频率较高的事件中使用来提高性能。
·防抖用于无法预知的用户主动行为,如用户输入内容去服务端动态搜索结果。用户打字的速度等是无法预知的,具有非规律性。
·节流可用于一些非用户主动行为或者可预知的用户主动行为,如用户滑动商品橱窗时发送埋点请求、滑动固定的高度是已知的逻辑,具有规律性。
·防抖是关注于最后一次的事件触发,而节流则是在规定的时间里只执行一次。
·防抖是将多次执行变为最后一次执行,节流是将多次执行变成每隔一段时间执行

  • 防抖以一个实时搜索框为例 当用户在输入框中进行实时搜索时,频繁调用接口可能会导致性能问题和不必要的网络请求。为了优化这种情况,通常可以使用防抖动策略来减少接口调用的频率。

使用 flutter_hooks 包可以更容易地实现防抖动功能。

flutter_hooks: ^0.18.0
dio: ^5.0.2

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:dio/dio.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: Text('Debounced Search'),),body: SearchScreen(),),);}
}class SearchScreen extends HookWidget {@overrideWidget build(BuildContext context) {final searchController = useTextEditingController();final debouncedSearch = useMemoized(() {return _DebouncedSearch(duration: Duration(milliseconds: 500));});useEffect(() {void listener() {debouncedSearch.run(() {// 这里调用接口_performSearch(searchController.text);});}searchController.addListener(listener);return () => searchController.removeListener(listener);}, [searchController]);return Padding(padding: const EdgeInsets.all(8.0),child: Column(children: [TextField(controller: searchController,decoration: InputDecoration(hintText: 'Search...',),),Expanded(child: ListView(children: [// 搜索结果展示],),),],),);}void _performSearch(String query) async {if (query.isEmpty) return;try {// 模拟调用接口print('Searching for $query');// 在这里用 Dio 或其他包实际调用接口var response = await Dio().get('https://api.example.com/search', queryParameters: {'q': query});print(response.data);} catch (e) {print('Search error: $e');}}
}class _DebouncedSearch {final Duration duration;Timer? _timer;_DebouncedSearch({required this.duration});void run(void Function() action) {_timer?.cancel();_timer = Timer(duration, action);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/23850.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WeTrade亮相Traders Fair展会菲律宾站

2024年5月25日,菲律宾交易博览会在马尼拉的Edsa香格里拉酒店圆满落幕。 WeTrade作为本次交易博览会的重要战略合作伙伴、参展商和赞助商,吸引了全球各界人士的广泛关注。 现场,我们的菲律宾团队与客户进行了亲密的面对面交流,并…

优思学院|精益生产学习过程中如何提高自己的能力水平?

精益生产是一项实践多过理论的课题。 优思学院认为实践并不限于实际的工作,日常的思考同样重要,例如我们会要求学员在学习时不断思考各种事物,不限于自己的企业。例如当你去到一家餐厅,你能夠观察到什么浪费?你可否把…

Docker pull镜像一直在Waiting无法下载,根本解决方法

1、现象描述: docker pull 拉去镜像一直在等待,无法下载,最后失败如下: [rootlocalhost docker]# docker pull zookeeper Using default tag: latest latest: Pulling from library/zookeeper 2ec76a50fe7c: Retrying in 1 seco…

特征交叉系列:DCN-Mix 混合低秩交叉网络理论和实践

DCN-Mix和DCN-V2的关系 DCN-Mix(a mixture of low-rank DCN)是基于DCN-V2的改进版,它提出使用矩阵分解来降低DCN-V2的时间空间复杂度,又引入多次矩阵分解来达到类似混合专家网络MOE的效果从而提升交叉层的表征能力,若读者对DCN-V2不甚了解可…

linux shell脚本启动springboot服务

1.脚本代码 xx.sh,自己随意命名 #!/bin/bash# 设置变量 JAR_NAME"xssq-1.0.0.jar" JAR_PATH"./$JAR_NAME" PID0#检查程序是否在运行 is_exist(){PIDps -ef|grep $JAR_NAME|grep -v grep|awk {print $2} #如果不存在返回1,存在返回0…

评价GPT-4的方案

评价GPT-4的方案 引言: 随着人工智能技术的不断发展,自然语言处理领域取得了显著的突破。其中,GPT-4作为最新的大型语言模型之一,备受关注。本方案旨在对GPT-4进行全面评价,包括其技术特点、性能表现、应用场景以及潜在的影响等方面。 一、技术特点 1. 模型规模和参数数…

微信小程序使用自定义tabbar被组件遮挡调试层级没有用

在我自定义使用tabbar的时候,发现使用vant weapp环形进度条的时候把tabbar给遮挡了,查看了文章说没什么好的解决办法,但是也有,链接在此 我是直接修改的自定义组件的标签view标签和image标签都使用cover- image和cover-view代替就…

部署kubesphere报错

安装kubesphere报错命名空间terminted [rootk8smaster ~]# kubectl apply -f kubesphere-installer.yaml Warning: apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16, unavailable in v1.22; use apiextensions.k8s.io/v1 CustomResourceDefini…

618科技好物清单:物超所值的产品推荐,总有一款适合你!

随着科技的不断发展,我们生活中涌现出了越来越多的科技创新产品。这些产品不仅让我们的生活变得更加便捷,还提升了我们的生活品质。而在即将到来的618购物节,正是我们购买这些物超所值科技好物的绝佳时机。 本文将为您推荐一些在618期间值得关…

软光敏的程序实现

软光敏的程序实现通常涉及到使用摄像头或其他图像捕捉设备的内部sensor来感应环境光线,并结合软件算法来控制补光灯或其他相关设备的开关。以下是一个简化的软光敏程序实现的示例流程,使用伪代码来描述: pseudo 初始化摄像头 while 摄像头开…

每天一个数据分析题(三百五十五)-业务分析报告

业务分析报告的主要作用是将业务分析报表中发现的业务问题进行汇总说明,并进一步提出解决问题的建议,以帮助阅读者做出正确的决策判断。业务分析报告撰写的注意事项中正确的是? A. 条理清晰、结构完整 B. 论点明确 C. 图、表、文字相结合 …

英伟达的数字孪生地球是什么

1 英伟达的数字孪生地球 Earth-2是一个全栈式开放平台,包含:ICON 和 IFS 等数值模型的物理模拟;多种机器学习模型,例如 FourCastNet、GraphCast 和通过 NVIDIA Modulus 实现的深度学习天气预测 (DLWP);以及通过 NVIDI…

Go理论-面试题

面向对象? 面向对象是一种方法论。一种非常实用的系统化软件开发方法。 三大特点:封装、继承、多态 Go和Java的区别 Go不允许重载,Java允许Java允许多态,Go没有(但可以通过接口实现)Go语言的继承通过匿…

手撕设计模式——克隆对象之原型模式

1.业务需求 ​ 大家好,我是菠菜啊,前俩天有点忙,今天继续更新了。今天给大家介绍克隆对象——原型模式。老规矩,在介绍这期之前,我们先来看看这样的需求:《西游记》中每次孙悟空拔出一撮猴毛吹一下&#x…

pytorch-nn.Module

目录 1. nn.Module2. nn.Sequential容器3. 网络参数parameters4. Modules内部管理5. checkpoint6. train/test状态切换6. 实现自己的网络层6.1 实现打平操作6.2 实现自己的线性层 7. 代码 1. nn.Module 是所有nn.类的父类,其中包括nn.Linear nn.BatchNorm2d nn.Con…

每日一练 - OSPF协议验证机制

01 真题题目 OSPF 只有在 Hello 报文中有验证信息,OSPF 支持 MD5 密文验证. A.正确 B.错误 02 真题答案 B 03 答案解析 这个陈述是不完全正确的。首先,OSPF确实使用Hello报文来携带认证信息,但这不意味着只有Hello报文包含验证信息。 OSPF的认证机制可…

政府绩效考核第三方评估的含义

政府绩效考核第三方评估是指由独立于政府的外部机构(如专业评估公司、研究机构或非政府组织)对政府部门或其下属单位的绩效进行客观、公正、系统的评估。其主要目的是通过引入独立的第三方评估机构,对政府绩效进行科学、全面的考核&#xff0…

【AIGC调研系列】Qwen2与llama3对比的优势

Qwen2与Llama3的对比中,Qwen2展现出了多方面的优势。首先,从性能角度来看,Qwen2在多个基准测试中表现出色,尤其是在代码和数学能力上有显著提升[1][9]。此外,Qwen2还在自然语言理解、知识、多语言等多项能力上均显著超…

肺结节14问,查出肺结节怎么办?哪些能用中医调治消散?快来了解一下吧

近些年,随着大众防癌意识的加强,和胸部低剂量CT的普及,肺结节的检出率也逐年升高,不少患者CT报告上,写着“肺小结”“肺部磨玻璃结节”的字样,当你看到这几个字时,会不会瞬间紧张起来&#xff1…

编程规范-代码检测-格式化-规范化提交

适用于vue项目的编程规范 – 在多人开发时统一编程规范至关重要 1、代码检测 --Eslint Eslint:一个插件化的 javascript 代码检测工具 在 .eslintrc.js 文件中进行配置 // ESLint 配置文件遵循 commonJS 的导出规则,所导出的对象就是 ESLint 的配置对…