flutter_zenith 0.10.0
flutter_zenith: ^0.10.0 copied to clipboard
A high-performance, container-scoped state management and dependency injection engine for Flutter. Zero-dependency, surgical rendering, async lifecycle guards, and type-safe DI — all in one package.
0.10.0 #
- Controller Base Class (
ZenithController): Added a scoped base class for business logic with lifecycle hooks, mounted-safe node writes, async task handling, and stream subscriptions that clean up with itsZenithRef. - Stateful Widget Integration: Added
ZenithStatefulWidget,ZenithState, andZenithStateMixinfor reactive stateful widgets and lifecycle-safe, side-effect-only node listeners. - Inline Reactive Builder (
ZenithConsumer): Added a lightweight builder widget for reactive reads without creating a dedicated widget subclass. - Typed Key Families (
ZenithFamily): Added reusable typed key factories for argument-specific container dependencies. - Watch and Select Aliases: Added
BuildContext.watchandBuildContext.selectas concise aliases for the existing node helpers. - Ref Disposal: Container resets and disposal now clean up every active
ZenithRef, including explicitly created refs.
0.9.0 #
ZenithConsumerWidget: Ergonomic base widget providingbuild(BuildContext context, ZenithRef ref)for declarative, reactive consumption of Zenith nodes and container services without requiring nestedZenithBuilderwidgets.- Side-Effect Listener (
ZenithListener): Dedicated widget for listening to state changes on aZenithNode<T>and executing callbacks (e.g. navigation, notifications, snackbars, analytics) without causing widget rebuilds. - Ergonomic Ref/Context Extensions (
watchNode,selectNode): Added high-level extension methods onZenithRefandBuildContextto watch nodes or project derived state selections with automatic lifecycle subscription cleanup. AsyncValue.hasValue: Added convenient boolean getterhasValueonAsyncValue<T>to quickly check if a value is present (both in data and previous loading/error states).- Cyclic Dependency Detection: Added graph cycle detection in
ComputedNodeto safeguard against recursion loops during derived computation evaluations.
0.8.0 #
- In-Memory Mediator (
ZenithMediator): MediatR equivalent supporting 1-to-1 Commands (ZenithCommand<R>), 1-to-Many Domain Events (ZenithEvent), and cross-cuttingZenithPipelineBehaviorwrappers with re-entrancy depth safeguards and error isolation. - Resilience & Fault Handling (
ZenithResilience): Polly equivalent featuringZenithResiliencePipelinewith Exponential Backoff Retry (with randomized jitter to prevent thundering herd spikes),CircuitBreaker(closed,open,halfOpen), and sliding windowRateLimiter. - Strongly-Typed Validation Engine (
ZenithValidator): FluentValidation equivalent with fluent rule builders (notEmpty,email,minLength,greaterThan,must), ReDoS safety, andZenithValidatedNode<T>for auto-validating state nodes. - Structured Logger & Extensible Sinks (
ZenithLogger): Serilog equivalent supporting message template interpolation, automatic PII Redaction (password,token,secret,credit_card),ConsoleSink, and fixed-capacityMemoryRingBufferSinkfor zero OOM memory growth.
0.7.0 #
- Feature Management & Feature Flags: Introduced
ZenithFeature,FeatureNode, andZenithFeatureBuilderwidget for reactive feature flag rollouts, Remote Config integration, and percentage rollout rule evaluation. - Options Pattern (
ZenithConfigNode<T>): Introduced dynamic configuration nodes (ASP.NET CoreIOptionsMonitor<T>equivalent) that decode JSON/Map updates and notify subscribers only on parsed config changes. - Environment Profiles (
ZenithEnvironment): AddedZenithEnvironment(development,staging,production) andenvironmentOverridestoZenithContainerfor environment-aware DI registration. - Hosted Background Services (
ZenithService): Introduced lifecycle-managed background service contract (onStart,onStop) with concrete implementationsZenithPeriodicService(periodic background task runner) andZenithIsolateService(background Isolate worker).
0.6.0 #
- In-Place Scope Reset: Added
ZenithContainer.reset()to clear all nodes and references in an existing container without destroying the container instance itself (ideal for multi-user logout). - Authentication State Union: Introduced
AuthState<T>(AuthUnauthenticated,AuthAuthenticating,AuthAuthenticated<T>,AuthError) with exhaustive pattern matching and boolean status getters for router integration. - State Persistence & Hydration: Introduced
ZenithStorageinterface, built-inInMemoryStorage, andPersistedNode<T>with static constructors (PersistedNode.string,PersistedNode.integer,PersistedNode.boolean) for auto-restoring and auto-saving node state across app restarts. - Node Middleware Pipeline: Added
ZenithMiddleware<T>interceptors (onWillSet,onDidSet) for value sanitization, validation, transformation, write blocking, and audit logging.
0.5.0 #
AsyncValueEquality & Value-Deduplication: Implemented==andhashCodeforAsyncData,AsyncLoading, andAsyncError. Setting the same async state twice now skips unnecessary subscriber notifications and widget rebuilds.AsyncValueConvenience Helpers: AddedmaybeWhen,whenOrNull,hasData,requireValue, and human-readabletoString()methods.- Stream Support: Added
ZenithStreamX.watchStream(node, stream)andStreamNodeX.watch(ref, stream)for auto-subscribing streams toAsyncValuenodes with automatic lifecycle cancellation on scope disposal. - Computed / Derived Nodes: Introduced
ComputedNode<T>for reactive state derivation. Auto-tracks source node dependencies during evaluation and only re-notifies when the computed result changes. - Granular Subscriptions (
ZenithSelector): IntroducedZenithSelector<T, R>widget for selecting derived sub-properties of a node without triggering rebuilds when unrelated parts of the node change. - Framework Observer (
ZenithObserver): AddedZenithObserverandZenithLogObserverfor debugging node creation, mutation, and container lifecycle events. - Widget Rebuild Error Handling: Added
errorBuilderparameter toZenithBuilderfor graceful error rendering when builder closures throw. - Documentation & Metadata: Comprehensive Dart doc coverage (
///) across all public APIs and updatedpubspec.yamlpub.dev metadata.
0.4.0 #
- Added
ConcurrencyStrategy(concurrent,droppable,restartable) andZenithConcurrencyX.runAsyncGuarded<T>(node, task, {strategy}): a race-condition-safe alternative toref.runAsyncforAsyncValue<T>nodes.droppableignores new calls while a task is already loading (prevents double-submit on rapid taps);restartable(the default) drops stale results/errors from superseded calls so only the latest invocation can ever update state (fixes stale-response bugs in search-as-you-type / rapid tab switching). - Added
ZenithIsolateX.runInIsolate<T, P>(node, payload, heavyComputation, {strategy}): offloads a heavy synchronous computation to a backgroundIsolateviaIsolate.run, then writes the result throughrunAsyncGuarded, keeping the UI thread free of jank. - Both extensions are additive --
ZenithRef.runAsyncandSafeAsyncNodeX.guardare unchanged.
0.3.0 #
- Added
ZenithRef.set<T>(node, value): a mounted-safe write helper that silently no-ops once the ref's scope has been disposed. - Added
ZenithRef.runAsync<T>(node, task): runs an asynctaskand writesAsyncLoading/AsyncData/AsyncErrorto anAsyncValue<T>node, automatically guarding every mutation with the ref's mounted state so manualif (!ref.isMounted) return;checks are no longer required. - Added
SafeAsyncNodeX.guard(ref, future)extension onZenithNode<AsyncValue<T>>as sugar overref.runAsync(...). - Breaking:
ZenithNode.set()no longer throwsStateErrorwhen called on a disposed node; it now fails silently (a no-op), matching the semantics of a late/unmounted async write. Reading.value, calling.invalidate(), or.subscribe()on a disposed node still throwStateErroras before.
0.2.0 #
- Added type-safe dependency keys with
ZenithKey<T>. - Added scoped factory overrides via
ZenithOverride<T>andZenithContainer(overrides: [...]). - Added typed container APIs:
getOrCreate<T>(ZenithKey<T>, factory),maybeReadKey<T>(ZenithKey<T>), andinvalidateKey<T>(ZenithKey<T>). - Added
BuildContextergonomics viaZenithContextX:context.containerandcontext.zenith(...). - Preserved backwards compatibility for existing string-key APIs
(
getOrCreateNode,maybeNode,invalidate). - Added tests for key equality, typed node caching, and override behavior.
0.1.0 #
- Initial release of
flutter_zenith. ZenithContainer/ZenithRef: container-scoped dependency injection withgetOrCreateNode,maybeNode,invalidate, and disposal lifecycle hooks.ZenithNode<T>: atomic reactive state nodes with weak-reference subscriber tracking and automatic dead-subscriber pruning.ZenithScope/ZenithBuilder: Flutter widget integration for container-scoped state and surgical, dependency-tracked rebuilds.AsyncValue<T>(AsyncData,AsyncLoading,AsyncError): pattern-matching async state machine withwhen,valueOrNull,isLoading, andhasError.- Comprehensive unit/widget test suite covering lifecycle, memory safety, reactive dependency graph, async/concurrency edge cases, and widget-tree integration.