advance_debounce.dart 1010 B

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