NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev
A lightweight, reactive state management solution for Flutter applications with async state support and domain-specific atoms.
Last release 6 months ago
22 Mar 2026
Ships fairly regularly
a new release about every 3 months
Nearly every release is documented
notes for 14 of 14 stable releases
Nothing withdrawn
no release was ever pulled
2 years old
14 releases · first in 2025
One column per month.
`atomicUpdate()` rollback — atoms now restore their previous values when an error is thrown inside the update block, preventing inconsistent state
atomicUpdate() rollback — atoms now restore their previous values when an error is thrown inside the update block, preventing inconsistent stateAsyncValue.hasValue — correctly returns true for nullable success types with null dataAsyncValue.value — uses safe as T cast instead of ! to support nullable type parametersAsyncAtom.cancel() / clear() — bypass middleware via setDirect() to avoid unintended side effectsasStream() — changed to single-subscription StreamController with lazy listener setup, preventing resource leaksselect() — now delegates to computed() for proper read-only semanticsthrottle() — added trailing-edge emission so the last value in a throttle window is never lostcombine() — onDispose callbacks now return removal functions; each source properly cleans up the other on disposalpersistAtom() race condition — user set() calls during async storage restore now take priority over the persisted value; restored values no longer trigger a redundant write-backWatchAtom mixin — fixed subscription tracking so _watching is cleared on the first watch() of each build pass instead of inside the listenerexecuteWithRetry() — checks isDisposed after each retry delay to stop retrying disposed atomsAtomFamily.call() — auto-removes disposed atoms from the internal map and returns a fresh instanceAtomFamily.dispose() — snapshots the map before iterating to prevent ConcurrentModificationErrorAtomHistory lint — replaced ! with as T casts on nullable type parameters to fix null_check_on_nullable_type_parameterMultiAtomBuilder equality — _listsEqual now handles lists of different lengths correctlyAsyncBuilder → AsyncAtomBuilder, wrong success: parameter name, and select() leak in build()devtools_extension/ from flutter analyze to prevent false failures from its unresolved dependenciesAtom.setDirect() — @protected method for cross-library access to bypass middlewareAtom.onDispose() removal — now returns a VoidCallback to unregister the callback; runs immediately if atom is already disposedflutter analyze and flutter test on push/PR to mainonDispose removal, AtomFamily auto-cleanup, atomicUpdate rollback, AsyncValue.hasValue for nullable types, persistAtom race conditions, throttle trailing edge, and more`WatchAtom` mixin — subscribe to atoms directly inside build() with no AtomBuilder wrapper; subscriptions are reconciled automatically after each fram
WatchAtom mixin — subscribe to atoms directly inside build() with no AtomBuilder wrapper; subscriptions are reconciled automatically after each frameAtomMiddleware — intercept and transform values on every set() call; supports global middleware (Atom.addMiddleware) and per-atom transformers via the middleware constructor parameterLoggingMiddleware — built-in middleware that logs every state change in debug mode at zero cost in release buildsatomicUpdate() — defers all listener notifications until every atom in the block has been updated; nested calls are fully supported via a depth counterAtomHistory<T> — wraps any Atom<T> with a bounded undo/redo stack backed by a fixed-capacity ring buffer; canUndo and canRedo exposed as Atom<bool> for reactive UIpersistAtom() — creates an atom whose value is automatically saved to and restored from any AtomStorage backendAtomStorage — storage abstraction with read / write / delete; implement for any key-value store (SharedPreferences, Hive, etc.)InMemoryAtomStorage — in-memory AtomStorage implementation for testsequals on AtomSelector — prevents rebuilds when a custom equality function says the selected value has not changedAtomBuilder builder signature now includes an optional child parameter: Widget Function(BuildContext, T, Widget?) — allows passing a static sub-tree that is not rebuilt on atom changesAsyncAtomBuilder is now the single async widget — AsyncBuilder has been removed; providing operation enables both pull-to-refresh and a retry button with no extra flagsselect() extension now returns Atom<S> (a derived atom) instead of a widgetatomicUpdate() replaces batchAtomUpdates — the old function has been removed_globalBatching replaced by _globalBatchDepth counter so nested atomicUpdate calls flush only when the outermost block exits_isBatching replaced by _batchDepth counter on Atom so nested batch() calls on the same atom flush only when the outermost call exits_notifyListeners now snapshots the listener set before iterating, preventing ConcurrentModificationError when a listener removes itself during notificationMultiAtomBuilder's atom list no longer register multiple listeners, preventing a listener leakselect() listener now wraps the selector call in a try-catch, consistent with map() and where()AtomConsumer — use AtomBuilder insteadAsyncBuilder — use AsyncAtomBuilder insteadbatchAtomUpdates — use atomicUpdate instead### Fixed - Fix material icons
DevTools Extension: Built-in Flutter DevTools extension with four feature panels:
AtomicFlutterDevToolsService — VM service extension layer for DevTools communicationAsyncAtomEvent and AsyncEventLog — ring buffer for async state transition recordingWidgetRebuildTracker — tracks AtomBuilder widget rebuild counts per atomAtom: debugDependencyIds, debugDependentIds, isComputed, listenerCountenableDebugMode() now automatically registers DevTools service extensions and enables performance monitoringenableDebugMode() now also enables AtomPerformanceMonitor and registers DevTools service extensionsdart:developer for service extensionsFixed memory leaks in all core extension methods (debounce, throttle, map, where, combine)
Critical Memory Leak Fixes:
debounce, throttle, map, where, combine)debounceAsync, mapAsync, chain, cached, asyncMap)StreamController not being disposed when atom is disposed in asStream()Type Safety & Error Prevention:
UnsupportedError when attempting to mutate via set() or update()computed() with clear error messagesRobustness & Error Handling:
Edge Cases & API Improvements:
combineAsync() now handles empty list input (returns success with empty list)chain() now propagates initial state correctly (idle/loading/error states)combine() now includes error handling for tuple creationcombineAsync() explaining behavior with empty listsAdd runImmediately option to effect for execution control
runImmediately option to effect for execution controlClean up whitespace in async widget and test files
Unused local variables in debug tests
### Fixed - Code linting issues
AsyncAtom: New async state management with AsyncValue wrapper
AsyncValue<T> wrapperidle, loading, success, and error statesdebounceAsync() - Debounced async operationsmapAsync() - Transform async valuesexecuteIfNotLoading() - Conditional executionexecuteWithRetry() - Retry failed operations with exponential backoffchain() - Chain async operationscached() - Create cached async operations with TTLtoAsync() - Convert regular atoms to async atomsasyncMap() - Create async atoms from regular atom changescomputedAsync() - Create debounced computed async atomscombineAsync() - Combine multiple async atomsAtom class with improved async support### Changed - Update readme
effect function listener removal
effect function listener removalUpdate example with complete setup for e-commerce app
computed function expectionCore Atom class for state management
Atom class for state managementcomputed function for derived stateAtomBuilder, MultiAtomBuilder, and AtomSelectoreffect, asStream, select, debounce, and throttleYour coding agent can read these notes before it upgrades. Set up the MCP server →