unregisterK method

Resolvable<Option<Object>> unregisterK(
  1. Entity typeEntity, {
  2. Entity groupEntity = const DefaultEntity(),
  3. bool traverse = true,
  4. bool removeAll = true,
  5. 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;
}