// 防抖函数上次触发的时间 import 'dart:async'; import 'package:flutter/material.dart'; Map _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; }); } } }