debounce.dart 920 B

12345678910111213141516171819202122232425262728293031
  1. // 防抖函数上次触发的时间
  2. Map<String, DateTime> _funcDebounceLastCall = {};
  3. /// 函数防抖
  4. /// 用于搜索框之类的频繁触发的方法,防止频繁触发,连续触发部分可能被忽略
  5. /// [func]: 要执行的方法
  6. /// [funcTag]: 方法标识符
  7. /// [milliseconds]: 要迟延的毫秒时间
  8. Function debounce(Function func, String funcTag, [int milliseconds = 2000]) {
  9. target() {
  10. String key = funcTag.toString();
  11. // 判断是否是第一次调用
  12. if (_funcDebounceLastCall[key] == null) {
  13. func.call();
  14. _funcDebounceLastCall[key] = DateTime.now();
  15. } else {
  16. // 判断是否超过了延迟时间
  17. if (DateTime.now()
  18. .difference(_funcDebounceLastCall[key]!)
  19. .inMilliseconds >
  20. milliseconds) {
  21. _funcDebounceLastCall[key] = DateTime.now();
  22. func.call();
  23. }
  24. }
  25. }
  26. target();
  27. return target;
  28. }