live_cells 0.32.0
live_cells: ^0.32.0 copied to clipboard
A replacement for ChangeNotifier and ValueNotifier that is easier to use and more flexible
0.32.0 #
-
New Widgets:
LiveRadioGroupLiveTextFormField
-
Changes
- Upgraded minimum Flutter version to 3.35.0.
0.31.0 #
New features:
-
New extension methods on cells holding Lists:
add- Adds an item to the end of the listinsert- Inserts an item at a given index
-
mapIndexedextension method on cells holdingIterables.
Changes:
intldependency upgraded to 0.20.2 for compatibility with new Flutter versions.
0.30.0 #
0.29.0 #
New Features #
-
Live widget wrappers now provide every constructor that is provided by the wrapped Flutter widgets.
For example, the
LiveFilledButtonwidget, which is a wrapper over Flutter'sFilledButtonnow also provides the.iconand.tonalconstructors in addition to the default constructor:LiveFilledButton.icon( icon: Icon(...), label: Text(...), press: pressActionCell )
Breaking Changes #
-
Removed
StaticWidgetReason: Doesn't interact well with inherited widgets
Replacement:
CellWidget -
Removed
CellHooksmixinReason:: It's obsolete since cells can be defined directly in the build method of a
CellWidgetReplacement: Define cells and watch functions directly in the build method/function of a
CellWidget -
Removed
bindmethods provided by Live widgetsReason: There are few use cases for it and it is difficult to implement for widgets that provide multiple constructors
Replacement: Create a new widget constructor
-
Live button widgets (
LiveFilledButton,LiveElevatedButton, etc.) now takeActionCells for thepressandlongPressarguments instead ofMetaCell<void>.Reason: This makes the button widgets easier to use
-
Renamed
InactiveMetaCelLErrortoInactiveMetaCellError. -
Minimum required Flutter version is now 3.29.3
0.28.1 #
- Fix issue with widgets not updating if triggered by cell changes during build phase.
0.28.0 #
New features:
-
CellExtensionnow also generates comparator and hash functions for an annotated class:@CellExtension() class Point { final int x; final int y; ... @override bool operator ==(Object other) => _$PointEquals(this, other); @override int get hashCode => _$PointHashCode(this); }Additionally the
DataClassannotation can be used to generate comparator and hash functions for a class without generating a cell extension.
Breaking Changes:
- The live_cells_ui library now requires at least Flutter 32.29.2
0.27.0 #
Breaking Changes:
- Remove deprecated
live_cell_widgetslibrary
New features:
-
.exception()method for creating a cell that throws the exception held in its value:final e = MutableCell(Exception('An exception!')); final exceptionCell = e.exception(); // Throws Exception('An exception!') e(); -
Mutable variants of
.contains()and.containsAll()extension methods.contains()and.containsAll()now return mutable cells when called on mutable cells containing sets.When the value of the
contains(...)cell is set to true the item is added to the set, and when set to false the item is removed from the set:final set = MutableCell({1, 2, 3, 4}); // contains1 is now a MutableCell final contains1 = set.contains(1.cell); // Setting its value to false removes 1 from [set]. contains1.value = false; print(contains1.value); // Prints 2, 3, 4 // Setting its value to true adds the element to the [set]. contains1.value = true; print(contains1.value); // Prints 1, 2, 3, 4Similarly when the value of the
.containsAllcell is set, the items in the iterable passed to it are added/removed from the set. -
.removeAt()method on cells holding lists:final l = MutableCell([1, 2, 3, 4]); // Remove the element at index 2 l.removeAt(2); print(l.value); // Prints 1, 2, 4 l.removeAt(0); print(l.value); // 2, 4 -
UniqueCellKey, which can be used as a cell key to specify that a cell is not functionally equivalent to any other cell.This is useful to prevent a cell from being assigned a key contexts, such as within the build method of a
CellWidget, where a key is automatically assigned to a cell if it isn't explicitly provided during the construction of the cell.
0.26.0 #
New features:
-
New
formatargument onmutableString()extension methods.Example:
final germanFormat = NumberFormat("#,##0.00", "de_DE"); final a = MutableCell(1.0); final strA = a.mutableString(format: germanFormat); a.value = 2.5; print(strA.value); // 2,50 strA.value = '12,30'; print(a.value); // 12.3
0.25.4 #
New features:
-
coalesceextension method onMutableCells.When
coalesceis called on aMutableCell, aMutableCellis now returned. This allows assigning the value of the cell on which the method is called via the cell returned bycoalesce.Example:
final a = MutableCell<int?>(null); final b = MutableCell(-1); // c is a MutableCell final c = a.coalesce(b); ValueCell.watch(() { print('A = ${a()}'); }); ValueCell.watch(() { print('C = ${c()}'); }); b.value = 1; // Prints 'A = 1' and 'C = 1' // Assigning value of 'c' assigns value of 'a' c.value = 2; // Prints 'A = 2' and 'C = 2' // Doesn't print anything since the value of 'a' is not null b.value = 3;
0.25.3 #
- Fix issue with cell state restoration in widgets.
0.25.2 #
Update examples in readme.
0.25.1 #
Add missing Changelog entry for 0.25.0.
0.25.0 #
Breaking changes:
-
The minimum Flutter version has been increased to 3.24.3.
-
The
live_cells_widgetslibrary is deprecated. Use thelive_cells_uilibrary. -
The
live_cells_uilibrary provides the same functionality aslive_cells_widgetswith the following differences:-
The widgets are prefixed with
Liveinstead ofCell, e.g.LiveTextFieldfromlive_cells_uiis the equivalent toCellTextFieldfromlive_cell_widgets -
Only those properties which represent user input are cells, the rest are regular values. For example in
LiveSwitchonly thevalueandenabledproperties are cells. -
live_cells_uidoes not provide wrappers for widgets which do not take input from the user, for example there is noLiveTextequivalent toCellText. Wrap a regularTextwidget in aCellWidget.builderor aCellWidgetsubclass for reactivity.
-
0.24.1 #
New features:
-
resetparameter inMutableCellconstructor.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
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.
Other changes:
- Update widget wrappers to Flutter 3.24.3
0.23.6 #
- Fix issue with return type of
MutableCell.notNullextension method
0.23.5 #
New features:
.notNullextension method onMutableCell
0.23.4 #
- Fix issue with mutable computed cell dependency tracking.
0.23.3 #
- Update homepage URL
0.23.2 #
Debugging Improvements:
- Exceptions held in a
Maybeare now rethrown with the stack trace of the exception, when theMaybeis unwrapped withMaybe.unwrap.
0.23.1 #
New widgets:
CellCheckboxMenuButtonCellCheckboxThemeCellChipThemeCellColoredBoxCellColoredFilterCellCheckedPopupMenuItemCellChoiceChipCellCloseButtonCellContraintsTransformBox
0.23.0 #
New features:
-
Watch function keys.
Watch functions can now be identified by keys, like cells, provided in the
ValueCell.watchandWatchconstructor.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(); -
Watch functions can now be defined directly in the build method of a
CellWidgetwithoutCellHooks:CellWidget.builder((_) { final cell = MutableCell(...); ValueCell.watch(() { final c = cell(); ... }) ... });
Breaking Changes:
ValueCell.observeno longer returns the value of the cell. Additionally, this eliminates the need to catch exceptions originating from the cell when the caller is only interested in being notified when the value of the cell changes, but is not interested in the actual value.
0.22.1 #
New widgets:
-
CellPageViewA
PageViewwith the current page controlled by apagecell:final page = MutableCell(0); return CellPageView( page: page, animate: true.cell duration: Duration(milliseconds: 100).cell, curves: Curves.easeIn.cell children: [ Page1(), Page2(), ... ].cell );The current page can be changed by setting the
pagecell.page.value = 2;The current page can also be observed by observing the same
pagecell.
0.22.0 #
New Features:
-
WatchRegisters 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
AsyncStatecomparison.
0.21.0 #
New features:
-
.asyncStatefor creating a cell that evaluates to the state of a cell holding aFuture..asyncStateevaluates to anAsyncStatewhich is a sealed union of:AsyncStateLoadingAsyncStateDataAsyncStateError
Changes:
-
Convert
Maybeto a sealed union of:MaybeValueMaybeError
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 aMetaCellis 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
awaitedcells.
0.20.1 #
New features:
MutableMetaCellandActionMetaCell, which allowMutableCells to have their values set, andActionCells to be triggered fromMetaCells.
Minor changes:
- The
.chain(...)method can now be called onValueCell<void>. Previously it could only be called on anActionCell.
0.20.0 #
New features:
-
SelfCellA computed cell which can access it's own value via the
selfargument: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:
-
.notNullReturns a cell with a value guaranteed to be non-null. If the value of the cell, on which the property is used, is
null, aNullCellErrorexception 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.
-
New widgets:
CellBannerCellBlockSemanticsCellVisibility
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(); }); -
Combining Action Cells:
Multiple action cells can now be combined into a single cell, which notifies its observers, whenever any of the actions trigger, using
List.combinedExample:
final a1 = ActionCell(); final a2 = ActionCell(); final all = [a1, a2].combined;
Breaking Changes:
-
Async cells created with
.wait,.waitLast,.awaitednow throw anPendingAsyncValueErrorinstead ofUninitializedCellErrorwhen the cell value is referenced while the future is pending.This does not affect code which uses
.initialValueto handle these errors. -
Renamed
onPressedandonLongPressof cell Material buttons topressandlongPress, respectively.The purpose of this change, is to later allow callback based event handlers to be added using
onPressedandonLongPress
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
nulldefault value is given andValueCell.noneis used during the computation of the initial value of a cell,UninitializedCellErroris thrown. -
Bug fix: Unhandled exceptions in a
ValueCell.watchno longer propagate out of the watch function.
0.18.4 #
- Improve action cell example.
0.18.3 #
- Add example of action cells to example project.
0.18.2 #
- Allow setting cell values in watch functions.
0.18.1 #
Additions from core:
-
Add
.whenReadyproperty onMetaCells.This property creates a cell that evaluates to
ValueCell.nonewhile the meta cell is empty. -
Add
MetaCell.injectmethod as an alias forMetaCell.setCell. -
Allow watch functions to be terminated using
ValueCell.none()like compute functions.
0.18.0 #
New features from core:
-
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 -
A
.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();
New widgets:
CellElevatedButtonCellFilledButtonCellOutlinedButtonCellTextButton
Breaking Changes:
-
Removed
dispose()method fromMutableCellinterface. -
Reading/writing the value of a keyed
MutableCellwhile it is inactive now throws anInactivePersistentStatefulCellError.Use
.hold()to ensure a keyedMutableCellis active before using it.
0.17.0 #
New features:
-
Automatic key generation for unkeyed cells defined in the
buildmethod ofCellWidgetandCellWidget.builder.This allows cells local to a
CellWidgetto be defined directly in the build method/function without having to use.cell(() => ...)With version 0.4.0:
class Example extends CellWidget with CellInitializer { @override Widget build(BuildContext context) { final count = cell(() => MutableCell(0)); ... } }This can now be simplified to the following with version 0.5.0:
class Example extends CellWidget { @override Widget build(BuildContext context) { final count = MutableCell(0); ... } }
Breaking Changes:
-
CellInitializerhas been renamed toCellHooks -
.cell()and.watch()have been moved fromBuildContexttoCellHookContext.This will not affect code that uses
CellWidget.builder. -
State restoration options have been removed from
.cell(). Use.restore()instead.
0.16.2 #
Changes from core:
- Add exception handling to initial cell watch function calls.
- Improve unhandled exception notices.
0.16.1 #
- Fix typos in Changelog.
0.16.0 #
New features from core:
-
and(),or()andnot()now return keyed cells. -
The following methods for waiting for changes in cell values:
.nextChange().untilValue().untilTrue().untilFalse()
-
ActionCellA cell without a value, used solely to represent actions and events.
New widgets:
CellAbsorbPointerCellAnimatedCrossFadeCellAnimatedFractionallySizedBoxCellAnimatedPositionedDirectionalCellAnimatedRotationCellAnimatedScaleCellAnimatedSlideCellAnimatedSwitcherCellAnnotatedRegion
Other changes:
- Removed deprecated
computeCellandcomputeWidgetextension methods onList - Removed deprecated
RestorableCellWidget
0.15.1 #
- Fix issue with
.isCompletedhaving incorrect value whenFuturecompletes with an error.
0.15.0 #
New features from core:
-
.awaitedproperty on cells holding aFuture.Returns a cell which evaluates to the value of the
Futurewhen completed, throws anUninitializedCellErrorwhen it is pending. -
.isCompletedproperty on cells holding aFuture.Returns a cell which evaluates to
truewhen theFutureis complete,falsewhile it is pending. -
.initialValue(...)which returns a cell with takes on the value of the given cell until it is initialized.
0.14.2 #
- Fix async examples in README.
0.14.1 #
Minor additions from core:
.waitLastproperty which is the same as.waitbut if a new Future is received before the previous one has completed, the previous future is dropped.
0.14.0 #
New features for asynchronous cells:
.waitproperty for creating a cell thatawaits aFutureheld in another cell..delayedfor 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 #
-
.cellextension property is now available on all types -
Additions to
Iterablecell extension:cast<E>()methodmap()method
-
Additions to
Listcell extension:cast<E>()methodmapCells()method
-
Improvements to
CellWidget:- Unused dependencies are untracked.
- Widget properties can now be bound to different cells between builds.
0.12.1 #
- Increase live_cells_core dependency version to 0.12.3
- Increase live_cell_widgets dependency version to 0.2.2
0.12.0 #
New features in core:
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) {...}); -
changesOnlyoption 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
MutableCellViewonly accept a single argument -
Extensions which allow Iterable, List, Map and Set methods and properties to be used directly on cells:
New features in widgets library:
-
Simplified state restoration:
- No need to use
RestorableCellWidget - Add
restorationIddirectly onCellWidget/StaticWidget. - Added
.restore()method for cell state restoration inStaticWidget
- No need to use
-
New Widgets:
CellRowCellColumn
0.11.2 #
Bump live_cell_widgets dependency version to 0.1.1:
- Fix bug in StaticWidget.builder.
0.11.1 #
Move documentation to: https://alex-gutev.github.io/live_cells/docs/intro
0.11.0 #
This release divides the functionality of this package among component packages:
Additionally the full documentation is now available at: https://docs.page/alex-gutev/live_cells.
New Features:
- Wrapper classes for more widgets
.peekproperty for accessing the value of a cell without triggering a recomputation
Breaking Changes:
- Minimum SDK version increased to 3.0.0
- All properties of the widgets provided by
live_cell_widgetsare now cells
0.10.3 #
- Change
live_cell_annotationsversion to0.2.0.
0.10.2 #
- Fix bug: Handle exceptions thrown during computation of the initial values of cells.
0.10.1 #
- Move annotations into separate package: https://pub.flutter-io.cn/packages/live_cell_annotations.
0.10.0 #
New features:
- Keyed cells, cells with the same key reference a shared state.
- Lightweight mutable computed cells.
CellExtensionannotation for automatically generatingValueCellaccessors for classes, using thelive_cell_extensionpackage (which will be released soon).
This release also comes with major changes to the implementation. These changes are only breaking to
code which creates user-defined ValueCell subclasses:
- Removed the following internal implementation classes and mixins from the public API:
EqCellNeqCellNotifierCellCellEqualityCellListenersObserverCell
0.9.1 #
- Fixed bug with accessing previous cell values
0.9.0 #
New features:
- Constant
bool,null,EnumandDurationcells can now be created with thecellproperty, e.g.true.cell. - Utilities for working with cells holding a
Duration. CellObserverModelfor creating classes which observe one or more cells- Add
selectioncell parameter toCellTextFieldconstructor for observing and controlling the field's selection.
0.8.1 #
- Correct typos and errors in readme examples
0.8.0 #
New features:
- Ability to access the previous values of cells with
.previous - Ability to abort a cell value update with
ValueCell.none() and,or,notandselectmethods on bool cells- Exception handling using
onErroranderror - Clarified how exceptions are propagated between cells
0.7.0 #
New features:
ValueCell.watchandCellInitializer.watchfor calling a function whenever the values of cells change.- State restoration of cells with
RestorableCellWidget
0.6.1 #
- Fix potential issues
- Fix typos and improve README
0.6.0 #
New features:
Maybetype andMaybeCellfor error handlingerrorValueargument ofmutableStringmethod to control value in case of errors during parsing- Remove restriction that arguments of mutable computed cells be mutable cells
Breaking changes:
- Add
shouldNotifyAlwaysproperty toCellObserverinterface
Improvements and bug fixes:
- Simplify implementation of
CellInitializer.cell - Allow updated cell value to be accessed even when the cell has no observers
- Fix bug in
BuildContext.cellmethod - Fix bug in
CellTextField
0.5.2 #
- Fix potential issues
0.5.1 #
- Fix typos and bugs in examples in README
0.5.0 #
New features:
ValueCell.computedconstructor for creating computed cells with dynamic dependenciesMutableCell.computedconstructor for creating mutable computed cells with dynamic dependenciesCellWidgetcan now also track the cells it depends on at runtimemutableStringextension method onMutableCell's holding anint,double,numorstring
Breaking changes:
CellWidget.cellmethod has been moved toCellListenersmixinCellWidgetBuilderhas been removed in favour ofCellWidget.builderconstructor
Improvements:
- Simplified examples demonstrating core concepts only
- Simplified and streamlined API
- Improved README
- Bug fixes
0.4.1 #
- Bug fixes
0.4.0 #
- Simplify implementation of
CellWidget. Subclasses now overridebuildinstead ofbuildChild.
0.3.1 #
- Bug fixes
0.3.0 #
New features:
- Mutable computational cells
- Batch updates
CellWidgetbase class for creating widgets make use of cellsCellWidgetBuilderfor creatingCellWidget's without subclassing- New widgets in widgets library:
CellCheckboxCellCheckboxListTileCellRadioCellRadioListTileCellSliderCellSwitchCellSwitchListTile
- Shorthand
List.computeWidgetmethod for creating widgets which depend on multiple cells
Breaking changes:
MutableCellis now an interface with a factory constructorCellObserverinterface methods now take observed cell as arguments- Removed
CellBuilder
0.2.3 #
- Fix issue with
CellTextField
0.2.2 #
- Fix issue with List.computeCell method
- Fix issues with unit tests
0.2.1 #
- Fix issues with examples in README
0.2.0 #
New features:
- Stronger guarantees that a
StoreCellwill not hold an outdated value - Shorthand
.cellproperty for creating constant value cells - Shorthand
List.computeCellmethod for creating multi-argument computational cells - Arithmetic and comparison operator overloads to create computational cells directly using expressions such as
a + b
Breaking changes:
ValueCellis no longer aValueListenableValueCell.addListenerandValueCell.removeListenerare replaced withaddObserverandremoveObserver- New
CellObserverinterface for observing changes to the values of cells ValueCell.listenableproperty provided to useValueCellas aValueListenable
0.1.2 #
- Fix dart doc issues
0.1.1 #
- Fix package directory structure
0.1.0 #
- Initial release.