arcane_framework 2.0.1
arcane_framework: ^2.0.1 copied to clipboard
Agnostic Reusable Component Architecture for New Ecosystems: a modern framework for bootstrapping new applications
2.0.1 #
Arcane Framework #
- [NEW]
ArcaneAppnow owns and publishes a live service registry for provider-aware static lookups. - [CHANGE]
Arcane.features,Arcane.auth,Arcane.theme, andArcane.environmentnow prefer the liveArcaneAppregistry instance when available, then fall back to built-in singletons. - [BREAKING]
Arcaneis now a static utility surface (no instantiable singleton constructor). - [BREAKING] Several
package:arcane_framework/src/...import paths changed (for example,src/providers/...->src/service/...andsrc/services/reactive_theme/...->src/services/theme/...). Consumers importing fromsrcdirectly must update import paths. - [NEW] Added optional
ArcaneApp.buildercallback (TransitionBuilder style) for capturing provider-aware build contexts from withinArcaneApp. - [DEPRECATED]
ArcaneApp.childis now deprecated in favor ofArcaneApp.builder(legacy child usage remains supported during migration). - [DEPRECATED]
BuildContext.serviceOfType<T>()is now deprecated in favor ofBuildContext.service<T>().
Environment Service #
- [NEW] Added
ArcaneEnvironmentServiceas a singletonArcaneServiceinstance. - [CHANGE] Changed
ArcaneEnvironmentis no longer aCubitand is now anInheritedWidget. - [NEW] Added
Arcane.environmentshortcut for direct environment access. - [NEW] Added environment service to
Arcane.servicesbuilt-in list. - [CHANGE]
ArcaneEnvironmentProvideris now aStatefulWidgetinstead of aStatelessWidgetwith aBlocProvider. - [NEW]
ArcaneEnvironmentProvidernow provides methods forenableDebugMode(),disableDebugMode()andsetEnvironment(). - [NEW] Added
environmentChangesstream for realtime environment updates.
Migration Steps (ArcaneEnvironment)
-
The
stategetter has been removed fromArcaneEnvironment. If you previously accessed environment state viaArcane.environment.state, update your code to use the new API:-
Before:
final env = Arcane.environment.state; -
After:
final env = Arcane.environment.current;
-
-
If you were using
Cubit-style APIs, migrate to the newInheritedWidget/ValueNotifier-based approach. See the README for updated usage examples.
Authentication Service #
- [BREAKING]
ArcaneAuthInterface.logoutnow accepts optionalonLoggedOutcallback parameters.ArcaneAuthInterfaceimplementers must update logout signature to accept optionalonLoggedOut. See the migration steps for further details. - [NEW] Added
statusChangesstream to observeAuthenticationStatusupdates. - [NEW] Added
signedInChangesstream to observe sign-in state changes. - [FIX] Added stream lifecycle cleanup in
disposewith safe lazy recreation.
Migration Steps (ArcaneAuthInterface)
- Update
ArcaneAuthInterfaceimplementations to accept the new optionalonLoggedOutcallback parameter inlogout(...). - If your implementation performs cleanup side effects on logout, invoke
onLoggedOutwhen provided. - Run tests to confirm your authentication adapter still satisfies your login/logout flows.
Before:
@override
Future<Result<void, String>> logout() async {
// ...
return Result.ok(null);
}
After:
@override
Future<Result<void, String>> logout({
Future<void> Function()? onLoggedOut,
}) async {
// ...
if (onLoggedOut != null) await onLoggedOut();
return Result.ok(null);
}
Feature Flag Service #
- [CHANGE] Renamed service class
ArcaneFeatureFlagstoArcaneFeatureFlagService. - [NEW] Added backward compatibility typedef:
typedef ArcaneFeatureFlags = ArcaneFeatureFlagService. - [NEW] Added
enabledFeaturesChangesstream to observe enabled feature updates in realtime. - [FIX] Added stream lifecycle cleanup in
disposewith safe lazy recreation. - [NEW] Added
ArcaneFeatureFlagProvider(InheritedWidget) andArcaneFeatureFlagsProvider(StatefulWidget) for first-class feature-flag integration in the widget tree. - [DEPRECATED]
ArcaneFeatureFlagsScopehas been renamed toArcaneFeatureFlagProvider. - [NEW] Added
BuildContextconvenience accessors for feature flags, includingcontext.featureFlags,context.maybeFeatureFlags,context.isFeatureEnabled(...), andcontext.isFeatureDisabled(...). - [NEW]
ArcaneAppnow includesArcaneFeatureFlagsProviderby default, enabling rebuilds for widgets that depend onArcaneFeatureFlagProvider.of(context). - [UPDATE] README now documents
ArcaneFeatureFlagProviderandArcaneAppprovider composition.
Theme Service #
- [CHANGE] Renamed
ArcaneReactiveThemetoArcaneThemeServicefor clearer naming. - [NEW] Added backward compatibility typedef:
typedef ArcaneReactiveTheme = ArcaneThemeService. - [FIX] Theme initialization now respects
ThemeMode.systemand initializesThemeDatausing the effective brightness. - [FIX]
ArcaneThemeSwitchernow initializes system-follow behavior once on first dependency resolution. - [FIX]
ArcaneThemeSwitchernow defaults tofollowSystemTheme(context)when mounted underArcaneApp, so system-follow is enabled by default and system brightness changes are handled framework-side (no app-level observer needed). - [FIX]
switchTheme()now toggles from the effective theme when current mode isThemeMode.system(system dark -> light, system light -> dark). - [CHANGE]
context.isDarkModenow reflects effective app theme brightness (Theme.of(context).brightness) instead of raw platform brightness. - [FIX]
followSystemTheme()now reads platform brightness directly to avoid coupling system-follow behavior to app theme overrides. - [NEW] Added assignment-style theme setters:
Arcane.theme.dark = ...andArcane.theme.light = ...(in addition tosetDarkTheme/setLightTheme). - [FIX] Reactive theme stream controllers now close only during service dispose, preventing stream shutdown when a single subscriber cancels.
- [FIX] Setting a theme (e.g., dark) while in the opposite mode (e.g., light) no longer changes the current brightness or rendered theme. Only the active mode's theme updates the rendered appearance.
- [NEW] Added
themeModeChangesandthemeDataChangesstreams for realtime theme updates.
Migration Steps (ArcaneThemeService)
- Replace legacy
ThemeModereads fromArcane.theme.systemTheme.valuewithArcane.theme.currentModeOf(context)when configuring appthemeMode.
Before:
MaterialApp(
theme: Arcane.theme.light,
darkTheme: Arcane.theme.dark,
themeMode: Arcane.theme.systemTheme.value,
)
After:
MaterialApp(
theme: Arcane.theme.light,
darkTheme: Arcane.theme.dark,
themeMode: Arcane.theme.currentModeOf(context),
)
Arcane Logger #
- [NEW] Added
logStreamfor realtime log subscriptions. - [NEW] Added explicit
disposecleanup for logger stream resources. - [NEW] Added optional lifecycle capability via
LoggingInitializableandLoggingInitialization. - [NEW] Added optional
featuretag support via@LoggingFeature(...)annotation. - [NEW] Added a
skipAutodetectionparameter toArcane.log(defaults tofalse) that, when enabled, skips detection of themodule,method, and file/line number where logs originated from. - [NEW] Added the
LogInterceptorclass which can (optionally) be added toArcaneLoggerto pre-process log messages before they are sent to the registeredArcaneLoggingInterface(s). - [NEW] Added collection-style interceptor APIs:
Arcane.logger.interceptors.add(...),Arcane.logger.interceptors.remove(...), andArcane.logger.interceptors.clear()with an optionalmatcherfor explicit type-scoped matching strategies, including subtype-inclusive matching. - [CHANGE] Updated
Arcane.logmetadata type fromMap<String, String>?toMap<String, Object?>?to support structured metadata values. - [CHANGE]
initializeInterfaces()now initializes only interfaces that implementLoggingInitializable; other interfaces are skipped. - [BREAKING]
LoggingInterfaceno longer includes built-in singleton-style initialization state.
Migration Steps (LoggingInterface)
- Remove
initializedandinitfrom interfaces that do not require startup work. - If an interface requires startup/lifecycle management, add
LoggingInitialization(or implementLoggingInitializable) and move setup logic intoinit(). - Update
log(...)implementations to guard behavior withinitializedonly for interfaces that opted into initialization. - Run tests to verify interface registration and logging behavior still match expectations.
Before:
class DebugConsole implements LoggingInterface {
@override
bool get initialized => true;
@override
Future<LoggingInterface?> init() async => this;
@override
void log(String message, {Map<String, Object?>? metadata, Level? level}) {}
}
After:
class DebugConsole extends LoggingInterface {
@override
void log(String message, {Map<String, Object?>? metadata, Level? level}) {}
}
- For SDK-backed loggers, opt into initialization with the mixin.
class ExternalLogger extends LoggingInterface with LoggingInitialization {
@override
Future<void> init() async {
if (initialized) return;
// Start SDK.
await super.init();
}
@override
void log(String message, {Map<String, Object?>? metadata, Level? level}) {
if (!initialized) return;
// Send to SDK.
}
}
- If desired, adopt
featurefor destination-aware filtering in interceptors.
Migration Steps (Arcane.log metadata)
- Update
Arcane.log(...)call sites that stringify metadata values only to satisfy the previousMap<String, String>type. - Prefer passing native values (for example
int,bool,List, or nestedMap) directly inmetadatawhen useful. - If your logging destination expects only string metadata, convert
Object?values to strings at your logging boundary.
Before:
Arcane.log(
"Login attempt",
metadata: {
"attempt": attempt.toString(),
"rememberMe": rememberMe.toString(),
},
);
After:
Arcane.log(
"Login attempt",
metadata: {
"attempt": attempt,
"rememberMe": rememberMe,
},
);
Dependencies #
- [CHANGE] Updated
result_monadfrom^2.3.2to^4.0.0. - [CHANGE] Removed direct
flutter_blocdependency. - [CHANGE] Updated
collectionfrom^1.18.0to^1.19.0.
2.0.0 #
- Version redacted. Use v2.0.1.
1.2.7 #
- Updated dependencies to latest
1.2.6 #
- Updated dependencies to latest
1.2.5 #
- Improved automatic metadata detection in
ArcaneLogger
1.2.4 #
- Update package dependencies
1.2.3 #
- Added
ValueNotifiers to both theArcaneAuthenticationServiceandArcaneFeatureFlags. This enables the possibility of listening for changes to either service.
Example #
// Listen to changes in the authentication status
Arcane.auth.isSignedIn.addListener(() {
if (Arcane.auth.isSignedIn.value) {
Arcane.log("User is signed in");
} else {
Arcane.log("User is signed out");
}
});
// Listen to changes in the enabled/disabled features
Arcane.features.notifier.addListener(() {
Arcane.log("Enabled features have been updated: ${Arcane.features.notifier.value}");
});
1.2.2 #
- Lowered minimum required collection dependency version to prevent forcing users into the latest Flutter release
1.2.1 #
- Lowered minimum required SDK version to prevent forcing users into the latest Flutter release
1.2.0 #
- Removed flutter_secure_storage dependency as it was unused
Breaking Changes #
The following methods have been moved outside of the ArcaneAuthInterface base class:
- resendVerificationCode
- register
- confirmSignup
- resetPassword
These methods have been moved to mixin classes. To continue using them, please update your ArcaneAuthInterface implementations.
- To use
resendVerificationCode,registerandconfirmSignup, use the newArcaneAuthAccountRegistrationmixin. - To use
resetPassword, use the newArcaneAuthPasswordManagementmixin.
Migration #
In order to migrate your existing interfaces, update them from:
class MyAuthInterface implements ArcaneAuthInterface {}
to:
class MyAuthInterface
with ArcaneAuthAccountRegistration, ArcaneAuthPasswordManagement
implements ArcaneAuthInterface {}
If the methods that these mixins provide are not being used, the mixins can safely be omitted. If only one of these mixins is required, the other can be safely omitted.
This change should result in fewer lines of code for interface implementations that do not require these additional features.
1.1.7 #
- Fixed an issue with the
ArcaneAuthenticationServicewhere an exception would be thrown when attempting to access an authentication token while noArcaneAuthInterfacewas registered.
1.1.6 #
- Updated logging feature to indicate the feature which was enabled or disabled within the log message, instead of only in the metadata.
1.1.5 #
- Update package dependencies. No code changes.
1.1.4 #
- Update package dependencies. No code changes.
1.1.3 #
- Arcane Auth no longer throws exceptions when log out fails, instead returning
a
Result<void, String>. This behavior matches the login method.
1.1.2 #
- Removed Flutter exception handling from
ArcaneLoggingService, as this functionality should be defined by a users' interface.
Migration #
Add the following to your ArcaneLoggingInterface's init method to replicate
the previous behavior:
// Handles unhandled Flutter errors by logging them.
FlutterError.onError = (errorDetails) {
Arcane.log(
errorDetails.exceptionAsString(),
level: Level.error,
module: errorDetails.library,
stackTrace: errorDetails.stack,
);
};
// Handles unhandled platform-specific errors by logging them.
PlatformDispatcher.instance.onError = (error, stack) {
Arcane.log(
"$error",
level: Level.error,
stackTrace: stack,
);
return false;
};
1.1.1+2 #
- Updated example in README
1.1.1+1 #
- Updated example in README
1.1.1 #
- [BREAKING] Updated ArcaneAuthInterface to make the
resendVerificationCode,confirmSignup, andresetPasswordmethods more versatile
Migration:
| Class | Migration path |
|---|---|
| ArcaneAuthInterface | resendVerificationCode(String email) -> resendVerificationCode<T>({T? input}) |
| ArcaneAuthInterface | confirmSignup({String email, String password}) -> confirmSignup({String? email, String? password}) |
| ArcaneAuthInterface | resetPassword({String email, String? newPassword, String? code}) -> resetPassword({String? email, String? newPassword, String? code}) |
1.1.0 #
- [BREAKING] Updated the authentication service and interface to be more versatile
Migration:
| Class | Migration path |
|---|---|
| ArcaneAuthInterface | loginWtihEmailAndPassword({String email, String password}) -> login<T>({T? input}) |
| ArcaneAuthInterface | signup({String email, String password}) -> register<T>({T? input}) |
1.0.8 #
- Added the
extraparameter to theArcane.logshortcut method
1.0.7 #
- Added the
extraparameter to theLoggingInterface
1.0.6+1 #
- Migrated linting rules to new arcane_analysis package.
1.0.6 #
- Removed get_it as a dependency
1.0.5+2 #
- Updated README and example project documentation
1.0.5+1 #
- Marked the
loginWithEmailAndPasswordmethod inArcaneAuthenticationServiceas deprecated and updated example project
1.0.5 #
- Added the ability to use a generic type for the login method in ArcaneAuthenticationService
- Added the ability to reset the ArcaneAuthenticationService, which will unregister the current interface and clear the authentication state
- Removed unused testing tooling (e.g.,
@visibleForTesting) from the codebase- Migration guide: Remove usages of
setMockedin your tests
- Migration guide: Remove usages of
1.0.4 #
- Resolved an issue with authentication using the ArcaneAuthenticationService when logging in with an email and password
1.0.3+1 #
- Added example project
1.0.3 #
- Added the ability to switch back to the normal environment from the debug environment in ArcaneEnvironment
- (breaking) Made the optional
onLoggedOutcallback a Future instead of a void function in ArcaneAuthenticationService - Added additional error handling to the login method in ArcaneAuthenticationService
- Added support for following the system's theme in ArcaneTheme
- Removed the BuildContext parameter from the
switchThememethod in ArcaneTheme
1.0.2 #
- Migrated ArcaneAuthenticationService's isSignedIn to a ValueListenable
1.0.1+1 #
- Removed ID and secure storage services to improve platform compatibility
1.0.0 #
- Initial release