get<T extends Object> method

T get<T extends Object>({
  1. String? name,
})

Retrieves a registered dependency of type T (and optionally name).

Throws a WeaverException if the dependency is not registered.

Implementation

T get<T extends Object>({final String? name}) {
  final dependencyKey = DependencyKey(type: T, name: name);
  if (isRegistered<T>(name: name)) {
    final dependency = _dependencyMap.find(dependencyKey)! as Dependency<T>;
    if (dependency.value == null && dependency.lazyInstantiateCallback != null) {
      dependency.value = dependency.lazyInstantiateCallback!();
    }

    return dependency.value!;
  } else {
    var message = 'There is no instance of $dependencyKey registered.';

    final matchKeyForOnlyType = _dependencyMap.entries.map((final entry) {
      final key = entry.key;
      final registeredValue = entry.value.value;
      if (key.type == T && key.name != null && registeredValue != null) {
        return key;
      } else {
        return null;
      }
    }).nonNulls;

    if (matchKeyForOnlyType.isNotEmpty) {
      message = '$message But there are named dependencies registered with this type: $matchKeyForOnlyType. '
          'Pass [name] when calling get (e.g. weaver.get<$T>(name: ...)).';
    }

    throw WeaverException(message);
  }
}