flutter_solidart 1.5.0 flutter_solidart: ^1.5.0 copied to clipboard
A simple State Management solution for Flutter applications inspired by SolidJS
1.5.0 #
Changes from solidart #
- FEAT: Automatic disposal, see the docs here
1.4.3 #
Changes from solidart #
- BUGFIX: Fix the
update
method of aResource
that triggeredreportObserved
.
1.4.2 #
Update solidart version
1.4.1 #
Changes from solidart #
- BUGFIX: Fix the
updateValue
method of aSignal
that triggeredreportObserved
. (thanks to @9dan)
1.4.0 #
- CHORE: Rename
SolidProvider
intoProvider
. - REFACTOR: Remove
SolidSignal
in favor ofProvider
.
1.3.0 #
Changes from solidart #
-
FEAT: Add 3 new signals:
ListSignal
,SetSignal
andMapSignal
. Now you can easily be notified of every change of a list, set or map. Before:final list = Signal([1, 2]); // this doesn't work list.add(3); // instead you have to provide a new list instance list.value = [...list, 3];
Now:
final list = ListSignal([1, 2]); // this now works as expected list.add(3);
-
CHORE: Rename the
firstWhere
method of aReadSignal
intountil
-
CHORE: Rename the
firstWhereReady
method of aResource
intountilReady
-
CHORE: Rename the
update
method of aSignal
intoupdateValue
-
CHORE: Deprecate
createSignal
,createComputed
,createEffect
andcreateResource
1.2.0 #
- FEAT: Add the method
maybeGet()
to theSolid
widget to get a provider. If the provider can't be found, returnsnull
instead of throwing likeget()
does
1.1.0 #
Changes from solidart #
- BUGFIX: Fix a bug in the
Resource
where the stream subscription was not disposed correctly
1.0.0 #
The core of the library has been rewritten in order to support automatic dependency tracking like SolidJS.
-
The
Show
widget now takes a functions that returns abool
. You can easily convert any type tobool
, for example:final count = createSignal(0); @override Widget build(BuildContext context) { return Show( when: () => count() > 5, builder: (context) => const Text('Count is greater than 5'), fallback: (context) => const Text('Count is lower than 6'), ); }
-
Converting a
ValueNotifier
into aSignal
now uses theequals
comparator to keep the consistency. -
Rename
resource
parameter ofResourceWidgetBuilder
intoresourceState
. (thanks to @manuel-plavsic) -
FEAT Allow multiple providers of the same type by specifying an
id
entifier.Provider declaration: #
SolidProvider<NumberProvider>( create: () => const NumberProvider(1), id: 1, ), SolidProvider<NumberProvider>( create: () => const NumberProvider(10), id: 2, ),
Access a specific provider #
final numberProvider1 = context.get<NumberProvider>(1); final numberProvider2 = context.get<NumberProvider>(2);
-
BREAKING CHANGE Removed the
signals
map fromSolid
, now to provide signals to descendants useSolidSignal
inside providers:Before:
Solid( signals: { SignalId.themeMode: () => createSignal<ThemeMode>(ThemeMode.light), }, ),
Now:
Solid( providers: [ SolidSignal<Signal<ThemeMode>>(create: () => createSignal(ThemeMode.light)), ], ),
-
FEAT You can access a specific
Signal
without specifing anid
entifier, for example:// to get the signal context.get<Signal<ThemeMode>>(); // to observe the signal's value context.observe<ThemeMode>()
NOTICE: If you have multiple signals of the same type, you must specify a different
id
for each one. -
FEAT: Now you can get any instance of (any subclass of) the provider type.
-
FEAT: The
Solid
widget now acceps abuilder
method that provides a descendant context. -
CHORE: The
ResourceBuilder
no longer resolves the resource, because now theResource
knows when to resolve automatically.
Changes from solidart #
-
FEAT: Add automatic dependency tracking
-
BREAKING CHANGE: To create derived signals now you should use
createComputed
instead ofsignalName.select
This allows you to derive from many signals instead of only 1.Before:
final count = createSignal(0); final doubleCount = count.select((value) => value * 2);
Now:
final count = createSignal(0); final doubleCount = createComputed(() => count() * 2);
-
FEAT: The
createEffect
no longer needs asignals
array, it automatically track each signal.Before:
final effect = createEffect(() { print('The counter is now ${counter.value}'); }, signals: [counter]);
Now:
final disposeFn = createEffect((disposeFn) { print('The counter is now ${counter.value}'); })
-
BREAKING CHANGE: The
fireImmediately
field on effects has been removed. Now an effect runs immediately by default. -
FEAT: Add
observe
method onSignal
. Use it to easily observe the previous and current value instead of creating an effect.final count = createSignal(0); final disposeFn = count.observe((previousValue, value) { print('The counter changed from $previousValue to $value'); }, fireImmediately: true);
-
FEAT: Add
firstWhere
method onSignal
. It returns a future that completes when the condition evalutes to true and it returns the current signal value.final count = createSignal(0); // wait until the count is greater than 5 final value = await count.firstWhere((value) => value > 5);
-
FEAT: Add
firstWhereReady
method onResource
. Now you can wait until the resource is ready.final resource = createResource(..); final data = await resource.firstWhereReady();
-
FEAT: The
Resource
now acceptsResourceOptions
. You can customize thelazy
value of the resource (defaults to true), if you want your resource to resolve immediately. -
CHORE:
ResourceValue
has been renamed intoResourceState
. Now you can get the state of the resource with thestate
getter. -
CHORE: Move
refreshing
fromResourceWidgetBuilder
into theResourceState
. (thanks to @manuel-plavsic) -
FEAT: Add
hasPreviousValue
getter toReadSignal
. (thanks to @manuel-plavsic) -
FEAT Before, only the
fetcher
reacted to thesource
. Now also thestream
reacts to thesource
changes by subscribing again to the stream. In addition, thestream
parameter of the Resource has been changed fromStream
into aStream Function()
in order to be able to listen to a new stream if it changed. -
FEAT: Add the
select
method on theResource
class. Theselect
function allows filtering theResource
's data by reading only the properties that you care about. The advantage is that you keep handling the loading and error states. -
FEAT: Make the
Resource
to auto-resolve when accessing itsstate
. -
CHORE: The
refetch
method of aResource
has been renamed torefresh
. -
FEAT: You can decide whether to use
createSignal()
or directly theSignal()
constructor, now the're equivalent. The same applies to all the othercreate
functions.
1.0.0-dev903 #
- FEAT: The
Solid
widget now acceps abuilder
method that provides a descendant context. - CHORE: The
ResourceBuilder
no longer resolves the resource, because now theResource
knows when to resolve automatically.
Changes from solidart #
- FEAT: Add the select method on the Resource class. The select function allows filtering the Resource's data by reading only the properties that you care about. The advantage is that you keep handling the loading and error states.
- FEAT: Make the Resource to auto-resolve when accessing its state
1.0.0-dev902 #
- CHORE: Deprecate the value setter in the
Resource
in favor of the state setter
1.0.0-dev901 #
- FEAT: Now you can get any instance of (any subclass of) the provider type.
1.0.0-dev9 #
- FIX: A small fix of the
Solid
widget now allows to correctly retrieve aComputed
signal
Changes from solidart #
- CHORE:
createComputed
now returns aComputed
class instead of aReadSignal
.
1.0.0-dev8 #
-
FEAT Allow multiple providers of the same type by specifying an
id
entifier.Provider declaration: #
SolidProvider<NumberProvider>( create: () => const NumberProvider(1), id: 1, ), SolidProvider<NumberProvider>( create: () => const NumberProvider(10), id: 2, ),
Access a specific provider #
final numberProvider1 = context.get<NumberProvider>(1); final numberProvider2 = context.get<NumberProvider>(2);
-
BREAKING CHANGE Removed the
signals
map fromSolid
, now to provide signals to descendants useSolidSignal
inside providers:Before:
Solid( signals: { SignalId.themeMode: () => createSignal<ThemeMode>(ThemeMode.light), }, ),
Now:
Solid( providers: [ SolidSignal<Signal<ThemeMode>>(create: () => createSignal(ThemeMode.light)), ], ),
-
FEAT You can access a specific Signal without specifing an
id
entifier, for example:// to get the signal context.get<Signal<ThemeMode>>(); // to observe the signal's value context.observe<ThemeMode>()
NOTICE: If you have multiple signals of the same type, you must specify a different
id
for each one.
1.0.0-dev7 #
Changes from solidart #
- FEAT Before, only the
fetcher
reacted to thesource
. Now also thestream
reacts to thesource
changes by subscribing again to the stream. In addition, thestream
parameter of the Resource has been changed fromStream
into aStream Function()
in order to be able to listen to a new stream if it changed
1.0.0-dev6 #
Changes from solidart #
- BUGFIX Refactor the core of the library in order to fix issues with
previousValue
andhasPreviousValue
ofComputed
and simplify the logic.
1.0.0-dev5 #
- Rename
resource
parameter ofResourceWidgetBuilder
intoresourceState
. (thanks to @manuel-plavsic)
Changes from solidart #
- Move
refreshing
fromResourceWidgetBuilder
into theResourceState
. (thanks to @manuel-plavsic) - Add
hasPreviousValue
getter toReadSignal
. (thanks to @manuel-plavsic)
1.0.0-dev4 #
- Converting a
ValueNotifier
into aSignal
now uses theequals
comparator to keep the consistency.
Changes from solidart #
Deprecate value
getter in the Resource
. Use state
instead.
1.0.0-dev3 #
Add SolidSignalOptions
and SolidResourceOptions
for signals and resources provided through the Solid widget.
With this field you can customize the autoDispose
of each Solid signal individually. (Defaults to true).
Changes from solidart #
-
Rename
until
intofirstWhere
-
Rename
untilReady
intofirstWhereReady
-
FEAT: add
where
method toSignal
. It returns a newReadSignal
with the values filtered bycondition
. Use it to filter the value of another signal, e.g.:final loggedInUser = user.where((value) => value != null);
The initial value may be null because a
Signal
must always start with an initial value. The following values will always satisfy the condition. The returnedReadSignal
will automatically dispose when the parent signal disposes.
1.0.0-dev2 #
The Show
widget now takes a functions that returns a bool
.
You can easily convert any type to bool
, for example:
final count = createSignal(0);
@override
Widget build(BuildContext context) {
return Show(
when: () => count() > 5,
builder: (context) => const Text('Count is greater than 5'),
fallback: (context) => const Text('Count is lower than 6'),
);
}
1.0.0-dev1 #
This is a development preview of the 1.0.0 release of solidart. The core of the library has been rewritten in order to support automatic dependency tracking like SolidJS.
-
FEAT: Add automatic dependency tracking
-
BREAKING CHANGE: To create derived signals now you should use
createComputed
instead ofsignalName.select
This allows you to derive from many signals instead of only 1.Before:
final count = createSignal(0); final doubleCount = count.select((value) => value * 2);
Now:
final count = createSignal(0); final doubleCount = createComputed(() => count() * 2);
-
FEAT: The
createEffect
no longer needs asignals
array, it automatically track each signal.Before:
final effect = createEffect(() { print('The counter is now ${counter.value}'); }, signals: [counter]);
Now:
final disposeFn = createEffect((disposeFn) { print('The counter is now ${counter.value}'); })
-
BREAKING CHANGE: The
createEffect
method no longer returns anEffect
, you cannot pause or resume it anymore. Instead it returns aDispose
callback which you can call when you want to stop it. You can also dispose an effect from the inside of the callback. -
BREAKING CHANGE: The
fireImmediately
field on effects has been removed. Now an effect runs immediately by default. -
FEAT: Add
observe
method onSignal
. Use it to easily observe the previous and current value instead of creating an effect.final count = createSignal(0); final disposeFn = count.observe((previousValue, value) { print('The counter changed from $previousValue to $value'); }, fireImmediately: true);
-
FEAT: Add
until
method onSignal
. It returns a future that completes when the condition evalutes to true and it returns the current signal value.final count = createSignal(0); // wait until the count is greater than 5 final value = await count.until((value) => value > 5);
-
FEAT: Add
untilReady
method onResource
. Now you can wait until the resource is ready.final resource = createResource(..); final data = await resource.untilReady();
-
FEAT: The
Resource
now acceptsResourceOptions
. You can customize thelazy
value of the resource (defaults to true), if you want your resource to resolve immediately. -
CHORE:
ResourceValue
has been renamed intoResourceState
. Now you can get the state of the resource with thestate
getter. -
FEAT: Add
toValueNotifier()
extension toSignal
to easily convert it to aValueNotifier
. -
FEAT: Add
toSignal()
extension toValueNotifier
to easily convert it to aSignal
.
0.4.2 #
- BUGFIX: The
Show
widget now can work again with aReadSignal
.
0.4.1 #
- CHORE: The
ResourceBuilder
now correctly handles a differentResource
when the widget is updated.
0.4.0 #
- BUGFIX: Listening to the
source
of a Resource was not stopped when thesource
disposed. - BUGFIX: A
Resource
would not perform the asynchronous operation until someone called thefetch
method, typically theResourceBuilder
widget. This did not apply to thestream
which was listened to when the resource was created. Now the behaviour has been merged and thefetch
method has been renamed intoresolve
. - CHORE: Renamed
ReadableSignal
intoReadSignal
. - CHORE: Renamed the
readable
method of aSignal
intotoReadSignal()
0.3.3 #
-
Add
update
extension onBuildContext
. It's a convenience method to update aSignal
value.You can use it to update a signal value, e.g:
context.update<int>('counter', (value) => value * 2);
This is equal to:
// retrieve the signal final signal = context.get<Signal<int>>('counter'); // update the signal signal.update((value) => value * 2);
but shorter when you don't need the signal for anything else.
0.3.2 #
- Add assert to resource
fetch
method to prevent multiple fetches of the same resource. - Fix
ResourceBuilder
that fetched the resource every time even if the resource was already resolved.
0.3.1 #
- The
select
method of a signal now can take a customoptions
parameter to customize its behaviour. - Fixed an invalid assert in the
ResourceBuilder
widget that happens for resources without a fetcher.
0.3.0 #
-
Now Solid can deal also with
SolidProviders
. You no longer need an external dependency injector library. I decided to put some boundaries and stop suggesting any external dependency injector library. This choice is due to the fact that external libraries in turn provide state management and the user is more likely to mistakenly use solidart. I simplified the usage of InheritedWidgets with a very nice API:Declare providers #
Solid( providers: [ SolidProvider<NameProvider>( create: () => const NameProvider('Ale'), // the dispose method is fired when the [Solid] widget above is removed from the widget tree. dispose: (provider) => provider.dispose(), ), SolidProvider<NumberProvider>( create: () => const NumberProvider(1), // Do not create the provider lazily, but immediately lazy: false, ), ], child: const SomeChildThatNeedsProviders(), )
Retrieve providers #
final nameProvider = context.get<NameProvider>(); final numberProvider = context.get<NumberProvider>();
Provide providers to modals (dialogs, bottomsheets) #
return showDialog( context: context, builder: (dialogContext) => Solid.value( // pass a context that has access to providers context: context, // pass the list of provider [Type]s providerTypes: const [NameProvider], child: Dialog( child: Builder(builder: (innerContext) { // retrieve the provider with the innerContext final nameProvider = innerContext.get<NameProvider>(); return SizedBox.square( dimension: 100, child: Center( child: Text('name: ${nameProvider.name}'), ), ); }), ), ), );
You cannot provide multiple providers of the same type in the same Solid widget.
0.2.2 #
createResource
now accepts astream
and can be used to wrap a Stream and correctly handle its state.
0.2.1 #
- Get a signal value with
signalName()
.
0.2.0+1 #
- Add documentation link inside the pubspec
0.2.0 #
- Documentation improvements
- Refactor Resource, now the
createResource
method takes only 1 generic, the type of the future result.// before final resource = createResource<SourceValueType, FetcherValueType>(fetcher: fetcher, source: source); // now final resource = createResource<FetcherValueType>(fetcher: fetcher, source: source); // the FetcherValueType can be inferred by Dart >=2.18.0, so you can omit it
0.1.4 #
- Add official documentation link
- Fix typo in fireImmediately argument name
0.1.3 #
- Now
Solid.value
takes a list of [signalIds] and a [BuildContext]. You don't need anymore to get the signal first and pass it toSolid.value
. - Set the minimum Dart SDK version to
2.18
.
0.1.2+1 #
- Update Readme
0.1.2 #
- Add code coverage
0.1.1 #
- Implement Solid.value to be able to pass Signals to modals
0.1.0+4 #
- Add links to examples
0.1.0+3 #
- Specify the type of resource to the ResourceBuilder
0.1.0+2 #
- Decrease minimum Dart version to 2.17.0
0.1.0+1 #
- Fix home page link
0.1.0 #
- Initial version