NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
A lightweight, modular state management library for the Air Framework.
Last release 6 months ago
11 Apr 2026
Ships on a steady schedule
a new release about every 5 weeks
Nearly every release is documented
notes for 8 of 8 stable releases
Nothing withdrawn
no release was ever pulled
8 months old
8 releases · first in 2026
One column per month.
Strong Type Retention in AirListener: Improved the generic type resolution mechanism when iterating over List . Controller resolution now utilizes dyn
List<AirStateKey>. Controller resolution now utilizes dynamic dispatch directly on the AirStateKey<T> instance, guaranteeing the preservation of the explicit generic type T and ensuring strictly typed state initialization.AirPulse Callable Shorthand: AirPulse is now a callable class. Use AuthPulses.clearMessages(null) instead of AuthPulses.clearMessages.pulse(null). The
AirPulse<T> is now a callable class. Use AuthPulses.clearMessages(null) instead of AuthPulses.clearMessages.pulse(null). The explicit .pulse() method remains available for backward compatibility.AirListener: Introduced the AirListener widget for handling one-off side effects (navigation, SnackBars) reactively without triggering UI rebuilds. Th
AirListener widget for handling one-off side effects (navigation, SnackBars) reactively without triggering UI rebuilds. This component promotes better separation of concerns and keeps the widget build methods pure.Fixed silent data loss in `StatePersistence._serialize()`: Custom model objects with toJson() or toMap() methods now serialize correctly. Previously,
StatePersistence._serialize(): Custom model objects with toJson() or toMap() methods now serialize correctly. Previously, the existence check obj.toJson != null always threw NoSuchMethodError (swallowed by a catch), causing all custom models to fall back to .toString() — making restore impossible. Now calls toJson()/toMap() directly inside a try-catch.AirState.dispose(): Simplified the disposal logic to a single try { (sub as dynamic).cancel() } catch (_) {} block. The previous implementation had unreachable branches and silently swallowed cancellation errors, leaving subscriptions alive after dispose.dart:async import from air_state_base.dart.Visual Identity: Added the official Air Framework SVG logo.
Added canAccess method to AirDelegate to validate state access permissions.
canAccess method to AirDelegate to validate state access permissions.AirBuilder to check for access permissions before building.sourceId tracking to AirDelegate.subscribe and AirState event listeners.AirBuilder, AirBuilder2, and AirBuilder3 now accept callerModuleId for better dependency tracking.AirDelegate interface signatureUpdated examples and internal documentation links.
Core reactive state management (AirController, Air).
air_state.AirController, Air).AirStateKey).AirBuilder, AirView).Your coding agent can read these notes before it upgrades. Set up the MCP server →