ensureService<T extends Service> method
T
ensureService<T extends Service>(
- Element dependent,
- ServiceId id,
- ServiceMode mode,
- 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;
}