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.mdsource 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
annotations. Avoid manual@riverpod
definitions.Provider - Immutability: Use
for all state models.Freezed - ref.watch(): Inside
to rebuild on changes.build() - ref.listen(): Inside
for side-effects (navigation, dialogs). Never in provider init.build() - ref.read(): ONLY in callbacks (
).onPressed - Testing: Override providers with
.ProviderScope(overrides: [provider.overrideWithValue(Mock())]) - Linting: Enable
andriverpod_lint
for cycle detection.custom_lint
Anti-Patterns
- No side-effects in provider init: Use
in widgets instead.ref.listen() - No BuildContext in Notifiers: Never pass
into Notifier/Provider.BuildContext - No local provider instantiation: Keep providers global; avoid dynamic creation.