flutter_riverpod 2.0.0-dev.9
flutter_riverpod: ^2.0.0-dev.9 copied to clipboard
A simple way to access state from anywhere in your application while robust and testable.
2.0.0-dev.9 #
Fix Timer leak when using cacheTime/disposeDelay and disposing a ProviderContainer
2.0.0-dev.8 #
fix: a bug where unmounting a nested ProviderScope could cause an exception (#1400)
2.0.0-dev.7 #
- Upgrade minimum required Dart SDK version to 2.17.0
- Upgrade minimum required Flutter SDK version to 3.0.0
2.0.0-dev.6 #
- Added
WidgetRef.listenOncefor listening to providers in a widget outside ofbuild. - Added
AsyncValue.valueOrNullto obtain the value while ignoring potential errors. - Fixed an issue where
AsyncValue.valuedid not throw if there is an error. - Fix families not applying cacheTime/disposeDelay
- Fixed a bug where an exception may be thrown asynchronously after a
KeepAliveLinkis cancelled.
2.0.0-dev.5 #
- Fixed a bug where emitting an
AsyncDataafter anAsyncErrorleads toAsyncValue.hasErrorto be true
2.0.0-dev.4 #
-
Added
ProviderScope.parent, a property used for manually overriding a scope's parent. This is useful for allowing modals/dialogs to access scoped providers -
Added
ref.listenSelf, for subscribing to changes of a provider within that provider. That can be useful for logging purposes or storing the state of a provider in a DB. -
Added
disposeDelayto allautoDisposeproviders and toProviderContainer/ProviderScope. This configures the amount of time before a provider is disposed when it is not listened. -
Added
container.invalidate(provider)/ref.invalidate(provider)andref.invalidateSelf(). These are similar toref.refreshmethods, but do not immediately rebuild the provider.These methods are safer than
ref.refreshas they can avoid a provider rebuilding twice in a quick succession. -
The duration passed to
cacheTimenow represents the minimum amount of time after the latest change of a provider, instead of the first time a provider built. -
Fixed an issue where providers were incorrectly allowed to depend on themselves, breaking
autoDisposein the process. -
Fixed a memory leak when using
StateProvider.autoDispose's.state -
Fix
ProviderObserver.didDisposeProvidernot executing on provider refresh.
2.0.0-dev.3 #
When calling ref.listen on a provider, this provider will now properly
rebuild if one of its dependency had changed.
2.0.0-dev.2 #
-
Deprecated
ref.maintainState=in favor of a newly addedref.keepAlive(). This newref.keepAlive()function is similar tomaintainStatebut better handles cases where we have multiple logics that want to keep the state of a provider alive for some period of time. -
Removed the deprecated
ProviderReference. -
Added
ProviderContainer.cacheTimeandMyProvider.autoDispose(..., cacheTime: duration).cacheTimeis used to keep anautoDisposeprovider alive for at least a minimum amount of time before it gets disposed if not listened. -
Added
ref.onAddListener,ref.onRemoveListener,ref.onCancelandref.onResume. All of which allow performing side-effects when providers are listened or stop being listened.
2.0.0-dev.1 #
-
Now requires Dart 2.16
-
Breaking Providers no-longer throw a
ProviderExceptionif an exception was thrown while building their value.
Instead, they will rethrow the thrown exception and its stacktrace. -
Removed
AsyncValue'sisError/isData -
Added new functionalities to
AsyncValue:hasError,hasData,copyWithPrevious -
Added
provider.selectAsync, which allows to both await an async value while also filtering rebuilds. -
When a provider emits an
AsyncErrorfollowed by anAsyncData, theAsyncDataemitted will now contain the latest error/stackTrace too. -
Fixed a cast error when overriding a provider with a more specific provider type (#1100)
-
Fixed a bug where
onDisposelisteners could be executed twice under certain conditions when usingautoDispose.
2.0.0-dev.0 #
-
Breaking After a provider has emitted an
AsyncValue.dataorAsyncValue.error, that provider will no longer emit anAsyncValue.loading.
Instead, it will re-emit the latest value, but with the propertyAsyncValue.isRefreshingto true.This allows the UI to keep showing the previous data/error when a provider is being refreshed.
-
Adding
isLoading,isError,isDataandasErrortoAsyncValue. Those getters allow interacting withAsyncValuewithout having to rely on pattern matching. -
Fixed an issue where refreshing a
provider.future/provider.streamdid work properly -
Fixed false positive with
ref.watchasserts
1.0.3 #
Removed an assert preventing from overriding the same provider/family
multiple times on a ProviderScope/ProviderContainer.
1.0.2 #
Fixed a null exception on web
1.0.1 #
Improved the performance of the assert which verifies that providers properly
respect their dependencies variable.
1.0.0 #
Riverpod is now stable!
General changes #
-
Breaking:
ProviderContainer.debugProviderValuesandProviderContainer.debugProviderElementsare removed. You can now instead useProviderContainer.getAllProviderElements. -
ChangeNotifierProvidernow supports nullableChangeNotifier(#856) -
Increased minimum SDK version to 2.14.0
-
Breaking The return value when reading a
StateProviderchanged. Before, doingref.read(someStateProvider)would return theStateControllerinstance.
Now, this will only return the state of theStateController.
This new behaviour matchesStateNotifierProvider.For a simple migration, the old behavior is available by writing
ref.read(someStateProvider.state). -
Added
ref.listenfor triggering actions inside providers/widgets when a provider changes.It can be used to listen to another provider without recreating the provider state:
final counterProvider = StateNotifierProvider<Counter, int>(...); final anotherProvider = Provider<T>((ref) { ref.listen<int>(counterProvider, (previous, count) { print('counter changed from $previous to $count'); }); });Alternatively, it can be used by widgets to show modals/dialogs:
final counterProvider = StateNotifierProvider<Counter, int>(...); class Example extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { ref.listen<int>(counterProvider, (previous, count) { showDialog(...); }); } } -
ProviderListeneris deprecated in favor ofref.listen. -
It is now possible to "await" all providers that emit an
AsyncValue(previously limited toFutureProvider/StreamProvider). This includes cases where aStateNotifierProviderexposes anAsyncValue:class MyAsyncStateNotifier extends StateNotifier<AsyncValue<MyState>> { MyAsyncStateNotifier(): super(AsyncValue.loading()) { // TODO fetch some data and update the state when it is obtained } } final myAsyncStateNotifierProvider = StateNotifierProvider<MyAsyncStateNotifier, AsyncValue<MyState>>((ref) { return MyAsyncStateNotifier(); }); final someFutureProvider = FutureProvider((ref) async { MyState myState = await ref.watch(myAsyncStateNotifierProvider.future); }); -
Deprecated
StreamProvider.lastin favor ofStreamProvider.future. -
StreamProvider.future,StreamProvider.streamandFutureProvider.futurenow expose a future/stream that is independent from how many times the associated provider "rebuilt":- if a
StreamProviderrebuild before its stream emitted any value,StreamProvider.futurewill resolve with the first value of the new stream instead. - if a
FutureProviderrebuild before its future completes,FutureProvider.futurewill resolve with the result of the new future instead.
- if a
-
You can now override any provider with any other provider, as long as the value that they expose matches. For example, it is possible to override a
StreamProvider<Model>with aProvider<AsyncValue<Model>>. -
ref.onDisposenow calls the dispose function as soon as one of the provider's dependency is known to have changed -
Providers can now call
ref.refreshto refresh a provider, instead of having to doref.container.refresh. -
Providers no longer wait until their next read to recompute their state if one of their dependency changed and they have listeners.
-
Added
ProviderContainer.pump, a utility to easily "await" until providers notify their listeners or are disposed. -
fixed an issue when using both
familyandautoDisposethat could lead to an inconsistent state
Unified the syntax for interacting with providers #
-
Breaking: The prototype of
ConsumerWidget'sbuildandConsumer'sbuilderchanged. Before:class Example extends ConsumerWidget { @override Widget build(BuildContext context, ScopedReader watch) { int count = watch(counterProvider); ... } }After:
class Example extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { int count = ref.watch(counterProvider); ... } } -
ProviderListeneris deprecated. Instead, useref.listen:class Example extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { ref.listen<int>(counter, (count) { print('count changed $count'); }); } } -
Added
ConsumerStatefulWidget+ConsumerState, a variant ofStatefulWidgets that have access to aWidgetRef. -
All "watch" functions now support
myProvider.select((value) => ...). This allows filtering rebuilds:final userProvider = StateNotifierProvider<UserController, User>(...); Consumer( builder: (context, ref, _) { // With this syntax, the Consumer will not rebuild if `userProvider` // emits a new User but its "name" didn't change. bool userName = ref.watch(userProvider.select((user) => user.name)); }, ) -
ProviderReferenceis deprecated in favor ofRef. -
Breaking:
ProviderObserver.didUpdateProvidernow receives both the previous and new value. -
Breaking:
ProviderObserver.mayHaveChangedis removed. -
Breaking:
Family.overrideWithProvidernow must create a provider:final family = Provider.family<State, Arg>(...); family.overrideWithProvider( (Arg arg) => Provider<State>((ref) => ...) ); -
All providers now receive a custom subclass of
ProviderRefBaseas a parameter:Provider<T>((ProviderRef<T> ref) {...}); FutureProvider<T>((FutureProviderRef<T> ref) {...}); StateProvider<T>((StateProviderRef<T> ref) {...});That allows providers to implement features that is not shared with other providers.
-
Provider,FutureProviderandStreamProvider'srefnow have astateproperty, which represents the currently exposed value. Modifying it will notify the listeners:Provider<int>((ref) { ref.listen(onIncrementProvider, (_) { ref.state++; }); return 0; }); -
StateProvider'srefnow has acontrollerproperty, which allows the provider to access theStateControllerexposed.
-
-
Breaking:
ProviderReference.mountedis removed. You can implement something similar usingonDispose:Provider<T>((ref) { var mounted = true; ref.onDispose(() => mounted = false); });
All providers can now be scoped. #
-
Breaking:
ScopedProvideris removed.
To migrate, changeScopedProviders toProviders. -
All providers now come with an extra named parameter called
dependencies. This parameter optionally allows defining the list of providers/families that this new provider depends on:final a = Provider(...); final b = Provider((ref) => ref.watch(a), dependencies: [a]);By doing so, this will tell Riverpod to automatically override
bifagets overridden.
Updated AsyncValue: #
-
Breaking
AsyncValue.copyWithis removed -
Breaking
AsyncValue.error(..., stacktrace)is now a named parameter instead of postional parameter. -
Deprecated
AsyncValue.datain favor ofAsyncValue.value -
Allowed
AsyncData,AsyncErrorandAsyncLoadingto be extended -
Added
AsyncValue.whenOrNull, similar towhenOrElsebut instead of an "orElse" parameter, returnsnull. -
Added
AsyncValue.value, which allows reading the value without handling loading/error states. -
AsyncErrorcan now be instantiated withconst. -
Added
StateController.update, to simplify updating the state from the previous state:final provider = StateController((ref) => 0); ... ref.read(provider).update((state) => state + 1); -
It is no longer allowed to use
ref.watchorref.readinside a selector:provider.select((value) => ref.watch(something)); // KO, cannot user ref.watch inside selectors -
FutureProvider now creates a
FutureOr<T>instead of aFuture<T>.
That allows bypassing the loading state in the event where a value was synchronously available.
Bug fixes #
- Fixed a bug where widgets were not rebuilding in release mode under certain conditions
- FIX: StreamProvider.last no longer throws a StateError when no value were emitted (#296).
- fixed an issue where when chaining providers, widgets may re-render a frame late, potentially causing a flicker. (see #648)
1.0.0-dev.11 #
Fixed an issue where dependencies did not work for ChangeNotifierProvider (#800)
1.0.0-dev.10 #
Fixed a bug where reading a provider within a consumer could throw (#796)
1.0.0-dev.9 #
Fix an issue where *Provider.autoDispose were not able to specify the
dependencies parameter.
1.0.0-dev.8 #
Future/StreamProvider #
-
FutureProvider now creates a
FutureOr<T>instead of aFuture<T>That allows bypassing the loading state in the event where a value was synchronously available. -
During loading and error states,
FutureProviderandStreamProvidernow expose the latest value throughAsyncValue.
That allows UI to show the previous data while some new data is loading, inatead of showing a spinner:final provider = FutureProvider<User>((ref) async { ref.watch(anotherProvider); // may cause `provider` to rebuild return fetchSomething(); }) ... Widget build(context, ref) { return ref.watch(provider).when( error: (err, stack, _) => Text('error'), data: (user) => Text('Hello ${user.name}'), loading: (previous) { if (previous is AsyncData<User>) { return Text('loading ... (previous: ${previous.value.name})'}); } return CircularProgressIndicator(); } ); }
AsyncValue #
- Breaking
AsyncValue.copyWithis removed - Breaking
AsyncValue.error(..., stacktrace)is now a named parameter instead of postional parameter. - Breaking
AsyncValue.when(loading: )and ``AsyncValue.when(error: )(andwhen` variants) now receive an extra "previous" parameter. - Deprecated
AsyncValue.datain favor ofAsyncValue.value - Allowed
AsyncData,AsyncErrorandAsyncLoadingto be extended - Added
AsyncValue.whenOrNull, similar towhenOrElsebut instead of an "orElse" parameter, returnsnull. - Added
AsyncValue.value, which allows reading the value without handling loading/error states. AsyncErrorcan now be instantiated withconst.AsyncLoadingandAsyncErrornow optionally includes the previous state.
General #
-
Breaking All
overrideWithProvidermethods are removed.
To migrate, instead useoverrideWithValue. -
All providers now come with an extra named parameter called
dependencies. This parameter optionally allows defining the list of providers/families that this new provider depends on:final a = Provider(...); final b = Provider((ref) => ref.watch(a), dependencies: [a]);By doing so, this will tell Riverpod to automatically override
bifagets overridden. -
Added
StateController.update, to simplify updating the state from the previous state:final provider = StateController((ref) => 0); ... ref.read(provider).update((state) => state + 1); -
It is no longer allowed to use
ref.watchorref.readinside a selector:provider.select((value) => ref.watch(something)); // KO, cannot user ref.watch inside selectors
Bug-fixes #
- fixed a bug where providers were rebuilding even when not listened to
- fixed
ref.listennow working when downcasting the value of a provider. - fixed a bug where disposing a scoped
ProviderContainercould cause otherProviderContainers to stop working. - fixed an issue where conditionally depending on an "autoDispose" provider may not properly dispose of it (see #712)
- fixed an issue where when chaining providers, widgets may re-render a frame late, potentially causing a flicker. (see #648)
1.0.0-dev.7 #
- Fixed
ProviderObservernot working when modifying aStateProvider. - Fixed a bug where scoped provider were potentially not disposed
- Fixed a bug where widgets were not rebuilding in release mode under certain conditions
1.0.0-dev.6 #
- FIX: StreamProvider.last no longer throws a StateError when no value were emitted (#296).
- Re-enabled debug assertions that were temporarily disabled by previous dev versions.
- Allows families to be scoped/overridden
- Fixed bugs with
ref.refreshnot working on some providers - renamed
ProviderBase.recreateShouldNotifytoupdateShouldNotify
1.0.0-dev.5 #
Fixed an issue where provider listeners could not be called properly.
1.0.0-dev.3 #
Fixed various issues related to scoped providers.
1.0.0-dev.2 #
- All providers can now be scoped.
- breaking:
ScopedProvideris removed. To migrate, changeScopedProviders toProviders.
1.0.0-dev.1 #
- Add missing exports (see #532)
1.0.0-dev.0 #
-
Breaking: The prototype of
ConsumerWidget'sbuildandConsumer'sbuilderchanged. Before:class Example extends ConsumerWidget { @override Widget build(BuildContext context, ScopedReader watch) { int count = watch(counterProvider); ... } }After:
class Example extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { int count = ref.watch(counterProvider); ... } } -
ProviderListeneris deprecated. Instead, useref.listen:class Example extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { ref.listen<int>(counter, (count) { print('count changed $count'); }); } } -
Added
ConsumerStatefulWidget+ConsumerState, a variant ofStatefulWidgets that have access to aWidgetRef. -
All "watch" functions now support
myProvider.select((value) => ...). This allows filtering rebuilds:final userProvider = StateNotifierProvider<UserController, User>(...); Consumer( builder: (context, ref, _) { // With this syntax, the Consumer will not rebuild if `userProvider` // emits a new User but its "name" didn't change. bool userName = ref.watch(userProvider.select((user) => user.name)); }, ) -
Breaking:
Family.overrideWithProvidernow must create a provider:final family = Provider.family<State, Arg>(...); family.overrideWithProvider( (Arg arg) => Provider<State>((ref) => ...) ); -
Breaking:
ProviderObserver.didUpdateProvidernow receives both the previous and new value. -
Breaking:
ProviderObserver.mayHaveChangedis removed. -
Added
ref.listen, used to listen to another provider without recreating the provider state:final counter = StateNotifierProvider<Counter, int>(...); final anotherProvider = Provider<T>((ref) { ref.listen<int>(counter, (count) { print('counter change: $count'); }); }); -
ProviderReferenceis deprecated in favor ofProviderRefBase. -
All providers now receive a custom subclass of
ProviderRefBaseas a parameter:Provider<T>((ProviderRef<T> ref) {...}); FutureProvider<T>((FutureProviderRef<T> ref) {...}); StateProvider<T>((StateProviderRef<T> ref) {...});That allows providers to implement features that is not shared with other providers.
-
Provider,FutureProviderandStreamProvider'srefnow have astateproperty, which represents the currently exposed value. Modifying it will notify the listeners:Provider<int>((ref) { ref.listen(onIncrementProvider, (_) { ref.state++; }); return 0; }); -
StateProvider'srefnow has acontrollerproperty, which allows the provider to access theStateControllerexposed.
-
-
Breaking:
ProviderReference.mountedis removed. You can implement something similar usingonDispose:Provider<T>((ref) { var mounted = true; ref.onDispose(() => mounted = false); }); -
Breaking:
ProviderContainer.debugProviderValuesandProviderContainer.debugProviderElementsare removed. You can now instead useProviderContainer.getAllProviderElements. -
StreamProvider.last,StreamProvider.streamandFutureProvider.futurenow expose a future/stream that is independent from how many times the associated provider "rebuilt":- if a
StreamProviderrebuild before its stream emitted any value,StreamProvider.lastwill resolve with the first value of the new stream instead. - if a
FutureProviderrebuild before its future completes,FutureProvider.futurewill resolve with the result of the new future instead.
- if a
-
You can now override any provider with any other provider, as long as the value that they expose matches. For example, it is possible to override a
StreamProvider<Model>with aProvider<AsyncValue<Model>>. -
Providers can now call
ref.refreshto refresh a provider, instead of having to doref.container.refresh. -
ref.onDisposenow calls the dispose function as soon as one of the provider's dependency is known to have changed -
Providers no longer wait until their next read to recompute their state if one of their dependency changed and they have listeners.
-
Added
ProviderContainer.pump, a utility to easily "await" until providers notify their listeners or are disposed. -
fixed an issue when using both
familyandautoDisposethat could lead to an inconsistent state
0.14.0+3 #
Removed an assert that could cause issues when an application is partially migrated to null safety.
0.14.0+2 #
- Fix
context.refreshnot compiling when using nullable providers
0.14.0+1 #
- Re-added
StateProvider.overrideWithValue/StateProvider.overrideWithProviderthat were unvoluntarily removed.
0.14.0 #
-
BREAKING CHANGE The
Listener/LocatorMixintypedefs are removed as the former could cause a name conflict with the widget namedListenerand the latter is not supported when using Riverpod. -
BREAKING CHANGE The syntax for using
StateNotifierProviderwas updated. Before:class MyStateNotifier extends StateNotifier<MyModel> {...} final provider = StateNotifierProvider<MyStateNotifier>((ref) => MyStateNotifier()); ... Widget build(context, watch) { MyStateNotifier notifier = watch(provider); MyModel model = watch(provider.state); }After:
class MyStateNotifier extends StateNotifier<MyModel> {...} final provider = StateNotifierProvider<MyStateNotifier, MyModel>>((ref) => MyStateNotifier()); ... Widget build(context, watch) { MyStateNotifier notifier = watch(provider.notifier); MyModel model = watch(provider); }See also https://github.com/rrousselGit/river_pod/issues/341 for more information.
-
BREAKING CHANGE It is no longer possible to override
StreamProvider.stream/lastandFutureProvider.future. -
feat: Calling
ProviderContainer.disposemultiple time no longer throws. This simplifies the tear-off logic of tests. -
feat: Added
ChangeNotifierProvider.notifierandStateProvider.notifierThey allow obtaining the notifier associated with the provider, without causing widgets/providers to rebuild when the state updates. -
fix: overriding a
StateNotifierProvider/ChangeNotifierProviderwithoverrideWithValuenow correctly listens to the notifier.
0.1 #
0.13.1+1 #
Fixed an issue where context.read and ProviderListener were unable to read providers that return a nullable value
0.13.1 #
- Fixed a bug where overriding a
FutureProviderwith an error value could cause tests to fail (see https://github.com/rrousselGit/river_pod/issues/355)
0.13.0 #
- stable null-safety release
ProviderObservercan now have a const constructor- Added the mechanism for state-inspection using the Flutter devtool
- loosened the version constraints of
freezed_annotation - deprecated
import 'flutter_riverpod/all.dart'. Now everything is available withflutter_riverpod/flutter_riverpod.dart. - Fixed a but where listening to
StreamProvider.lastcould result in aStateError(#217) - removed the assert preventing ConsumerWidget's "watch" from being used after the
buildmethod completed. This allows "watch" to be used insideListView.builder. context.read(myProvider)now acceptsScopeProviders
0.13.0-nullsafety.3 #
- deprecated
import 'flutter_riverpod/all.dart'. Now everything is available withflutter_riverpod/flutter_riverpod.dart. - removed the assert preventing ConsumerWidget's "watch" from being used after the
buildmethod completed. This allows "watch" to be used insideListView.builder. context.read(myProvider)now acceptsScopeProviders
0.13.0-nullsafety.2 #
- Fixed outdated doc
0.13.0-nullsafety.1 #
- Fixed a but where listening to
StreamProvider.lastcould result in aStateError(#217)
0.13.0-nullsafety.0 #
Migrated to null-safety
0.12.2 #
- Exported
AutoDisposeProviderRefBase
0.12.1 #
- Fixed an remaining memory leak related to StreamProvider (see also https://github.com/rrousselGit/river_pod/issues/193)
0.12.0 #
- Breaking FutureProvider and StreamProvider no longer supports
nullas a valid value. - Fixed a memory leak with StreamProvider (see also https://github.com/rrousselGit/river_pod/issues/193)
- Fixed an error message typo related to Consumer
0.11.2 #
- Fixed a bug where providers (usually ScopedProviders) did not dispose correctly (see also https://github.com/rrousselGit/river_pod/issues/154).
0.11.1 #
- Fixed a bug where hot-reload did not work for
ConsumerWidget/Consumer
0.11.0 #
package:flutter_riverpod/flutter_riverpod.dartnow exportsStateNotifier- Marked the providers with
@sealedso that the IDE warns against implementing/subclassing providers. - Fix mistakes in
AsyncValue.guard's documentation (thanks @mono0926) - Loosened the version constraints of
freezed_annotationto support0.12.0
0.10.1 #
- Fixed invalid version error
0.10.0 #
-
Fixed a bug where the state of a provider may be disposed when it shouldn't be disposed.
-
Added a way to import the implementation class of providers with modifiers, such as
AutoDisposeProvider.This is useful if you want to use Riverpod with the lint
always_specify_types:import 'package:flutter_riverpod/all.dart'; final AutoDisposeStateProvider<int> counter = StateProvider.autoDispose<int>((ProviderRefBase ref) { return 0; });If you do not use this lint, prefer using the default import instead, to not pollute your auto-complete.
0.9.0 #
- Breaking Updating
ProviderListenerso thatonChangereceives theBuildContextas a parameter (thanks to @tbm98)
0.8.0 #
- Renamed
ProviderContainer.debugProviderStatestoProviderContainer.debugProviderElements - Fixed a bug where updating
ProviderScope.overridesmay cause an exception for no reason (see https://github.com/rrousselGit/river_pod/issues/107)
0.7.2 #
Fixed a bug that prevented the use of ConsumerWidget under normal circumstances
0.7.1 #
- Fixed a bug where in release mode,
ScopedProviderdid not update correctly (https://github.com/rrousselGit/river_pod/issues/101)
0.7.0 #
-
Breaking:
Consumeris slightly modified to match other Builders likeValueListenableBuilder. Before:return Consumer((context, watch) { final value = watch(myProvider); return Text('$value'); });after:
return Consumer( builder: (context, watch, child) { final value = watch(myProvider); return Text('$value'); }, ); -
Added a
ConsumerWidgetclass which can be extended to make aStatelessWidgetthat can read providers:class MyWidget extends ConsumerWidget { const MyWidget({Key? key}) : super(key: key); @override Widget build(BuildContext context, ScopedReader watch) { final value = watch(myProvider); return Text('$value'); } } -
ref.watchon non ".autoDispose" providers can no longer read ".autoDispose" providers.For more info, see http://riverpod.dev/docs/concepts/modifiers/auto_dispose#the-argument-type-autodisposeprovider-cant-be-assigned-to-the-parameter-type-alwaysaliveproviderbase
-
ScopedProvidernow acceptsnullas a function:final example = ScopedProvider<int>(null);Which is equivalent to:
final example = ScopedProvider<int>((watch) => throw UnimplementedError('')); -
Fixed a bug where
context.refreshmay not work properly if the widget tree contains multipleProviderScope.
0.6.1 #
- Fixed a bug where when disposing
ProviderContainer, providers may be disposed in an incorrect order. - Improved the performances of reading providers by 25%
0.6.0 #
-
Merged
ComputedandProvider. Now, all providers have the ability to rebuild their state when one of the object they listen changed.To migrate, change:
final provider = Provider(...); final example = Computed((watch) { final value = watch(provider); return value; });into:
final provider = Provider(...); final example = Provider((ref) { final value = ref.watch(provider); return value; }); -
Computed(nowProvider) no longer deeply compare collections to avoid rebuilds. Comparing the content of lists is quite expensive and actually rarely useful. Now, a simple==comparison is used. -
Renamed
ProviderStateOwnertoProviderContainer -
Renamed
ProviderStateOwnerObservertoProviderObserver -
It is no longer possible to override a provider anywhere in the widget tree. Providers can only be overridden in the top-most
ProviderScope/ProviderContainer. -
Providers can now read values which may change over time using
ref.readandref.watch. When usingref.watch, if the value obtained changes, this will cause the provider to re-create its state. -
It is no longer possible to add
ProviderObserveranywhere in the widget tree. They can be added only on the top-mostProviderScope/ProviderContainer. -
Provider.read(BuildContext)is changed intocontext.read(provider), and can now readProvider.autoDispose. -
Added
ProviderContainer.refresh(provider)andcontext.refresh(provider). These method allows forcing the refresh of a provider, which can be useful for things like "retry on error" or "pull to refresh".
-
ref.read(StreamProvider<T>)no longer returns aStream<T>but anAsyncValue<T>Before:final streamProvider = StreamProvider<T>(...); final example = Provider((ref) { Stream<T> stream = ref.read(streamProvider); });After:
final streamProvider = StreamProvider<T>(...); final example = Provider((ref) { Stream<T> stream = ref.watch(streamProvider.steam); }); -
ref.read(FutureProvider<T>)no longer returns aFuture<T>but anAsyncValue<T>Before:
final futureProvider = FutureProvider<T>(...); final example = Provider((ref) { Future<T> future = ref.read(futureProvider); });After:
final futureProvider = FutureProvider<T>(...); final example = Provider((ref) { Future<T> future = ref.watch(futureProvider.future); }); -
Removed
ref.dependOn. You can now useref.read/ref.watchto achieve the same effect.Before:
final streamProvider = StreamProvider<T>(...); final example = Provider((ref) { Future<T> last = ref.dependOn(streamProvider).last; });After:
final streamProvider = StreamProvider<T>(...); final example = Provider((ref) { Future<T> last = ref.watch(streamProvider.last); }); -
Provider.readOwner(ProviderStateOwner)is changed intoProviderContainer.read(Provider) -
Provider.watchOwner(ProviderStateOwner, (value) {})is changed into:ProviderContainer container; final provider = Provider((ref) => 0); final subscription = container.listen( provider, mayHaveChanged: (sub) {}, didChange: (sub) {}. ); subscription.close(); -
MyProvider.family.autoDisposenow correctly free both the arguments and the associated providers from memory when the provider is no longer listened to.
-
Added
ScopedProvider, a new kind of provider that can be overridden anywhere in the widget tree. Normal providers cannot read aScopedProvider. -
Added
ProviderListener, a widget which allows listening to a provider without rebuilding the widget-tree. This can be useful for showing modals and pushing routes.
0.5.1 #
- Fixed the documentation of
StateNotifierProviderincorrectly showing the documentation ofStreamProvider. - Improve the documentation of
StateProvider.
0.5.0 #
- Changed
ComputedFamilyintoComputed.family - Added [AsyncValue.guard](https://pub.dev/documentation/riverpod/latest/riverpod/AsyncValue/guard.html to simplify transforming a Future into an AsyncValue.
- Improved the documentation of the different providers
0.4.0 #
Changed the syntax of "AutoDispose*" and "*Family" to use a syntax similar to named constructors instead.
Before:
final myProvider = AutoDisposeStateNotifierProviderFamily<MyStateNotifier, int>((ref, id) {
return MyStateNotifier(id: id);
});
After:
final myProvider = StateNotifierProvider.autoDispose.family<MyStateNotifier, int>((ref, id) {
return MyStateNotifier(id: id);
});
The behavior is the same. Only the syntax changed.
0.3.0 #
-
Added
AsyncValue.whenData, syntax sugar forAsyncValue.whento handle only thedatacase and do nothing for the error/loading cases. -
Fixed a bug that caused [Computed] to crash if it stopped being listened to then was listened to again.
0.2.1 #
ComputedandConsumernow correctly unsubscribe to a provider when their function stops using a provider.
0.2.0 #
ref.readis renamed asref.dependOn- Deprecated
ref.dependOn(streamProvider).streamandref.dependOn(futureProvider).futurein favor of a universalref.dependOn(provider).value. - added
ref.read(provider), syntax sugar forref.dependOn(provider).value.
0.1.0 #
Initial release