value property

  1. @override
T get value
override

The current state of the reactive object.

Reading this property automatically registers the object as a dependency of the currently active observer (e.g., inside an LxComputed builder).

Implementation

@override
T get value {
  if (_isActive) {
    _ensureFresh();
    return super.value;
  }

  // Inactive computed values evaluate on demand.
  final existingProxy = Lx.proxy;

  // Without active observer, capture graph only when middleware requires it.
  if (existingProxy == null) {
    if (!LevitReactiveMiddleware.hasGraphChangeMiddlewares) {
      try {
        return _compute();
      } catch (_) {
        rethrow;
      }
    }

    final tracker = _DependencyTracker()
      ..trackReactives = LevitReactiveMiddleware.hasGraphChangeMiddlewares;
    Lx.proxy = tracker;

    try {
      T? computationResult;

      try {
        computationResult = _compute();
      } catch (_) {
        rethrow;
      }

      // Publish graph changes only when dependency set was observed.
      if (tracker.reactives.isNotEmpty) {
        maybeNotifyGraphChange(tracker.reactives);
      }

      return computationResult as T;
    } finally {
      Lx.proxy = null;
    }
  }

  // Active observer already captures dependencies upstream.
  try {
    return _compute();
  } catch (_) {
    rethrow;
  }
}