Viewing version 1.0.0-dev.9. Open the latest package page.

riverpod

1.0.0-dev.9

A simple way to access state from anywhere in your application while robust and testable.

Download archive

Readme


A state-management library that:

  • catches programming errors at compile time rather than at runtime
  • removes nesting for listening/combining objects
  • ensures that the code is testable
riverpod pub package
flutter_riverpod pub package
hooks_riverpod pub package

Welcome to Riverpod!

This project can be considered as a rewrite of provider to make improvements that would be otherwise impossible.

For learning how to use Riverpod, see its documentation: https://riverpod.dev

Long story short:

  • Declare your providers as global variables:

    final counterProvider = StateNotifierProvider((ref) {
      return Counter();
    });
    
    class Counter extends StateNotifier<int> {
      Counter(): super(0);
    
      void increment() => state++;
    }
    
  • Use them inside your widgets in a compile time safe way. No runtime exceptions!

    class Example extends ConsumerWidget {
      @override
      Widget build(BuildContext context, WidgetRef ref) {
        final count = ref.watch(counterProvider);
        return Text(count.toString());
      }
    }
    

See the FAQ if you have questions about what this means for provider.

Migration

With the release of the version 0.14.0, the syntax for using StateNotifierProvider changed.

See the migration guide for more informations

Index

Motivation

If provider is a simplification of InheritedWidgets, then Riverpod is a reimplementation of InheritedWidgets from scratch.

It is very similar to provider in principle, but also has major differences as an attempt to fix the common problems that provider face.

Riverpod has multiple goals. First, it inherits the goals of provider:

  • Being able to safely create, observe and dispose states without having to worry about losing the state on widget rebuild.
  • Making our objects visible in Flutter's devtool by default.
  • Testable and composable
  • Improve the readability of InheritedWidgets when we have multiple of them (which would naturally lead to a deeply nested widget tree).
  • Make apps more scalable with a unidirectional data-flow.

From there, Riverpod goes a few steps beyond:

  • Reading objects is now compile-safe. No more runtime exception.
  • It makes the provider pattern more flexible, which allows supporting commonly requested features like:
    • Being able to have multiple providers of the same type.
    • Disposing the state of a provider when it is no longer used.
    • Have computed states
    • Making a provider private.
  • Simplifies complex object graphs. It is easier to depend on asynchronous state.
  • Makes the pattern independent from Flutter

These are achieved by no longer using InheritedWidgets. Instead, Riverpod implements its own mechanism that works in a similar fashion.

For learning how to use Riverpod, see its documentation: https://riverpod.dev

Contributing

Contributions are welcomed!

Here is a curated list of how you can help:

  • Report bugs and scenarios that are difficult to implement
  • Report parts of the documentation that are unclear
  • Update the documentation / add examples
  • Implement new features by making a pull-request

FAQ

Why another project when provider already exists?

While provider is largely used and well accepted by the community, it is not perfect either.

People regularly file issues or ask questions about some problems they face, such as:

  • Why do I have a ProviderNotFoundException?
  • How can I make that my state automatically disposed of when not used anymore?
  • How to make a provider that depends on other (potentially complex) providers?

These are legitimate problems, and I believe that something can be improved to fix those.

The issue is, these problems are deeply rooted in how provider works, and fixing those problems is likely impossible without drastic changes to the mechanism of provider.

In a way, if provider is a candle then Riverpod is a lightbulb. They have very similar usages, but we cannot create a lightbulb by improving our candle.

Is it safe to use in production?

Yes, but with caution.

Riverpod recently left its experimental status, but it isn't fully stable either. The API may change slightly when more features are added, and some use-cases may not be as simple as they could be.

But overall, you should be able to use Riverpod without trouble.

Will this get merged with provider at some point?

No. At least not until it is proven that the community likes Riverpod and that it doesn't cause more problems than it solves.

While provider and this project have a lot in common, they do have some major differences. Differences big enough that it would be a large breaking change for users of provider to migrate Riverpod.

Considering that, separating both projects initially sounds like a better compromise.

Will provider be deprecated/stop being supported?

Not in the short term, no.

This project is still experimental and unpopular. While it is, in a way, a provider 2.0, its worth has yet to be proven.

Until it is certain that Riverpod is a better way of doing things and that the community likes it, provider will still be maintained.

Changelog

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 a Future<T> That allows bypassing the loading state in the event where a value was synchronously available.

  • During loading and error states, FutureProvider and StreamProvider now expose the latest value through AsyncValue.
    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.copyWith is 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.data in favor of AsyncValue.value
  • Allowed AsyncData, AsyncError and AsyncLoading to be extended
  • Added AsyncValue.whenOrNull, similar to whenOrElse but instead of an "orElse" parameter, returns null.
  • Added AsyncValue.value, which allows reading the value without handling loading/error states.
  • AsyncError can now be instantiated with const.
  • AsyncLoading and AsyncError now optionally includes the previous state.

General

  • Breaking All overrideWithProvider methods are removed.
    To migrate, instead use overrideWithValue.

  • 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 b if a gets 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.watch or ref.read inside 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
  • fixed ref.listen now working when downcasting the value of a provider.
  • fixed a bug where disposing a scoped ProviderContainer could cause other ProviderContainers 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 ProviderObserver not working when modifying a StateProvider.
  • 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.refresh not working on some providers
  • renamed ProviderBase.recreateShouldNotify to updateShouldNotify

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: ScopedProvider is removed. To migrate, change ScopedProviders to Providers.

1.0.0-dev.1

  • Add missing exports (see #532)

1.0.0-dev.0

  • ref.watch now support myProvider.select((value) => ...). This allows filtering rebuilds:

    final userProvider = StateNotifierProvider<UserController, User>(...);
    
    final anotherProvider = Provider((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.overrideWithProvider now must create a provider:

    final family = Provider.family<State, Arg>(...);
    
    family.overrideWithProvider(
      (Arg arg) => Provider<State>((ref) => ...)
    );
    
  • Breaking: ProviderObserver.didUpdateProvider now receives both the previous and new value.

  • Breaking: ProviderObserver.mayHaveChanged is 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');
      });
    });
    
  • ProviderReference is deprecated in favor of ProviderRefBase.

  • All providers now receive a custom subclass of ProviderRefBase as 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, FutureProvider and StreamProvider's ref now have a state property, which represents the currently exposed value. Modifying it will notify the listeners:

      Provider<int>((ref) {
        ref.listen(onIncrementProvider, (_) {
          ref.state++;
        });
      
        return 0;
      });
      
    • StateProvider's ref now has a controller property, which allows the provider to access the StateController exposed.

  • Breaking: ProviderReference.mounted is removed. You can implement something similar using onDispose:

    Provider<T>((ref) {
      var mounted = true;
      ref.onDispose(() => mounted = false);
    });
    
  • Breaking: ProviderContainer.debugProviderValues and ProviderContainer.debugProviderElements are removed. You can now instead use ProviderContainer.getAllProviderElements.

  • StreamProvider.last, StreamProvider.stream and FutureProvider.future now expose a future/stream that is independent from how many times the associated provider "rebuilt":

    • if a StreamProvider rebuild before its stream emitted any value, StreamProvider.last will resolve with the first value of the new stream instead.
    • if a FutureProvider rebuild before its future completes, FutureProvider.future will resolve with the result of the new future instead.
  • 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 a Provider<AsyncValue<Model>>.

  • ref.onDispose now calls the dispose function as soon as one of the provider's dependency is known to have changed

  • Providers can now call ref.refresh to refresh a provider, instead of having to do ref.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, an utility to easily "await" until providers notify their listeners or are disposed.

  • fixed an issue when using both family and autoDispose that 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+1

  • Re-added StateProvider.overrideWithValue/StateProvider.overrideWithProvider that were unvoluntarily removed.

0.14.0

  • BREAKING CHANGE The Listener/LocatorMixin typedefs are removed as the former could cause a name conflict with the widget named Listener and the latter is not supported when using Riverpod.

  • BREAKING CHANGE The syntax for using StateNotifierProvider was 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/last and FutureProvider.future.

  • feat: Calling ProviderContainer.dispose multiple time no-longer throws. This simplifies the tear-off logic of tests.

  • feat: Added ChangeNotifierProvider.notifier and StateProvider.notifier They allow obtaining the notifier associated to the provider, without causing widgets/providers to rebuild when the state updates.

  • fix: overriding a StateNotifierProvider/ChangeNotifierProvider with overrideWithValue now correctly listens to the notifier.

0.13.1

0.13.0

  • stable null-safety release
  • ProviderObserver can now have a const constructor
  • Added the mechanism for state-inspection using the Flutter devtool
  • loosened the version constraints of freezed_annotation
  • deprecated import 'riverpod/all.dart'. Now everything is available with riverpod/riverpod.dart.
  • Fixed a but where listening to StreamProvider.last could result in a StateError (#217)

0.13.0-nullsafety.3

  • deprecated import 'riverpod/all.dart'. Now everything is available with riverpod/riverpod.dart.

0.13.0-nullsafety.1

  • Fixed a but where listening to StreamProvider.last could result in a StateError (#217)

0.13.0-nullsafety.0

Migrated to null-safety

0.12.2

  • Exported AutoDisposeProviderRefBase

0.12.1

0.12.0

0.11.2

0.11.0

  • package:riverpod/riverpod.dart now exports StateNotifier
  • Marked the providers with @sealed so that the IDE warns against implementing/subclassing providers.
  • Fix mistakes in AsyncValue.guard's documentation (thanks @mono0926)
  • Loosened the version constraints of freezed_annotation to support 0.12.0

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: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.8.0

0.7.0

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 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 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 ProviderContainer.

  • Added ProviderContainer.refresh(provider). This 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 acheive 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.

  • Added ScopedProvider, a new kind of provider that can be overridden anywhere in the widget tree. Normal providers cannot read a ScopedProvider.

0.5.1

  • Fixed the documentation of StateNotifierProvider incorrectly showing the documentation of StreamProvider.
  • Improve the documentation of StateProvider.

0.5.0

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 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 then was listened again.

0.2.1

  • Computed now correctly unsubscribe to a provider when their function stops using a provider.

0.2.0

  • ref.read is renamed as ref.dependOn
  • Deprecated ref.dependOn(streamProvider).stream and ref.dependOn(futureProvider).future in favor of a universal ref.dependOn(provider).value.
  • added ref.read(provider), syntax sugar for ref.dependOn(provider).value.

0.1.0

Initial release

Installing

export PUB_HOSTED_URL=https://pub.mirror.p-hatan.ir
flutter pub add 'riverpod:1.0.0-dev.9'
pubspec.yaml
name: riverpod
description: >
  A simple way to access state from anywhere in your application while robust
  and testable.
version: 1.0.0-dev.9
homepage: https://riverpod.dev
repository: https://github.com/rrousselGit/river_pod

environment:
  sdk: ">=2.13.0 <3.0.0"

dependencies:
  collection: ^1.15.0
  meta: ^1.3.0
  state_notifier: ^0.7.0

dev_dependencies:
  build_runner: ^2.0.0
  expect_error: ^1.0.0
  freezed: ^0.14.0
  mockito: ^5.0.0
  test: ^1.16.0
  trotter: ^2.0.0-dev.1

Version history

VersionPublishedArchiveSHA-256
0.0.1-preCached · Upstream SHA-256 matchedDownload4293ac1d…c5e806
0.0.1-pre+1Cached · Upstream SHA-256 matchedDownload303e5601…245d0a
0.1.0Cached · Upstream SHA-256 matchedDownload1a93b2a5…4a2699
0.2.0Cached · Upstream SHA-256 matchedDownload1e67d29d…38ae96
0.2.1Cached · Upstream SHA-256 matchedDownload35fc5b2f…6ad2c9
0.3.0Cached · Upstream SHA-256 matchedDownload21ed42e4…e54061
0.4.0Cached · Upstream SHA-256 matchedDownload922009d6…170583
0.5.0Cached · Upstream SHA-256 matchedDownloadb0c51f47…02b3b8
0.5.1Cached · Upstream SHA-256 matchedDownloada424df1b…399bb7
0.6.0-devCached · Upstream SHA-256 matchedDownloadce575b60…4f3294
0.6.0-dev+1Cached · Upstream SHA-256 matchedDownload7fad2e5f…a1059a
0.6.0-dev+2Cached · Upstream SHA-256 matchedDownloadfdd66c35…22e382
0.6.0-dev+3Cached · Upstream SHA-256 matchedDownload54f00828…a554cb
0.6.0Cached · Upstream SHA-256 matchedDownload8d04f41d…8f265d
0.6.0+1Cached · Upstream SHA-256 matchedDownload8e29da64…0a519f
0.6.1Cached · Upstream SHA-256 matchedDownload62162ffb…4e61cd
0.7.0Cached · Upstream SHA-256 matchedDownloadfb11b1c7…51bec2
0.8.0Cached · Upstream SHA-256 matchedDownloadc727b646…1352ce
0.10.0Cached · Upstream SHA-256 matchedDownload9ab76912…948d47
0.11.0Cached · Upstream SHA-256 matchedDownloadf0a45611…152874
0.11.2Cached · Upstream SHA-256 matchedDownload6adcf330…a03e28
0.12.0Cached · Upstream SHA-256 matchedDownload57e82963…e55b92
0.12.1Cached · Upstream SHA-256 matchedDownload38473ef0…09c05c
0.12.2Cached · Upstream SHA-256 matchedDownloadde0cb4aa…5c2d70
0.12.3Cached · Upstream SHA-256 matchedDownload83e9a709…deceb5
0.12.4Cached · Upstream SHA-256 matchedDownload69e07407…33e85c
0.13.0-nullsafety.0Cached · Upstream SHA-256 matchedDownloadf2464614…088a95
0.13.0-nullsafety.1Cached · Upstream SHA-256 matchedDownload1aff218f…d34efa
0.13.0-nullsafety.3Cached · Upstream SHA-256 matchedDownloadacda31a7…f13e6e
0.13.0Cached · Upstream SHA-256 matchedDownload05f0e1bd…1c5cc2
0.13.1Cached · Upstream SHA-256 matchedDownloadca4ef57a…3c79c6
0.14.0Cached · Upstream SHA-256 matchedDownload982e5733…803c17
0.14.0+1Cached · Upstream SHA-256 matchedDownloadaf9d98fb…1857e7
0.14.0+3Cached · Upstream SHA-256 matchedDownload13cbe0e1…4eae07
1.0.0-dev.0Cached · Upstream SHA-256 matchedDownload9c9b6700…e4217b
1.0.0-dev.1Cached · Upstream SHA-256 matchedDownloadda5b2bc2…a35c8a
1.0.0-dev.2Cached · Upstream SHA-256 matchedDownload70455873…857521
1.0.0-dev.3Cached · Upstream SHA-256 matchedDownload5a25043f…6ba9fe
1.0.0-dev.5Cached · Upstream SHA-256 matchedDownload919e02ea…a060af
1.0.0-dev.6Cached · Upstream SHA-256 matchedDownloadb663ec2f…6630f8
1.0.0-dev.7Cached · Upstream SHA-256 matchedDownload0f4a606a…cfa4b3
1.0.0-dev.8Cached · Upstream SHA-256 matchedDownload7bbbd1cc…a1a829
1.0.0-dev.9Cached · Upstream SHA-256 matchedDownload75a6d8e3…f72d13
1.0.0-dev.10Cached · Upstream SHA-256 matchedDownload38d86325…a12cc2
1.0.0Cached · Upstream SHA-256 matchedDownload8538f67c…37c771
1.0.1Cached · Upstream SHA-256 matchedDownloadea94268d…35fd13
1.0.2Cached · Upstream SHA-256 matchedDownloadcfd3d6bf…85cb17
1.0.3Cached · Upstream SHA-256 matchedDownloade7f09715…28217d
1.0.3+1Cached · Upstream SHA-256 matchedDownload98f9ac54…3e4485
2.0.0-dev.0Cached · Upstream SHA-256 matchedDownloadcf188b1a…31d37e
2.0.0-dev.1Cached · Upstream SHA-256 matchedDownload0de700b4…d64431
2.0.0-dev.2Cached · Upstream SHA-256 matchedDownload16b8fee4…afd455
2.0.0-dev.3Cached · Upstream SHA-256 matchedDownloadb4fec8df…c12d47
2.0.0-dev.4Cached · Upstream SHA-256 matchedDownload190ecb07…a32925
2.0.0-dev.5Cached · Upstream SHA-256 matchedDownload90de2f33…329efe
2.0.0-dev.6Cached · Upstream SHA-256 matchedDownload04716177…2e056f
2.0.0-dev.7Cached · Upstream SHA-256 matchedDownload2eae8f07…f5973d
2.0.0-dev.8Cached · Upstream SHA-256 matchedDownloadd4e6ac33…31c2c6
2.0.0-dev.9Cached · Upstream SHA-256 matchedDownloadccf59580…81ab2c
2.0.0Cached · Upstream SHA-256 matchedDownload427d64b8…e524a6
2.0.1Cached · Upstream SHA-256 matchedDownloadd52ac0cc…09cc21
2.0.2Cached · Upstream SHA-256 matchedDownload45b63637…cd2bac
2.1.0Cached · Upstream SHA-256 matchedDownloadce7f4a28…866156
2.1.1Cached · Upstream SHA-256 matchedDownload899cd099…1b29f9
2.1.2Cached · Upstream SHA-256 matchedDownload74bb148e…5d5be8
2.1.3Cached · Upstream SHA-256 matchedDownload0f43c64f…56e2c4
2.2.0Cached · Upstream SHA-256 matchedDownload59a48de9…9e8c4b
2.3.0Cached · Upstream SHA-256 matchedDownloadc5aea6c3…76cd25
2.3.1Cached · Upstream SHA-256 matchedDownload7da5a0fe…85bfa5
2.3.2Cached · Upstream SHA-256 matchedDownloadb0fbf792…cd8dc4
2.3.3Cached · Upstream SHA-256 matchedDownloadfc63714d…14b585
2.3.4Cached · Upstream SHA-256 matchedDownload77ab3bcd…df6ae5
2.3.5Cached · Upstream SHA-256 matchedDownloadec564106…8854b2
2.3.6Cached · Upstream SHA-256 matchedDownload80e48beb…e2d8ef
2.3.7Cached · Upstream SHA-256 matchedDownloadb0657b5b…ade793
2.3.9Cached · Upstream SHA-256 matchedDownload52b2937f…9a287c
2.3.10Cached · Upstream SHA-256 matchedDownload6c0a2c30…cb3f6a
2.4.0Cached · Upstream SHA-256 matchedDownloada600120d…f67d22
2.4.1Cached · Upstream SHA-256 matchedDownloadff676bd8…7cc914
2.4.3Cached · Upstream SHA-256 matchedDownload494bf2cf…f5e208
2.4.4Cached · Upstream SHA-256 matchedDownload2af3d127…d878b1
2.4.5Cached · Upstream SHA-256 matchedDownload2e843150…b63d55
2.4.6Cached · Upstream SHA-256 matchedDownload01fa385a…58d4b2
2.4.7Cached · Upstream SHA-256 matchedDownloadf003970b…840cf4
2.4.8Cached · Upstream SHA-256 matchedDownload08451ddb…478848
2.4.9Cached · Upstream SHA-256 matchedDownload942999ee…550b11
2.5.0Cached · Upstream SHA-256 matchedDownload548e2192…ba3589
2.5.1Cached · Upstream SHA-256 matchedDownloadf21b32ff…1dfa4d
2.5.3Cached · Upstream SHA-256 matchedDownloadc86fedfb…f7b5c9
2.6.0Cached · Upstream SHA-256 matchedDownloadbd6e656a…744c75
2.6.1Cached · Upstream SHA-256 matchedDownload59062512…a72959
3.0.0-dev.0Cached · Upstream SHA-256 matchedDownload41918a79…d2b723
3.0.0-dev.1Cached · Upstream SHA-256 matchedDownload2aaf880d…dcbc85
3.0.0-dev.2Cached · Upstream SHA-256 matchedDownload5bf1b037…48f915
3.0.0-dev.3Cached · Upstream SHA-256 matchedDownload0f41a697…44eaf2
3.0.0-dev.12Cached · Upstream SHA-256 matchedDownload114b10d3…b9700e
3.0.0-dev.13Cached · Upstream SHA-256 matchedDownload67aac6ba…429c52
3.0.0-dev.14Cached · Upstream SHA-256 matchedDownloaddaed1b04…173d63
3.0.0-dev.15Cached · Upstream SHA-256 matchedDownload4369c46c…2a37f9
3.0.0-dev.16Cached · Upstream SHA-256 matchedDownload0aa816ff…628f31
3.0.0-dev.17Cached · Upstream SHA-256 matchedDownload82507cfb…e91b8e
3.0.0-dev.18Cached · Upstream SHA-256 matchedDownloada64ca86e…2c85a6
3.0.0Cached · Upstream SHA-256 matchedDownload135723ec…be6d05
3.0.1Cached · Upstream SHA-256 matchedDownloadb21446f0…ce4810
3.0.2Cached · Upstream SHA-256 matchedDownloadf51e4fb8…81f564
3.0.3Cached · Upstream SHA-256 matchedDownloadc406de02…16aa59
3.1.0Cached · Upstream SHA-256 matchedDownload16ff608d…d4935a
3.2.0Cached · Upstream SHA-256 matchedDownload90266762…ec66f1
3.2.1Cached · Upstream SHA-256 matchedDownload8c22216b…279f83
3.3.2-dev.1Cached · Upstream SHA-256 matchedDownloadb3dd973b…d44461
3.3.2-dev.2Cached · Upstream SHA-256 matchedDownloadda723396…042b3f
3.3.2Cached · Upstream SHA-256 matchedDownload17100416…126c76
3.4.0Cached · Upstream SHA-256 matchedDownloadb4184653…48d786
3.4.1Cached · Upstream SHA-256 matchedDownloadccd1d45f…21b436
3.4.2Cached · Upstream SHA-256 matchedDownload84351b34…8e50f1
3.4.3Cached · Upstream SHA-256 matchedDownload484dfc87…ba4b7a

Dependencies

collection "^1.15.0"

meta "^1.3.0"

state_notifier "^0.7.0"