Renamed serviceInstances => registeredServices and added a removeService method

Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
2025-04-29 18:56:48 +02:00
parent d1daf0e39f
commit 3ef93bb3f9
3 changed files with 25 additions and 6 deletions
+3 -1
View File
@@ -17,11 +17,13 @@
- [NEW] Added a new `ArcaneServiceProvider.maybeOf(context)` getter which returns a nullable `ArcaneServiceProvider` instance.
- [NEW] `ArcaneServiceProvider` now includes a `serviceOfType<T>(context)` getter to retrieve a nullable registered service instance.
- [NEW] An `addService` method was added to `ArcaneServiceProvider`
- [NEW] An `addService` method was added to `ArcaneServiceProvider`.
- [NEW] A `removeService` method was added to `ArcaneServiceProvider`.
- [NEW] A `setServices` method was added to `ArcaneServiceProvider`. Invoking this method with a list of `ArcaneService` instances will replace all existing services in the `ArcaneServiceProvider`.
- [DEPRECATED] `context.serviceOfType<T>` has been deprecated in favor of `context.service<T>`.
- [NEW] `context.requiredService<T>` has been added to provide a mechanism for ensuring a particular service has been registered.
- [NEW] Added `ArcaneService.ofType<T>(context)` and `ArcaneService.requiredOfType<T>(context)` locators, returning a nullable and non-nullable instance of a given service, respectively.
- [BREAKING] Renamed `serviceInstances` to `registeredServices`.
### Authentication Service (ArcaneAuth)
+21 -4
View File
@@ -22,7 +22,8 @@ import "package:flutter/widgets.dart";
class ArcaneServiceProvider
extends InheritedNotifier<ValueNotifier<List<ArcaneService>>> {
/// A list of `ArcaneService` instances available through the provider.
List<ArcaneService> get serviceInstances => notifier!.value;
List<ArcaneService> get registeredServices =>
List<ArcaneService>.from(notifier?.value ?? []);
/// Creates an `ArcaneServiceProvider` that provides [serviceInstances] to the widget tree.
///
@@ -75,7 +76,7 @@ class ArcaneServiceProvider
final provider = maybeOf(context);
if (provider == null) return null;
return provider.serviceInstances.whereType<T>().firstOrNull;
return provider.registeredServices.whereType<T>().firstOrNull;
}
/// Updates the service instances in this provider.
@@ -89,12 +90,12 @@ class ArcaneServiceProvider
///
/// If a service of the same type already exists, it will be replaced.
void addService(ArcaneService service) {
final int existingIndex = serviceInstances.indexWhere(
final int existingIndex = registeredServices.indexWhere(
(s) => s.runtimeType == service.runtimeType,
);
final List<ArcaneService> newList =
List<ArcaneService>.from(serviceInstances);
List<ArcaneService>.from(registeredServices);
if (existingIndex >= 0) {
newList[existingIndex] = service;
@@ -104,6 +105,22 @@ class ArcaneServiceProvider
notifier?.value = newList;
}
/// Removes all services of the specified type from the registry.
/// Returns true if any services were removed, false otherwise.
void removeService<T extends ArcaneService>() {
final int existingIndex = registeredServices.indexWhere(
(s) => s.runtimeType == T,
);
if (existingIndex >= 0) {
final List<ArcaneService> newList =
List<ArcaneService>.from(registeredServices);
newList.removeAt(existingIndex);
notifier?.value = newList;
}
}
}
/// An extension on `BuildContext` to provide easy access to `ArcaneService` instances
+1 -1
View File
@@ -20,7 +20,7 @@ void main() {
child: Builder(
builder: (context) {
final provider = ArcaneServiceProvider.of(context);
expect(provider.serviceInstances, equals(testServices));
expect(provider.registeredServices, equals(testServices));
return const SizedBox();
},
),