dispose method

void dispose()

Disposes everything registered in this scope, in reverse registration (LIFO) order — resources created last are torn down first, so a late-created effect that reads an earlier-created Computed is canceled before that Computed closes. Idempotent: the second and subsequent calls are no-ops. An exception thrown by one disposer is reported (via CoreErrorReporting.report, library all_observer) and never prevents the remaining disposers from running.

Dispatches an ObserverInspector.onScopeDispose event with this scope's label and how many disposers ran.

Descarta tudo que foi registrado neste escopo, em ordem inversa de registro (LIFO) — recursos criados por último são derrubados primeiro, então um effect criado depois, que lê um Computed criado antes, é cancelado antes daquele Computed fechar. Idempotente: a segunda chamada em diante é um no-op. Uma exceção lançada por um disposer é reportada (via CoreErrorReporting.report, biblioteca all_observer) e nunca impede os demais disposers de rodarem.

Despacha um evento ObserverInspector.onScopeDispose com o label deste escopo e quantos disposers rodaram.

Implementation

void dispose() {
  if (_isDisposed) {
    return;
  }
  _isDisposed = true;
  // Snapshot + clear before running, so a disposer that (incorrectly)
  // triggers new registrations only ever hits the already-disposed path
  // in [add], never mutates the list being iterated.
  //
  // Snapshot + clear antes de rodar, para que um disposer que
  // (incorretamente) dispare novos registros só atinja o caminho de
  // já-descartado em [add], nunca mute a lista sendo iterada.
  final List<Disposer> disposers = List<Disposer>.of(_disposers);
  _disposers.clear();
  for (final Disposer disposer in disposers.reversed) {
    try {
      disposer();
    } catch (error, stackTrace) {
      CoreErrorReporting.report(
        error,
        stackTrace,
        library: 'all_observer',
        context:
            'exceção isolada em um disposer de $label — while '
            'disposing a ReactiveScope',
      );
    }
  }
  dispatchToInspectors(
    ObserverConfig.inspectors,
    (ObserverInspector i) => i.onScopeDispose(
      ScopeDisposeEvent(
        label,
        disposers.length,
        stackTrace: ObserverConfig.captureStackTraces
            ? StackTrace.current
            : null,
      ),
    ),
  );
}