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] 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] `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`. - [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>`. - [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] `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. - [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) ### Authentication Service (ArcaneAuth)
+21 -4
View File
@@ -22,7 +22,8 @@ import "package:flutter/widgets.dart";
class ArcaneServiceProvider class ArcaneServiceProvider
extends InheritedNotifier<ValueNotifier<List<ArcaneService>>> { extends InheritedNotifier<ValueNotifier<List<ArcaneService>>> {
/// A list of `ArcaneService` instances available through the provider. /// 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. /// Creates an `ArcaneServiceProvider` that provides [serviceInstances] to the widget tree.
/// ///
@@ -75,7 +76,7 @@ class ArcaneServiceProvider
final provider = maybeOf(context); final provider = maybeOf(context);
if (provider == null) return null; if (provider == null) return null;
return provider.serviceInstances.whereType<T>().firstOrNull; return provider.registeredServices.whereType<T>().firstOrNull;
} }
/// Updates the service instances in this provider. /// 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. /// If a service of the same type already exists, it will be replaced.
void addService(ArcaneService service) { void addService(ArcaneService service) {
final int existingIndex = serviceInstances.indexWhere( final int existingIndex = registeredServices.indexWhere(
(s) => s.runtimeType == service.runtimeType, (s) => s.runtimeType == service.runtimeType,
); );
final List<ArcaneService> newList = final List<ArcaneService> newList =
List<ArcaneService>.from(serviceInstances); List<ArcaneService>.from(registeredServices);
if (existingIndex >= 0) { if (existingIndex >= 0) {
newList[existingIndex] = service; newList[existingIndex] = service;
@@ -104,6 +105,22 @@ class ArcaneServiceProvider
notifier?.value = newList; 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 /// An extension on `BuildContext` to provide easy access to `ArcaneService` instances
+1 -1
View File
@@ -20,7 +20,7 @@ void main() {
child: Builder( child: Builder(
builder: (context) { builder: (context) {
final provider = ArcaneServiceProvider.of(context); final provider = ArcaneServiceProvider.of(context);
expect(provider.serviceInstances, equals(testServices)); expect(provider.registeredServices, equals(testServices));
return const SizedBox(); return const SizedBox();
}, },
), ),