defaultRunEffect function

void defaultRunEffect(
  1. EffectReactiveNode e,
  2. void fn()
)

Executes an EffectReactiveNode when it is dirty or pending.

This function checks if the effect node's flags indicate that it needs to be executed (has dirty flag or pending flag with dirty dependencies). If so, it executes the provided function fn in the proper reactive context.

Parameters:

  • e: Effect node to evaluate
  • fn: The function to execute when the effect needs to run

Example:

class CustomEffectNode extends EffectReactiveNode {
  CustomEffectNode() : super(flags: ReactiveFlags.watching);

  @override
  void runEffect() {
    defaultRunEffect(this, _effectFn);
  }

  void _effectFn() {
    // Effect logic here
  }
}

Implementation

@pragma("vm:prefer-inline")
@pragma("wasm:prefer-inline")
@pragma("dart2js:prefer-inline")
void defaultRunEffect(EffectReactiveNode e, void Function() fn) {
  final flags = e.flags;
  if (flags & (ReactiveFlags.dirty) != 0 ||
      (flags & (ReactiveFlags.pending) != 0 && checkDirty(e.deps!, e))) {
    ++cycle;
    e
      ..depsTail = null
      ..flags = ReactiveFlags.watching | ReactiveFlags.recursedCheck;

    // only effect and watcher;
    final prevSub = setActiveSub(e);
    try {
      fn();
    } finally {
      activeSub = prevSub;
      e.flags &= ~ReactiveFlags.recursedCheck;
      purgeDeps(e);
    }
  } else {
    e.flags = ReactiveFlags.watching;
  }
}