Broke up arcane service into separate files

Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
2025-04-29 19:18:38 +02:00
parent 3ef93bb3f9
commit 25b456a664
4 changed files with 89 additions and 84 deletions
+1 -1
View File
@@ -40,7 +40,7 @@ library;
export "package:arcane_framework/src/arcane.dart";
export "package:arcane_framework/src/arcane_app.dart";
export "package:arcane_framework/src/providers/environment_provider.dart";
export "package:arcane_framework/src/providers/service_provider.dart";
export "package:arcane_framework/src/providers/service/arcane_service.dart";
export "package:arcane_framework/src/services/authentication/authentication_service.dart";
export "package:arcane_framework/src/services/feature_flags/feature_flags_service.dart";
export "package:arcane_framework/src/services/logging/logging_service.dart";
@@ -0,0 +1,36 @@
import "package:arcane_framework/arcane_framework.dart";
import "package:collection/collection.dart";
import "package:flutter/widgets.dart";
part "service_provider.dart";
part "service_provider_extensions.dart";
/// An abstract class representing a service in the Arcane architecture.
///
/// Classes that extend `ArcaneService` can use `ChangeNotifier` functionality
/// to notify listeners of changes. Services are typically registered in
/// `ArcaneServiceProvider` and can be accessed using the `service`
/// method on `BuildContext`.
abstract class ArcaneService with ChangeNotifier {
/// Retrieves a service of the specified type from the context.
///
/// Returns null if no service of type `T` is found.
///
/// Example:
/// ```dart
/// final myService = ArcaneService.ofType<MyService>(context);
/// ```
static T? ofType<T extends ArcaneService>(BuildContext context) =>
context.service<T>();
/// Retrieves a service of the specified type from the context.
///
/// Throws an assertion error if no service of type `T` is found.
///
/// Example:
/// ```dart
/// final myService = ArcaneService.requiredOfType<MyService>(context);
/// ```
static T requiredOfType<T extends ArcaneService>(BuildContext context) =>
context.requiredService<T>();
}
@@ -1,6 +1,4 @@
import "package:arcane_framework/arcane_framework.dart";
import "package:collection/collection.dart";
import "package:flutter/widgets.dart";
part of "arcane_service.dart";
/// A provider that makes a list of `ArcaneService` instances available to the widget tree.
///
@@ -122,83 +120,3 @@ class ArcaneServiceProvider
}
}
}
/// An extension on `BuildContext` to provide easy access to `ArcaneService` instances
/// that are registered in an `ArcaneServiceProvider`.
///
/// This extension provides methods for retrieving services in various ways.
///
/// Example usage:
/// ```dart
/// final myService = context.service<MyService>();
/// ```
extension ServiceProviderExtension on BuildContext {
/// Finds and returns the `ArcaneService` instance of type `T` that has been registered
/// in the `ArcaneServiceProvider` or in the list of built-in services (`Arcane.services`).
///
/// If no such service is found, it returns `null`.
///
/// Example:
/// ```dart
/// final myService = context.service<MyService>();
/// ```
T? service<T extends ArcaneService>() {
// First check built-in services
final builtInService = Arcane.services.whereType<T>().firstOrNull;
if (builtInService != null) return builtInService;
// Then check provider
return ArcaneServiceProvider.serviceOfType<T>(this);
}
/// Finds and returns the `ArcaneService` instance of type `T` that has been registered
/// in the `ArcaneServiceProvider` or in the list of built-in services (`Arcane.services`).
///
/// Throws an assertion error if no service is found.
///
/// Example:
/// ```dart
/// final myService = context.requiredService<MyService>();
/// ```
T requiredService<T extends ArcaneService>() {
final service = this.service<T>();
assert(service != null, "No service of type $T found");
return service!;
}
/// Legacy method to maintain backward compatibility.
///
/// Prefer using `service<T>()` instead.
@Deprecated("Use service<T>() instead")
T? serviceOfType<T extends ArcaneService>() => service<T>();
}
/// An abstract class representing a service in the Arcane architecture.
///
/// Classes that extend `ArcaneService` can use `ChangeNotifier` functionality
/// to notify listeners of changes. Services are typically registered in
/// `ArcaneServiceProvider` and can be accessed using the `service`
/// method on `BuildContext`.
abstract class ArcaneService with ChangeNotifier {
/// Retrieves a service of the specified type from the context.
///
/// Returns null if no service of type `T` is found.
///
/// Example:
/// ```dart
/// final myService = ArcaneService.ofType<MyService>(context);
/// ```
static T? ofType<T extends ArcaneService>(BuildContext context) =>
context.service<T>();
/// Retrieves a service of the specified type from the context.
///
/// Throws an assertion error if no service of type `T` is found.
///
/// Example:
/// ```dart
/// final myService = ArcaneService.requiredOfType<MyService>(context);
/// ```
static T requiredOfType<T extends ArcaneService>(BuildContext context) =>
context.requiredService<T>();
}
@@ -0,0 +1,51 @@
part of "arcane_service.dart";
/// An extension on `BuildContext` to provide easy access to `ArcaneService` instances
/// that are registered in an `ArcaneServiceProvider`.
///
/// This extension provides methods for retrieving services in various ways.
///
/// Example usage:
/// ```dart
/// final myService = context.service<MyService>();
/// ```
extension ServiceProviderExtension on BuildContext {
/// Finds and returns the `ArcaneService` instance of type `T` that has been registered
/// in the `ArcaneServiceProvider` or in the list of built-in services (`Arcane.services`).
///
/// If no such service is found, it returns `null`.
///
/// Example:
/// ```dart
/// final myService = context.service<MyService>();
/// ```
T? service<T extends ArcaneService>() {
// First check built-in services
final builtInService = Arcane.services.whereType<T>().firstOrNull;
if (builtInService != null) return builtInService;
// Then check provider
return ArcaneServiceProvider.serviceOfType<T>(this);
}
/// Finds and returns the `ArcaneService` instance of type `T` that has been registered
/// in the `ArcaneServiceProvider` or in the list of built-in services (`Arcane.services`).
///
/// Throws an assertion error if no service is found.
///
/// Example:
/// ```dart
/// final myService = context.requiredService<MyService>();
/// ```
T requiredService<T extends ArcaneService>() {
final service = this.service<T>();
assert(service != null, "No service of type $T found");
return service!;
}
/// Legacy method to maintain backward compatibility.
///
/// Prefer using `service<T>()` instead.
@Deprecated("Use service<T>() instead")
T? serviceOfType<T extends ArcaneService>() => service<T>();
}