关于 riverpod-consumers
此 Riverpod 技能说明 Flutter Widget 如何通过不同 Consumer 类型访问并监听 Provider,帮助开发者根据状态需求选择 Consumer、ConsumerWidget 或 ConsumerStatefulWidget。
主要功能
- 01在现有 Widget 类中使用 Consumer
- 02通过 ConsumerWidget 和 WidgetRef 构建
- 03用 ConsumerStatefulWidget 管理本地状态
- 04按 Widget 需求选择 Consumer 类型
- 05了解基于 ref 的 Provider 监听
适用场景
- 01从 StatelessWidget 读取 Provider
- 02在有状态 Widget 中监听 Provider
- 03在动画或 TabController 中使用 Provider 数据
- 04选择 Riverpod Consumer 模式
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ serverpod/ skills-registry --skill riverpod-consumers安装后在 Claude Code 中输入/riverpod-consumers确认已加载。
详细介绍
Riverpod — 消费者
说明
消费者是提供 Ref(此处为 WidgetRef)的组件,供你读取和监听提供者。没有 Consumer,组件就无法访问提供者树。
Consumer(构建器)
如果你想继续使用 StatelessWidget 或 StatefulWidget,请使用 Consumer。构建器回调会接收 (context, ref, child)。
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Consumer(
builder: (context, ref, _) {
final value = ref.watch(myProvider);
return Text(value.toString());
},
);
}
}
ConsumerWidget
继承 ConsumerWidget,而不是 StatelessWidget。build 方法会接收 (BuildContext context, WidgetRef ref)。
class MyWidget extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final value = ref.watch(myProvider);
return Text(value.toString());
}
}
ConsumerStatefulWidget + ConsumerState
如果需要 State(例如用于生命周期或本地状态),请使用 ConsumerStatefulWidget 和 ConsumerState。状态对象有一个 ref 属性。
class MyWidget extends ConsumerStatefulWidget {
@override
ConsumerState<MyWidget> createState() => _MyWidgetState();
}
class _MyWidgetState extends ConsumerState<MyWidget> {
@override
Widget build(BuildContext context) {
final value = ref.watch(myProvider);
return Text(value.toString());
}
}
该用哪种
- Consumer — 如果你不想更改组件基类,所有情况都可以使用;只是会稍微冗长一些。
- ConsumerWidget — 如果不需要 State,推荐使用;嵌套层级更少。
- ConsumerStatefulWidget — 如果需要 State(例如 TabController、动画),请使用。
为什么不使用 StatelessWidget + context.watch?
Riverpod 不使用 BuildContext 来监听提供者,因为这会破坏 auto-dispose 以及其他依赖于获知组件何时停止监听的功能。基于 Ref 的消费者可以确保可靠释放和正确行为。hooks_riverpod 包还提供了 HookConsumerWidget 等组件,供 flutter_hooks 使用。启用 riverpod_lint 可进行 IDE 重构(例如“转换为 ConsumerWidget”)。
评论
支持 Markdown