AgentStack
Browse Sign in
Browse Why AgentStack Sell Docs
Sign in
SKILL verified BSD-3-Clause Self-run

Riverpod From Provider

skill-serverpod-skills-registry-riverpod-from-provider · by serverpod

Migrate from package:provider to Riverpod; ChangeNotifierProvider, ProxyProvider to ref.watch, context.watch to ref.watch, ConsumerWidget, incremental migration, family and autoDispose. Use when the user is migrating from Provider to Riverpod, or asks about Provider vs Riverpod, or how to replace ProxyProvider/ChangeNotifierProvider.

No reviews yet
0 installs
20 views
0.0% view→install

Install

$ agentstack add skill-serverpod-skills-registry-riverpod-from-provider

✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access No
  • Filesystem access No
  • Shell / process execution No
  • Environment & secrets No
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

View the full security report →

Verified badge

Passed review? Show it. Paste this badge into your README, it links to the public security report.

AgentStack Verified badge Links to your public security report.
[![AgentStack Verified](https://agentstack.voostack.com/badges/verified.svg)](https://agentstack.voostack.com/security/report/skill-serverpod-skills-registry-riverpod-from-provider)

Reliability & compatibility

Security review passed
0 installs to date
no reviews yet
5mo ago

Declared compatibility

Claude CodeClaude Desktop

Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.

Preview Execution monitoring

We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.

How agent discovery & health will work →
Are you the author of Riverpod From Provider? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

Riverpod — Migrating from Provider

Motivation

Riverpod was created as a successor to Provider, addressing InheritedWidget limitations:

  • Same type: Provider can't have two Provider in the tree (only the nearest is found). Riverpod has no such limit; providers are identified by variable, not type.
  • Combining providers: ProxyProvider is tedious and error-prone. In Riverpod, use ref.watch inside a provider to depend on others; composition is straightforward.
  • AsyncValue: Riverpod can expose previous data while loading (e.g. show old list + loading indicator). Provider doesn't offer this cleanly.
  • Safety: Provider can throw ProviderNotFoundException at runtime. Riverpod avoids this by design.
  • Disposal: Provider can't react when consumers stop listening; scoping is tricky. Riverpod offers autoDispose and ref.keepAlive for clear lifecycle and caching.
  • Parameters: Riverpod's .family gives type-safe, parameterized providers with per-parameter state; with autoDispose, state is disposed when unused. Equivalent in Provider is impractical.
  • Testing: With Provider you must re-define providers per test. With Riverpod, override with overrides to mock.
  • Side effects: Riverpod offers ref.listen for reacting to changes (e.g. navigation, snackbars). Provider has no built-in equivalent.

The main API change: use ConsumerWidget (and WidgetRef) instead of StatelessWidget, and ref.watch / ref.read instead of context.watch / context.read.


Quickstart

  • Read the Riverpod getting started guide (riverpod-getting-started) and try a small example.
  • Migrate incrementally. You can run Provider and Riverpod side by side (use import aliases if needed).

Start with ChangeNotifierProvider

Keep existing ChangeNotifier classes and wrap them in Riverpod's ChangeNotifierProvider:

final myNotifierProvider = ChangeNotifierProvider((ref) => MyNotifier());

Use ProviderScope at the root. Replace context.watch with ref.watch where this provider is used (e.g. in a ConsumerWidget). No need to convert every ChangeNotifier to a Notifier immediately.

Start with leaves

Migrate providers that have no dependencies first (the "leaves"), then those that depend on them. Avoid migrating ProxyProviders until their dependencies are migrated.

One provider at a time

Migrate and test one provider at a time. Full migration of a ChangeNotifier means: (1) convert to Notifier + NotifierProvider, (2) replace every context.watch for it with ref.watch.

ProxyProvider → ref.watch

In Riverpod, combining providers is done with ref.watch inside another provider:

final labelProvider = Provider((ref) {
  final userIdNotifier = ref.watch(userIdNotifierProvider);
  return 'The user ID is ${userIdNotifier.userId}';
});

For stateful combined objects (like ChangeNotifierProxyProvider), use ref.listen in the provider to react to another provider and update your notifier.

Eager initialization

Riverpod providers are lazy. To warm data at startup, watch the provider at the root (e.g. in a Consumer under ProviderScope that returns your app as child). See riverpod-eager-initialization.

Code generation

Code gen doesn't generate ChangeNotifierProvider. You can use a small extension (listenAndDisposeChangeNotifier) to expose ChangeNotifier with @riverpod during migration; once you switch to Notifier, remove the extension. See the official quickstart for the snippet.


Provider vs Riverpod

Defining providers

  • Provider: Providers are widgets (e.g. inside MultiProvider).
  • Riverpod: Providers are top-level final variables. No widget tree for definitions. Add ProviderScope at the root of the app.

Reading

  • Provider: context.watch(), context.read(), context.select(...).
  • Riverpod: Use ConsumerWidget (or Consumer) to get WidgetRef ref; then ref.watch(provider), ref.read(provider), ref.watch(provider.select(...)).
  • Use watch in build, read in event handlers. Same mental model as Provider.

Consumer

Riverpod has Consumer with (context, ref, child). No need for Consumer2, Consumer3, etc.: just multiple ref.watch calls in one builder.

Scoping vs family + autoDispose

Provider uses scoping to destroy state or have per-page state. In Riverpod:

  • autoDispose destroys state when there are no listeners (ref.onCancel / ref.onDispose).
  • .family gives parameterized providers (one state per parameter). Use with autoDispose to avoid unbounded cache.

So: use .family for "state per X" and .autoDispose for "destroy when unused" instead of scoping.

See riverpod-getting-started, riverpod-providers, riverpod-family, and riverpod-auto-dispose for details.

Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet, be the first.

Versions

  • v0.1.0 Imported from the upstream source.