get method

T get()

Gets the computed value, recalculating if necessary.

Checks if the value is dirty or pending, and if so, re-runs the getter function. Automatically tracks dependencies accessed during computation.

Returns the computed value.

Implementation

T get() {
  final flags = this.flags;
  if ((flags & ReactiveFlags.dirty) != ReactiveFlags.none ||
      ((flags & ReactiveFlags.pending) != ReactiveFlags.none &&
          (checkDirty(deps!, this) ||
              identical(this.flags = flags & -33 /*~ReactiveFlags.pending*/,
                  false)))) {
    if (didUpdate()) {
      final subs = this.subs;
      if (subs != null) {
        shallowPropagate(subs);
      }
    }
  } else if (flags == ReactiveFlags.none) {
    this.flags = 5 /*ReactiveFlags.mutable | ReactiveFlags.recursedCheck*/
        as ReactiveFlags;
    final prevSub = setActiveSub(this);
    try {
      currentValue = getter(null);
    } finally {
      activeSub = prevSub;
      this.flags &= -5 /*~ReactiveFlags.recursedCheck*/;
    }
  }

  final sub = activeSub;
  if (sub != null) link(this, sub, cycle);

  return currentValue as T;
}