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.pswp.cn/web/23850.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/23850.shtml
英文地址,請注明出處:http://en.pswp.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 的配置對…