ensureService<T extends Service> method

T ensureService<T extends Service>(
  1. Element dependent,
  2. ServiceId id,
  3. ServiceMode mode,
  4. T create(),
)

Ensures a service of type T is available, lazily creating it if necessary, and registers the dependent element.

Implementation

T ensureService<T extends Service>(
  Element dependent,
  ServiceId id,
  ServiceMode mode,
  T Function() create,
) {
  // Retrieve the existing service or lazily create a new one.
  final subscription = _subscriptions.putIfAbsent(id, () {
    final service = create();

    if (service.status == ServiceStatus.none) {
      service.load();
    }

    late final ServiceSubscription sub;

    void listener() {
      for (final element in sub.watchers) {
        if (element.mounted) {
          element.markNeedsBuild();
        }
      }
    }

    service.addListener(listener);
    sub = ServiceSubscription(service: service, listener: listener);
    return sub;
  });

  // Register the dependency with Flutter's framework using the serviceId as the aspect.
  dependent.dependOnInheritedWidgetOfExactType<ServiceScope>(aspect: id);

  // Track the element in either watchers or readers based on the requested [mode].
  if (mode == ServiceMode.watch) {
    subscription.watchers.add(dependent);
  } else {
    subscription.readers.add(dependent);
  }

  return subscription.service as T;
}