notifyEffect function

  1. @override
void notifyEffect(
  1. ReactiveNode e
)

Enqueues an EffectReactiveNode chain for execution.

Parameters:

  • e: Effect node whose dependencies changed

Example:

final effectNode = CustomEffectNode();
notifyEffect(effectNode);
if (batchDepth == 0) {
  flushEffects();
}

Implementation

@override
@pragma("vm:prefer-inline")
@pragma("wasm:prefer-inline")
@pragma("dart2js:prefer-inline")
@pragma("vm:align-loops")
@pragma('vm:unsafe:no-bounds-checks')
void notifyEffect(ReactiveNode e) {
  EffectBaseReactiveNode? effect = e as EffectBaseReactiveNode;
  var insertIndex = queuedLength;
  var firstInsertedIndex = insertIndex;

  // allow do-while loop
  // ignore: literal_only_boolean_expressions
  do {
    effect!.flags &= ~ReactiveFlags.watching;

    // queued[insertIndex++] = effect;
    _queueSet(insertIndex++, effect as EffectReactiveNode?);
    effect = effect.subs?.sub as EffectBaseReactiveNode?;
    if (effect == null || effect.flags & (ReactiveFlags.watching) == 0) {
      break;
    }
  } while (true);

  queuedLength = insertIndex;

  while (firstInsertedIndex < --insertIndex) {
    final left = queued[firstInsertedIndex];
    // queued[firstInsertedIndex++] = queued[insertIndex];
    _queueSet(firstInsertedIndex++, queued[insertIndex]);
    queued[insertIndex] = left;
  }
}