interval<T> function
Worker
interval<T>(
- GetListenable<
T> listener, - WorkerCallback<
T> callback, { - Duration time = const Duration(seconds: 1),
- dynamic condition = true,
- Function? onError,
- void onDone()?,
- bool? cancelOnError,
Ignore all changes in listener
during time
(1 sec by default) or until
condition
is met (can be a bool expression or a bool Function()
),
It brings the 1st "value" since the period of time, so
if you click a counter button 3 times in 1 sec, it will show you "1"
(after 1 sec of the first press)
click counter 3 times in 1 sec, it will show you "4" (after 1 sec)
click counter 2 times in 1 sec, it will show you "7" (after 1 sec).
Sample: // wait 1 sec each time an event starts, only if counter is lower than 20. worker = interval( count, (value) => print(value), time: 1.seconds, condition: () => count < 20, );
Implementation
Worker interval<T>(
GetListenable<T> listener,
WorkerCallback<T> callback, {
Duration time = const Duration(seconds: 1),
dynamic condition = true,
Function? onError,
void Function()? onDone,
bool? cancelOnError,
}) {
var debounceActive = false;
StreamSubscription sub = listener.listen(
(event) async {
if (debounceActive || !_conditional(condition)) return;
debounceActive = true;
await Future.delayed(time);
debounceActive = false;
callback(event);
},
onError: onError,
onDone: onDone,
cancelOnError: cancelOnError,
);
return Worker(sub.cancel, '[interval]');
}