返回顶部
r

riverpodRiverpod状态管理

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.

作者: admin | 来源: ClawHub
源自
ClawHub
版本
V 1.0.0
安全检测
已通过
280
下载量
免费
免费
0
收藏
概述
安装方式
版本历史

riverpod

Riverpod 状态管理

Riverpod 是 Flutter 的一种声明式、类型安全的状态管理解决方案。它使用代码生成来减少样板代码。

核心概念

1. 使用 @riverpod 进行声明式状态管理

使用 @riverpod 标记类或函数以进行代码生成:

dart
@riverpod
class Counter extends _$Counter {
@override
int build() => 0;

void increment() => state++;
}

2. 消费状态

使用 ConsumerWidget 或 ConsumerStatefulWidget:

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

3. Provider 类型

类型用途语法
StateProvider简单状态@riverpod class X extends $X
AsyncNotifier
异步加载 | @riverpod class X extends $X 配合 Future | | StreamProvider | 实时数据 | @riverpod Stream func(Ref ref) | | Family providers | 参数化 | @riverpod class X extends Family |

代码模式

模式 1:用于 API 调用的 AsyncNotifier

dart
@riverpod
class UserController extends _$UserController {
@override
Future build(String userId) async {
final dio = ref.watch(dioProvider);
final response = await dio.get(/users/$userId);
return User.fromJson(response.data);
}

Future updateUser(User user) async {
// 乐观更新
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);
}
}
}

模式 2:组合 Provider

dart
@riverpod
List filteredTodos(Ref ref) {
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(),
};
}

模式 3:依赖注入

dart
@riverpod
Dio dio(Ref ref) {
final baseUrl = ref.watch(baseUrlProvider);
return Dio(BaseOptions(baseUrl: baseUrl));
}

模式 4:AsyncValue 模式匹配

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(),
};
}
}

Provider 修饰符

Family - 参数化 Provider

dart
@riverpod
Future user(UserRef ref, String userId) async {
return await api.getUser(userId);
}

// 使用方式
ref.watch(userProvider(123));

AutoDispose - 自动清理

dart
@Riverpod(keepAlive: false)
Future temporaryUser(TemporaryUserRef ref, String id) async {
ref.onDispose(() {
// 清理逻辑
});
return await api.getUser(id);
}

Widget 模式

ConsumerWidget 模式

dart
class MyWidget extends ConsumerWidget {
const MyWidget({super.key});

@override
Widget build(BuildContext context, WidgetRef ref) {
final value = ref.watch(myProvider);
return Text($value);
}
}

ConsumerStatefulWidget 模式

dart
class MyPage extends ConsumerStatefulWidget {
const MyPage({super.key});

@override
ConsumerState createState() => _MyPageState();
}

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));
}
}

HookConsumerWidget(配合 flutter_hooks)

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);
}
}

代码生成工作流程

  1. 1. 添加注解:@riverpod 或 @Riverpod()
  2. 定义继承 $ClassName 的类或函数
  3. 运行:flutter pub run buildrunner watch --delete-conflicting-outputs
  4. 生成文件:.g.dart 扩展名

基本命令

bash

一次性生成


flutter pub run build_runner build --delete-conflicting-outputs

监听变化(开发时推荐)

flutter pub run build_runner watch --delete-conflicting-outputs

测试

dart
testWidgets(计数器递增, (tester) async {
await tester.pumpWidget(
ProviderScope(
child: MaterialApp(home: CounterView()),
),
);

expect(find.text(0), findsOneWidget);
});

ref 方法

方法用途
ref.watch(provider)值变化时重建
ref.read(provider)
一次性读取,不重建 | | ref.listen(provider, cb) | 值变化时的副作用 | | ref.refresh(provider) | 强制重新加载 | | ref.invalidate(provider) | 标记为需要刷新 |

最佳实践

有关以下方面的详细指南,请参阅 BEST_PRACTICES.md

  • - Provider 架构
  • 避免常见陷阱
  • 性能优化
  • 测试策略

标签

skill ai

通过对话安装

该技能支持在以下平台通过对话安装:

OpenClaw WorkBuddy QClaw Kimi Claude

方式一:安装 SkillHub 和技能

帮我安装 SkillHub 和 riverpod-1776271411 技能

方式二:设置 SkillHub 为优先技能安装源

设置 SkillHub 为我的优先技能安装源,然后帮我安装 riverpod-1776271411 技能

通过命令行安装

skillhub install riverpod-1776271411

下载

⬇ 下载 riverpod v1.0.0(免费)

文件大小: 4.72 KB | 发布时间: 2026-4-16 17:39

v1.0.0 最新 2026-4-16 17:39
Riverpod 1.0.0 – Initial Release

- Introduces comprehensive documentation for Riverpod state management in Flutter.
- Covers provider types (ProviderNotifier, AsyncNotifier, StreamProvider, Family) and code generation via @riverpod.
- Includes code patterns for API calls, dependency injection, provider combination, and pattern matching with AsyncValue.
- Provides workflow for code generation and essential commands.
- Details best practices and testing strategies for scalable Flutter app development.

Archiver·手机版·闲社网·闲社论坛·智能体自动化市场· 多链控股集团有限公司 · 苏ICP备2025199260号-1

Powered by Discuz! X5.0   © 2024-2026 闲社网·AI智能体论坛·AI自动化解决方案·http://xianshe.com

p2p_official_large
返回顶部