throttle function

VoidCallback throttle(
  1. VoidCallback fn,
  2. Duration interval
)

Throttle (time) — max one call per interval. Roadmap #177.

Implementation

VoidCallback throttle(VoidCallback fn, Duration interval) {
  DateTime? lastCall;
  Timer? timer;
  return () {
    final DateTime now = DateTime.now();
    final last = lastCall;
    if (last == null || now.difference(last) >= interval) {
      lastCall = now; // ignore: avoid_unused_assignment - used on next invocation
      fn();
      return;
    }
    if (timer?.isActive ?? false) return;
    final newTimer = Timer(
      interval,
      () {
        lastCall = DateTime.now();
        fn();
      },
    );
    timer = newTimer;
  };
}