NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #591 most downloaded on pub.dev
A reactive caching and data-binding framework. Riverpod makes working with asynchronous code a breeze.
Last release 28 days ago
03 Sep 2026
Ships fairly regularly
a new release about every 5 weeks
Most releases are documented
notes for 53 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
6 years old
137 releases · first in 2020
One column per quarter.
Fixed a bug where when disposing ProviderContainer, providers may be disposed in an incorrect order.
ProviderContainer, providers may be disposed
in an incorrect order.Merged Computed and Provider. Now, all providers have the ability to rebuild their state when one of the object they listen changed.
Merged Computed and Provider. 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 (now Provider) 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 ProviderStateOwner to ProviderContainer
Renamed ProviderStateOwnerObserver to ProviderObserver
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.read and ref.watch.
When using ref.watch, if the value obtained changes, this will cause the provider
to re-create its state.
It is no longer possible to add ProviderObserver anywhere in the widget tree.
They can be added only on the top-most ProviderScope/ProviderContainer.
Provider.read(BuildContext) is changed into context.read(provider), and
can now read Provider.autoDispose.
Added ProviderContainer.refresh(provider) and context.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 a Stream<T> but an AsyncValue<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 a Future<T> but an AsyncValue<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 use ref.read/ref.watch to 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 into ProviderContainer.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.autoDispose now 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 a ScopedProvider.
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.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Fixed the documentation of StateNotifierProvider incorrectly showing the documentation of StreamProvider.
StateNotifierProvider incorrectly showing the
documentation of StreamProvider.StateProvider.Changed ComputedFamily into Computed.family
ComputedFamily into Computed.familyChanged the syntax of "AutoDispose*" and "*Family" to use a syntax similar to named constructors instead.
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.
Loosen the version constraint of flutter_hooks used to support latest versions.
flutter_hooks used to support latest versions.Added AsyncValue.whenData, syntax sugar for AsyncValue.when to handle only the data case and do nothing for the error/loading cases.
Added AsyncValue.whenData, syntax sugar for AsyncValue.when to handle
only the data case 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.
useProvider no longer throws an UnsupportedError when the provider being listened to changes, and correctly listens to the new provider.
useProvider no longer throws an UnsupportedError when the provider being
listened to changes, and correctly listens to the new provider.
Computed and Consumer now correctly unsubscribe to a provider when their
function stops using a provider.
Deprecated ref.dependOn(streamProvider).stream and ref.dependOn(futureProvider).future in favor of a universal ref.dependOn(provider).value.
ref.read is renamed as ref.dependOnref.dependOn(streamProvider).stream and ref.dependOn(futureProvider).future
in favor of a universal ref.dependOn(provider).value.ref.read(provider), syntax sugar for ref.dependOn(provider).value.<!-- cSpell:ignoreRegExp @\w+ -->
Initial release
<!-- cSpell:ignoreRegExp @\w+ -->
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →