dispose method
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,
),
),
);
}