live_cells_core 0.24.1 live_cells_core: ^0.24.1 copied to clipboard
Provides the core of live cells: A replacement for ChangeNotifier and ValueNotifier that is easier to use and more flexible
0.24.1 #
New features:
-
reset
parameter inMutableCell
constructor.This allows the value of a shared state mutable cell to be reset to the initial value when a new cell is created.
Example:
final myKey = MyKey(); final a = MutableCell(1, key: myKey); ValueCell.watch(() { print(a.value); }); // Prints 1 // Create a new shared state cell and reset the value of all // cells with key 'myKey' to 2 final b = MutableCell(2, key: myKey, reset: true ); print(a.value); // Prints 2 print(b.value); // Prints 2
-
.mutableCell
property for quickly creating a mutable cell initialized to a given value.Example:
// Create mutable cell with an initial value of 1 final a = 1.mutableCell; print(a.value); // 1 a.value = 2 print(a.value); // 2
0.24.0 #
New features:
-
.transform<...>()
for casting a cell's value typeExample:
ValueCell<Base> base = ...; final derived = base.transform<Derived>();
Bug fixes:
- Fix edge case bug in
mutableApply
.
0.23.5 #
- Fix issue with return type of
MutableCell.notNull
extension method
0.23.4 #
New features:
.notNull
extension method onMutableCell
0.23.3 #
- Fix issue with dependency tracking in mutable computed cells.
0.23.2 #
Debugging Improvements:
- Exceptions held in a
Maybe
are now rethrown with the stack trace of the exception, when theMaybe
is unwrapped withMaybe.unwrap
.
0.23.1 #
- Fixed bug with automatic watch function key generation.
0.23.0 #
New features:
-
Watch function keys.
Watch functions can now be identified by keys, like cells, provided in the
ValueCell.watch
andWatch
constructor.final w1 = ValueCell.watch(() { ... }, key: 'key1'); final w2 = ValueCell.watch(() { ... }, key: 'key2'); w1 == w2; // true // Stops both w1 and w2 since they have the same keys w1.stop();
0.22.0 #
New Features:
-
Watch
Registers a watch function that has access to its own handle.
This can be used to 1) stop a watch function directly from within the watch function and 2) prevent code from running on the first call of the watch function.
final watch = Watch((state) { final value = a(); state.afterInit(); // The following is only run after the first call print('A = $value'); if (value > 10) { state.stop(); } });
0.21.1 #
- Fix bug in
AsyncState
comparison.
0.21.0 #
New features:
-
.asyncState
for creating a cell that evaluates to the state of a cell holding aFuture
..asyncState
evaluates to anAsyncState
which is a sealed union of:AsyncStateLoading
AsyncStateData
AsyncStateError
Changes:
-
Convert
Maybe
to a sealed union of:MaybeValue
MaybeError
This change does not break existing code.
0.20.4 #
-
Fixed bug with deferred cell initialization not happening in
MetaCell
:Sometimes a cell was not initialized when it is injected in a
MetaCell
. This update ensures, that every every cell injected in aMetaCell
is properly initialized.
0.20.3 #
- Fixed bug in
.coalesce()
: If coalesce value cell throws an exception it is propagated regardless of whether the cell, on which the method is called, is null or not.
0.20.2 #
- Improvements to cell updating algorithm.
- Fixed bug in
awaited
cells.
0.20.1 #
New features:
MutableMetaCell
andActionMetaCell
, which allowMutableCell
s to have their values set, andActionCell
s to be triggered fromMetaCell
s.
Minor changes:
- The
.chain(...)
method can now be called onValueCell<void>
. Previously it could only be called on anActionCell
.
0.20.0 #
New features:
-
SelfCell
A computed cell which can access it's own value via the
self
argument:final increment = ActionCell(); final cell = SelfCell((self) { increment.observe(); return self() + 1; });
-
Action cell chaining with
.chain(...)
.chain(...)
creates an action cell that calls a user provided function when triggered. This function can decide whether to trigger the chained action or not. -
Null checking utilities:
-
.notNull
Returns a cell with a value guaranteed to be non-null. If the value of the cell, on which the property is used, is
null
, aNullCellError
exception is thrown. -
.coalesce(...)
Returns a cell that replaces null values in the cell, on which the method is used, with the value of another cell.
-
0.19.0 #
New features:
-
Effect Cells
These can be created with
.effect()
on an action cell (ValueCell<void>
). An effect cell is guaranteed to only be run once per trigger of the action cell on which the.effect()
method is called. This is useful for running side effects, while still being able to observe the result of the effect as a cell.Example:
final result = action.effect(() async { return await submitForm(); });
Breaking Changes:
-
Async cells created with
.wait
,.waitLast
,.awaited
now throw anPendingAsyncValueError
instead ofUninitializedCellError
when the cell value is referenced while the future is pending.This does not affect code which uses
.initialValue
to handle these errors.
Other Changes:
-
Computed cells no longer run the computation function on initialization. Instead the first run of the computation function is deferred to the first time the cell value is referenced.
NOTE: This changes slightly the semantics of computed cells, especially dynamic computed cells which are now dormant until their value is referenced at least once.
-
Clarify semantics of
ValueCell.none
:If a
null
default value is given andValueCell.none
is used during the computation of the initial value of a cell,UninitializedCellError
is thrown.
0.18.4 #
- Allow setting cell values in watch functions.
0.18.3 #
-
Add
.whenReady
property onMetaCell
s.This property creates a cell that evaluates to
ValueCell.none
while the meta cell is empty. -
Add
MetaCell.inject
method as an alias forMetaCell.setCell
. -
Allow watch functions to be terminated using
ValueCell.none()
like compute functions.
0.18.2 #
- Add
.withDefault()
and.onTrigger
methods for handlingEmptyMetaCellError
.
0.18.1 #
- Add
key
argument toActionCell
constructor.
0.18.0 #
New features:
-
Meta Cells
A meta cell (
MetaCell
) is a cell that points to another cell. The value of a meta cell is the value of the pointed to cell, and its observers are notified when the pointed to cell's value changes.The pointed to cell can be changed multiple times.
Example:
final a = MutableCell(0); final b = MutableCell(1); final meta = MetaCell<int>(); meta.setCell(a); print(meta.value); // 0 meta.setCell(b); print(meta.value); // 1
-
The
.hold()
method for keeping a cell active until it is released with.release()
final a = MutableCell(0, key: aKey); // Ensure that a is active final hold = a.hold(); ... // Allow a to be disposed hold.release();
Breaking Changes:
-
Removed
dispose()
method fromMutableCell
interface. -
Reading/writing the value of a keyed
MutableCell
while it is inactive now throws anInactivePersistentStatefulCellError
.Use
.hold()
to ensure a keyedMutableCell
is active before using it.
0.17.0 #
New features:
- Functionality for automatically generating cell keys, using
AutoKey
. - Mutable cells can now have keys.
0.16.1 #
- Add exception handling in initial call to cell watch functions.
- Improve unhandled exception notices.
0.16.0 #
New features:
-
and()
,or()
andnot()
now return keyed cells. -
The following methods for waiting for changes in cell values:
.nextChange()
.untilValue()
.untilTrue()
.untilFalse()
-
ActionCell
A cell without a value, used solely to represent actions and events.
0.15.1 #
- Fix issue with
.isCompleted
having incorrect value whenFuture
completes with an error.
0.15.0 #
New features:
-
.awaited
property on cells holding aFuture
.Returns a cell which evaluates to the value of the
Future
when completed, throws anUninitializedCellError
when it is pending. -
.isCompleted
property on cells holding aFuture
.Returns a cell which evaluates to
true
when theFuture
is complete,false
while it is pending. -
.initialValue(...)
which returns a cell with takes on the value of the given cell until it is initialized.
0.14.1 #
Minor additions:
.waitLast
property which is the same as.wait
but if a new Future is recevied before the previous one has resolved, the previous value update is dropped.
0.14.0 #
New features for asynchronous cells:
.wait
property for creating a cell thatawait
s aFuture
held in another cell..delayed
for creating a cell that takes the value of another cell but only notifies its observers after a given delay.
Breaking changes:
- Removed
DelayCell
.
0.13.0 #
.cell
extension property is now available on all types- Additions to
Iterable
cell extension:cast<E>()
methodmap()
method
- Additions to
List
cell extension:cast<E>()
methodmapCells()
method
0.12.3 #
- Fix potential issues when the computed value of a mutable computed cell is the same as its assigned value.
0.12.2 #
- Fix issue with recomputing the value of mutable computed cells.
0.12.1 #
- Reduce minimum version of
meta
dependency
0.12.0 #
New features:
-
Record extension methods for creating lightweight computed (and mutable computed) cells:
(a, b).apply((a,b) => a + b); (a, b).mutableApply((a,b) => a + b, (v) {...});
-
changesOnly
option in cell constructors. When this option is set to true, the cell only notifies its observers when its value has actually changed. -
Relaxed restriction that
MutableCellView
only accept a single argument -
Extensions which allow Iterable, List, Map and Set methods and properties to be used directly on cells:
ValueCell<List<int>> listCell; ValueCell<int> index; ... final elementI = listCell[index]; final length = listCell.length;
Breaking changes:
CellObserver.update
now takes a seconddidChange
parameter. This only affects code that uses theCellObserver
interface directly.DependentCell
,ComputeCell
andMutableCellView
now take an argumentSet
as opposed to anargument
List. This only affects code which instantiates these classes directly.- Remove
CellListenableExtension
. This will be moved to thelive_cell_widgets
package.
Other changes:
- Removed dependency on Flutter. This package can now be used in pure Dart applications.
- Deprecated
ListComputeExtension
, i.e.[a, b].computeCell(...)
. Use the record compute extensions instead.
0.11.0 #
- Core live cell definitions extracted from
live_cells
package to this package.