clearAll method
Clear all dependencies from this scope
Implementation
void clearAll({bool force = false}) {
if (_disposed) {
return;
}
// Clear type bindings
final typeInstances = Map<Type, dynamic>.from(_typeBindings);
for (final entry in typeInstances.entries) {
final type = entry.key;
final instance = entry.value;
// Check permanence
final key = _getDependencyKey(type, null);
final isPermanent = _useCount[key] == -1;
if (!isPermanent || force) {
_typeBindings.remove(type);
_useCount.remove(key);
// Dispose if it's a controller OR service
if (instance is ZenController && !instance.isDisposed) {
try {
instance.dispose();
} catch (e) {
ZenLogger.logError(
'Error disposing controller during clearAll: $e');
}
} else if (instance is ZenService && !instance.isDisposed) {
try {
instance.dispose();
} catch (e) {
ZenLogger.logError('Error disposing service during clearAll: $e');
}
}
}
}
// Clear tagged bindings
final taggedInstances = Map<String, dynamic>.from(_taggedBindings);
for (final entry in taggedInstances.entries) {
final tag = entry.key;
final instance = entry.value;
final type = instance.runtimeType;
// Check permanence
final key = _getDependencyKey(type, tag);
final isPermanent = _useCount[key] == -1;
if (!isPermanent || force) {
_taggedBindings.remove(tag);
_useCount.remove(key);
// Update type-to-tags tracking
_typeToTags[type]?.remove(tag);
if (_typeToTags[type]?.isEmpty ?? false) {
_typeToTags.remove(type);
}
// Dispose if it's a controller OR service
if (instance is ZenController && !instance.isDisposed) {
try {
instance.dispose();
} catch (e) {
ZenLogger.logError(
'Error disposing controller during clearAll: $e');
}
} else if (instance is ZenService && !instance.isDisposed) {
try {
instance.dispose();
} catch (e) {
ZenLogger.logError('Error disposing service during clearAll: $e');
}
}
}
}
// Clear factories
if (force) {
_factories.clear();
// Remove any remaining use count entries for factories
_useCount.removeWhere((key, value) => value == -2);
} else {
// Only remove non-permanent factories
final factoriesToRemove = <String>[];
for (final entry in _factories.entries) {
final factoryKey = entry.key;
// Check if this factory is non-permanent
final matchingKeys = _useCount.entries.where((e) =>
e.value != -1 && // Not permanent
e.value != -2); // Not a factory pattern
if (matchingKeys.isNotEmpty) {
factoriesToRemove.add(factoryKey);
}
}
for (final key in factoriesToRemove) {
_factories.remove(key);
}
}
ZenLogger.logDebug('Cleared all dependencies from scope: $name');
}