interval<T> function

Worker interval<T>(
  1. RxInterface<T> observable,
  2. WorkerCallback<T> callback, {
  3. Duration delay = const Duration(seconds: 1),
  4. dynamic condition,
})

Executes a callback after delay if the value of observable doesn't change.

Sample:

final count = 0.obs;
Worker worker;

void onInit() {
  worker = interval(count, (value) {
    print('value after interval: $value');
  }, delay: Duration(seconds: 1));
}

Implementation

Worker interval<T>(
  RxInterface<T> observable,
  WorkerCallback<T> callback, {
  Duration delay = const Duration(seconds: 1),
  dynamic condition,
}) {
  Timer? timer;
  bool isActive = false;

  void listener() {
    if (!_checkCondition(condition)) return;

    if (isActive) return;
    isActive = true;

    timer?.cancel();
    timer = Timer(delay, () {
      callback(observable.value);
      isActive = false;
    });
  }

  observable.addListener(listener);

  return Worker(() {
    timer?.cancel();
    observable.removeListener(listener);
  });
}