unregisterK method
Resolvable<Option<Object> >
unregisterK(
- Entity typeEntity, {
- Entity groupEntity = const DefaultEntity(),
- bool traverse = true,
- bool removeAll = true,
- bool triggerOnUnregisterCallbacks = true,
inherited
Unregisters a dependency.
Honors the same contract as DIBase.unregister: traverse: false
limits to this container, removeAll: true walks every matching
registration, and triggerOnUnregisterCallbacks: true fires the
onUnregister of every removed dependency.
Implementation
Resolvable<Option> unregisterK(
Entity typeEntity, {
Entity groupEntity = const DefaultEntity(),
bool traverse = true,
bool removeAll = true,
bool triggerOnUnregisterCallbacks = true,
}) {
final g = groupEntity.preferOverDefault(focusGroup);
final removed = <Dependency>[];
// Walk the FULL ancestor chain (with cycle detection), matching the
// depth of `isRegisteredK(traverse: true)`. See the corresponding fix
// in [DIBase.unregister] for the symmetry rationale.
final containers = traverse ? _allAncestorsK() : <DI>[this as DI];
walk:
for (final di in containers) {
switch (di.removeDependencyK(typeEntity, groupEntity: g)) {
case Some(value: final dep):
removed.add(dep);
(di as SupportsMixinK).cleanupCompleters(typeEntity, groupEntity: g);
if (!removeAll) break walk;
case None():
if (!removeAll) break walk;
}
}
if (removed.isEmpty) return syncNone();
// See `_di_base.dart::_runOnUnregisterChain` for why we can't use a plain
// `firstResolvable.then(...)` outer wrapper here — `.then` short-circuits
// on Err and would silently skip every onUnregister callback when the
// dep's Resolvable resolved to Err.
var chain = _firstResolvedToOptionK(removed.first);
if (!triggerOnUnregisterCallbacks) return chain;
for (final dep in removed) {
// Pattern-match the two-layer Option<Option<cb>> at once; either layer
// missing means "skip this dep" without a single .unwrap().
if (dep.metadata case Some(value: final meta)) {
if (meta.onUnregister case Some(value: final cb)) {
chain = _chainOnUnregisterStepK(chain, dep, cb);
}
}
}
return chain;
}