1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- // 防抖函数上次触发的时间
- import 'dart:async';
- import 'package:flutter/material.dart';
- Map<String, DateTime> _funcDebounceLastCall = {};
- /// 函数防抖 (可自定义标识)
- /// 用于搜索框之类的频繁触发的方法,防止频繁触发,连续触发部分可能被忽略
- /// [func]: 要执行的方法
- /// [funcTag]: 方法标识符
- /// [milliseconds]: 要迟延的毫秒时间
- Function advanceDebounce(Function func, String funcTag,
- [int milliseconds = 2000]) {
- target() {
- String key = funcTag.toString();
- // 判断是否是第一次调用
- if (_funcDebounceLastCall[key] == null) {
- func.call();
- _funcDebounceLastCall[key] = DateTime.now();
- } else {
- // 判断是否超过了延迟时间
- if (DateTime.now()
- .difference(_funcDebounceLastCall[key]!)
- .inMilliseconds >
- milliseconds) {
- _funcDebounceLastCall[key] = DateTime.now();
- func.call();
- } else {
- print("[debounce] $funcTag skip");
- }
- }
- }
- target();
- return target;
- }
- class Debouncer {
- static Duration delay = const Duration(seconds: 1);
- static bool _isAvailable = true;
- static void run(VoidCallback action, {Duration? duration}) {
- if (_isAvailable) {
- _isAvailable = false;
- action();
- Timer(duration ?? delay, () {
- _isAvailable = true;
- });
- }
- }
- }
|