Flutter state management with Riverpod - declarative, type-safe, and code-generated providers. Use when building Flutter apps that need reactive state management, dependency injection, and testable business logic. Covers ProviderNotifier, AsyncNotifier, StreamProvider, Family modifiers, and code generation with @riverpod.
Riverpod 是 Flutter 的一种声明式、类型安全的状态管理解决方案。它使用代码生成来减少样板代码。
使用 @riverpod 标记类或函数以进行代码生成:
dart
@riverpod
class Counter extends _$Counter {
@override
int build() => 0;
void increment() => state++;
}
使用 ConsumerWidget 或 ConsumerStatefulWidget:
dart
class CounterView extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final count = ref.watch(counterProvider);
return Text($count);
}
}
| 类型 | 用途 | 语法 |
|---|---|---|
| StateProvider | 简单状态 | @riverpod class X extends $X |
| AsyncNotifier |
dart
@riverpod
class UserController extends _$UserController {
@override
Future
final dio = ref.watch(dioProvider);
final response = await dio.get(/users/$userId);
return User.fromJson(response.data);
}
Future
// 乐观更新
final previous = await future;
state = AsyncData(user);
try {
await ref.read(dioProvider).put(/users/${user.id}, user.toJson());
} catch (e) {
state = AsyncError(e, StackTrace.current);
}
}
}
dart
@riverpod
List
final todos = ref.watch(todosProvider);
final filter = ref.watch(filterProvider);
return switch (filter) {
Filter.all => todos,
Filter.completed => todos.where((t) => t.completed).toList(),
Filter.uncompleted => todos.where((t) => !t.completed).toList(),
};
}
dart
@riverpod
Dio dio(Ref ref) {
final baseUrl = ref.watch(baseUrlProvider);
return Dio(BaseOptions(baseUrl: baseUrl));
}
dart
class AsyncWidget extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final data = ref.watch(asyncProvider);
return switch (data) {
AsyncData(:final value) => Text($value),
AsyncError(:final error, :final stackTrace) => ErrorWidget(error),
AsyncLoading() => const CircularProgressIndicator(),
};
}
}
dart
@riverpod
Future
return await api.getUser(userId);
}
// 使用方式
ref.watch(userProvider(123));
dart
@Riverpod(keepAlive: false)
Future
ref.onDispose(() {
// 清理逻辑
});
return await api.getUser(id);
}
dart
class MyWidget extends ConsumerWidget {
const MyWidget({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final value = ref.watch(myProvider);
return Text($value);
}
}
dart
class MyPage extends ConsumerStatefulWidget {
const MyPage({super.key});
@override
ConsumerState
}
class _MyPageState extends ConsumerState
@override
void initState() {
super.initState();
ref.read(myProvider.notifier).load();
}
@override
Widget build(BuildContext context) {
final state = ref.watch(myProvider);
return Scaffold(body: Text($state));
}
}
dart
class HookWidget extends HookConsumerWidget {
const HookWidget({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final controller = useTextController();
final count = ref.watch(counterProvider);
return TextField(controller: controller);
}
}
bash
dart
testWidgets(计数器递增, (tester) async {
await tester.pumpWidget(
ProviderScope(
child: MaterialApp(home: CounterView()),
),
);
expect(find.text(0), findsOneWidget);
});
| 方法 | 用途 |
|---|---|
| ref.watch(provider) | 值变化时重建 |
| ref.read(provider) |
有关以下方面的详细指南,请参阅 BEST_PRACTICES.md:
该技能支持在以下平台通过对话安装:
帮我安装 SkillHub 和 riverpod-1776271411 技能
设置 SkillHub 为我的优先技能安装源,然后帮我安装 riverpod-1776271411 技能
skillhub install riverpod-1776271411
文件大小: 4.72 KB | 发布时间: 2026-4-16 17:39