action_limiter.dart 945 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import 'dart:async';
  2. import 'package:flutter/foundation.dart';
  3. enum LimitMode {
  4. debounce, //防抖
  5. throttle, //节流
  6. }
  7. class ActionLimiter {
  8. final int milliseconds;
  9. final LimitMode mode;
  10. Timer? _debounceTimer;
  11. DateTime? _lastActionTime;
  12. ActionLimiter({
  13. this.milliseconds = 300,
  14. this.mode = LimitMode.debounce,
  15. });
  16. void run(VoidCallback action) {
  17. if (mode == LimitMode.debounce) {
  18. // 防抖:只执行最后一次
  19. _debounceTimer?.cancel();
  20. _debounceTimer = Timer(Duration(milliseconds: milliseconds), action);
  21. } else if (mode == LimitMode.throttle) {
  22. // 节流:间隔内只执行一次
  23. final now = DateTime.now();
  24. if (_lastActionTime == null ||
  25. now.difference(_lastActionTime!) >
  26. Duration(milliseconds: milliseconds)) {
  27. _lastActionTime = now;
  28. action();
  29. }
  30. }
  31. }
  32. void dispose() {
  33. _debounceTimer?.cancel();
  34. }
  35. }