WatcherImpl<T> constructor

WatcherImpl<T>(
  1. SourcesFn<T> sourcesFn,
  2. WatcherFn<T> fn, {
  3. bool immediately = false,
  4. WhenFn<T>? when,
  5. bool? detach,
  6. JoltDebugOption? debug,
})

Creates a new watcher with the given sources and callback.

Parameters:

  • sourcesFn: Function that returns the values to watch
  • fn: Callback function executed when sources change
  • immediately: Whether to execute the callback immediately
  • when: Optional condition function for custom trigger logic
  • detach: Whether to detach this watcher from the current effect scope. If true, the watcher will not be automatically disposed when its parent scope is disposed.
  • debug: Optional debug options

Example:

final signal = Signal(0);

final watcher = Watcher(
  () => signal.value,
  (newValue, oldValue) => print('Changed: $oldValue -> $newValue'),
  immediately: true,
  when: (newValue, oldValue) => newValue > oldValue, // Only when increasing
);

Implementation

WatcherImpl(this.sourcesFn, this.fn,
    {bool immediately = false, this.when, bool? detach, JoltDebugOption? debug})
    : super(flags: ReactiveFlags.watching) {
  assert(() {
    JoltDebug.create(this, debug);
    return true;
  }());

  final prevSub = setActiveSub(this);
  if (!(detach ?? false) && prevSub != null) {
    link(this, prevSub, 0);
  }
  try {
    prevSources = sourcesFn();
    if (immediately) {
      untracked(() {
        final prevWatcher = Watcher.activeWatcher;
        Watcher.activeWatcher = this;
        try {
          fn(prevSources, null);
        } finally {
          Watcher.activeWatcher = prevWatcher;
        }
      });
      assert(() {
        JoltDebug.effect(this);
        return true;
      }());
    }
  } finally {
    setActiveSub(prevSub);
  }
}