Agent-skills-standard flutter-riverpod-state-management

Implement reactive state management using Riverpod 2.0 with code generation in Flutter. Use when defining @riverpod providers, building AsyncNotifiers, overriding providers in tests, or enforcing immutable state with Freezed models. (triggers: **_provider.dart, **_notifier.dart, riverpod, ProviderScope, ConsumerWidget, Notifier, AsyncValue, ref.watch, @riverpod)

install
source · Clone the upstream repo
git clone https://github.com/HoangNguyen0403/agent-skills-standard
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/HoangNguyen0403/agent-skills-standard "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/flutter/flutter-riverpod-state-management" ~/.claude/skills/hoangnguyen0403-agent-skills-standard-flutter-riverpod-state-management && rm -rf "$T"
manifest: skills/flutter/flutter-riverpod-state-management/SKILL.md
source content

Riverpod State Management

Priority: P0 (CRITICAL)

Structure

lib/
├── providers/ # Global providers and services
└── features/user/
    ├── providers/ # Feature-specific providers
    └── models/    # @freezed domain models

Provider Definition (Generator-First)

Use

@riverpod
annotations for all provider definitions. See implementation examples for full provider and consumer patterns.

Consuming Providers

Use

ConsumerWidget
with
ref.watch()
and
AsyncValue.when()
for reactive UI. See implementation examples.

Implementation Guidelines

  • Generator First: Use
    @riverpod
    annotations. Avoid manual
    Provider
    definitions.
  • Immutability: Use
    Freezed
    for all state models.
  • ref.watch(): Inside
    build()
    to rebuild on changes.
  • ref.listen(): Inside
    build()
    for side-effects (navigation, dialogs). Never in provider init.
  • ref.read(): ONLY in callbacks (
    onPressed
    ).
  • Testing: Override providers with
    ProviderScope(overrides: [provider.overrideWithValue(Mock())])
    .
  • Linting: Enable
    riverpod_lint
    and
    custom_lint
    for cycle detection.

Anti-Patterns

  • No side-effects in provider init: Use
    ref.listen()
    in widgets instead.
  • No BuildContext in Notifiers: Never pass
    BuildContext
    into Notifier/Provider.
  • No local provider instantiation: Keep providers global; avoid dynamic creation.

Related Topics