throttle function
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;
};
}