enforceWritePolicy method

void enforceWritePolicy(
  1. Atom atom
)

Implementation

void enforceWritePolicy(Atom atom) {
  // Cannot mutate observables inside a computed. This is required to maintain the consistency of the reactive system.
  if (_state.computationDepth > 0 && atom.hasObservers) {
    throw MobXException(
      'Computed values are not allowed to cause side effects by changing observables that are already being observed. Tried to modify: ${atom.name}',
    );
  }

  // ---
  // We are wrapping in an assert() since we don't want this code to execute at runtime.
  // The dart compiler removes assert() calls from the release build.
  // ---
  assert(() {
    switch (config.writePolicy) {
      case ReactiveWritePolicy.never:
        break;

      case ReactiveWritePolicy.observed:
        if (atom.hasObservers == false) {
          break;
        }

        assert(
          _state.isWithinBatch,
          'Side effects like changing state are not allowed at this point. Please wrap the code in an "action". Tried to modify: ${atom.name}',
        );
        break;

      case ReactiveWritePolicy.always:
        assert(
          _state.isWithinBatch,
          'Changing observable values outside actions is not allowed. Please wrap the code in an "action" if this change is intended. Tried to modify ${atom.name}',
        );
    }

    return true;
  }());
}