// 防抖函数上次触发的时间
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;
}
