defaultRunEffect function
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 evaluatefn: 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;
}
}