NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #4113 most downloaded on pub.dev
A reactive primitive and simple state managerment solution for dart and flutter
Last release 1 months ago
26 Aug 2026
Ships unpredictably
gaps range from 8 days to 1.4 years
Nearly every release is documented
notes for 20 of 20 stable releases
Nothing withdrawn
no release was ever pulled
2 years old
20 releases · first in 2024
fix orphan bug with derived subscriptions by @zupat in #202
Full Changelog: v3.1.1...v3.1.2
One column per month.
add asError getter to the AsyncValue base class and its AsyncError subsclass by @zupat in #196
Full Changelog: v3.1.0...v3.1.1
asError getter to the AsyncValue. This allows users to easily retrieve the AsyncError instance when the state is an error, or null otherwise.refactor: improve edge-case status check logic in DerivedSubscription by @zupat in #173
Full Changelog: v3.0.1...v3.1.0
[Feat] Add ProgressBeacon (Beacon.progress) with support for status tracking (ProgressStatus), manual control (start/stop/pause/resume), looping, and BeaconGroup integration.
[Refactor] Internal improvements for DerivedSubscription and DerivedBeacon status propagation.
refactor error handling in FutureBeacon to use pattern matching by @zupat in #169
Full Changelog: v3.0.0...v3.0.1
[Breaking] anyBeacon.next() now throws if the beacon is disposed while waiting for the next value. This is a breaking change because previously it wou…
[Breaking] anyBeacon.next() now throws if the beacon is disposed while waiting for the next value. This is a breaking change because previously it would complete with the current value if the beacon was disposed.
[Feat] Add anyBeacon.nextOrNull() method that returns null if the beacon is disposed while waiting for the next value.
Full Changelog: v2.0.3...v3.0.0
- [chore] Update repo links
fix- dirty status calculation in derived which behaved wrong when the value is nullable by @JinyuS in #164
Full Changelog: v2.0.2...v2.0.3
-[Fix] Nullable derived beacons didn't send notifications in some instances.
Create special class for subscriptions on derived beacons by @JinyuS in #159
Full Changelog: v2.0.0...v2.0.2
select,select2 and select3 methods to BeaconController which makes it easier to watch 1-3 beacons from a Controller.final (age, name) = myController.select2(context, (c) => (c.ageBeacon, c.nameBeacon));
final usernameField = TextEditingBeacon(text:'', group:B)
final usernameField = B.textEditing(text:'')
[Refactor] Internal efficiency refactor.
Remove synchronous subscriptions on DerivedBeacon: Only available for Writable and BufferedBeacons.
Remove synchronous subscriptions on DerivedBeacon: Only available for Writable and BufferedBeacons.
Chaining methods are now asynchronous: ie: map, filter, debounce, throttle, buffer, and bufferTime now operate asynchronously
Immutable chained beacons: The beacons returned from chaining methods are now immutable.
Stream access change: anyBeacon.toStream() is now anyBeacon.stream
Filter allowFirst parameter: The lazyBypass parameter in FilteredBeacon was replaced with allowFirst (set to false by default)
Debounce allowFirst parameter: Added allowFirst parameter to lazyDebounced and debounce chain method (set to false by default)
Full Changelog: https://github.com/jinyus/dart_beacon/blob/647fb0bdb664533fdefdfae106255652c6ad18b9/packages/state_beacon/CHANGELOG.md
[Breaking] anyBeacon.toStream() is now anyBeacon.stream
[Breaking] The lazyBypass parameter in .filter() chain method was replaced with allowFirst (set to false by default).
Previously, the first value sent to a lazy filtered beacon would not be filtered as lazyBypass was true by default. This caused confusion as most persons expect it to be filtered. The name of the parameter has been changed to allowFirst and it is set to false by default.
final count = Beacon.writable(0);
final gtThan10 = count.filter((prev,next) => next>10);
expect(gtThan10.peek(), 0); // first value was set immediately
final count = Beacon.writable(0);
final gtThan10 = count.filter((prev,next) => next>10);
expect(gtThan10.peek, throwsException) // no value has been set as yet
count.value = 20;
await gtThan10.next();
expect(d.peek(), 20) // value set after passing the filter
[Breaking] Added allowFirst parameter to lazyDebounced and .debounce() chain method (set to false by default)
Previously, the first value sent to a lazy debounced beacon would not be debounced. It is now debounced by default and you can allow the first value to go through by setting allowFirst to true.
final ms500 = Duration(milliseconds:500);
final count = Beacon.writable(0);
final d = count.debounce(ms500);
expect(d.peek(), 0); // first value was set immediately
final ms500 = Duration(milliseconds:500);
final count = Beacon.writable(0);
final d = count.debounce(ms500);
expect(d.peek, throwsException) // no value has been set as yet
await Future.delayed(ms500*2);
expect(d.peek(), 0) // value set after being debounced
[Breaking] synchronous parameter has been removed from the .subscribe() method. Synchronous subscriptions are only available for Writable and Buffered beacons through the .subscribeSynchronously() method.
[Breaking] Chaining methods are now asynchronous and return immutable beacons. ie: map, filter, debounce, throttle, buffer, and bufferTime.
These being writable complicated the codebase as writes had to be rerouted to the first mutable beacon in the chain. The alternative is to mutate the original beacon directly.
fix: defer synchronous subscription disposal to prevent RangeError by @JinyuS in #154
Full Changelog: v1.3.3...v1.3.4
Deprecate supportConditional parameter in effect methods by @JinyuS in #146
Full Changelog: v1.3.2...v1.3.3
force flag when those writes were added to the buffer.Fix method chaining for derived sources by @JinyuS in #142
[Fix] Chaining methods on derived beacons now eagerly fetches the value allowing it to be used instantly.
final count = Beacon.writable<int>(0);
final throttled = Beacon.derived(() => count.value * 2).throttle(k10ms);
expect(throttled.value, 0);
[Feat] Add queuing to FutureBeacon.updateWith() The updateWith method calls are now queued when there is an ongoing update. This ensures that all call
updateWith method calls are now queued when there is an ongoing update. This ensures that all calls are executed in the order they were made, preventing race conditions and inconsistent state.The updateWith method allows you to update a FutureBeacon's value with the provided callback. This differs from overrideWith because it updates the va
Future.updateWith()The updateWith method allows you to update a FutureBeacon's value with the provided callback. This differs from overrideWith because it updates the value only once, while overrideWith replaces the original callback supplied to the beacon.
Future<List<Todo>> loadTodos() async { ... }
Future<List<Todo>> addTodo(Todo newTodo) async {
await todoService.addTodo(newTodo);
final currentTodos = todosBeacon.lastData ?? [];
return [newTodo, ...currentTodos];
}
final todosBeacon = Beacon.future(() => loadTodos());
// Later, add a new todo without refetching all todos
await todosBeacon.updateWith(() => addTodo(newTodo));
// You can also provide an optimistic result
// which will be set immediately while the future is being resolved.
final optimisticTodos = [newTodo, ...todosBeacon.lastData ?? []];
await todosBeacon.updateWith(
() => addTodo(newTodo),
optimisticResult: optimisticTodos,
);
[Feat] Derived Beacons can now access their own value with '.peek()'. The beacon must have a value so a base case is required.
final counter = Beacon.writable(0);
late final ReadableBeacon<int> accumulated;
accumulated = Beacon.derived(() {
final count = counter.value;
if (count == 0) {
return 0; // base case
}
return accumulated.peek() + counter.value;
});
[Fix] Bug that caused some widgets to not rebuild when using go_router et al.
Bug Fix: Flutter edge-case for derivedBeacons. This was fixed before but the current fix is more efficient.
[Breaking] Extracted the flutter specific code into a separate package state_beacon_flutter
state_beacon_flutterYour coding agent can read these notes before it upgrades. Set up the MCP server →