关于 riverpod-scoping
此 Riverpod 技能介绍如何在非根 ProviderScope 中覆盖 Provider,使其仅影响应用的一部分,并说明依赖声明。文档也提醒,作用域功能较复杂,未来版本可能调整。
主要功能
- 01为 Provider 启用作用域
- 02声明作用域依赖
- 03在子树中覆盖值
- 04避免沿组件树传递 family 参数
适用场景
- 01自定义单个页面的主题等值
- 02仅重建发生变化的列表项
- 03向子树提供当前项目 ID
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ serverpod/ skills-registry --skill riverpod-scoping安装后在 Claude Code 中输入/riverpod-scoping确认已加载。
详细介绍
Riverpod — Provider 作用域
说明
作用域指在非根级 ProviderScope 中覆盖某个 provider,从而只更改应用部分区域内该 provider 的行为。适用场景:针对页面进行定制(例如为某个页面设置主题)、提升性能(例如在 ListView 中只重建发生变化的项),或避免在树中传递 family 参数。
**注意:**作用域较为复杂,未来的 Riverpod 版本中可能会重新设计。请谨慎使用。
启用:dependencies
默认情况下,你无法为 provider 设置作用域。通过为 provider 设置 dependencies 来启用。第一个设置作用域的 provider 通常使用 dependencies: const []。
final currentItemIdProvider = Provider<String?>(
dependencies: const [],
(ref) => null,
);
监听设置了作用域的 provider
像往常一样使用 ref.watch/ref.read。如果另一个 provider 监听了设置作用域的 provider,则该监听 provider 必须在其 dependencies 中列出该 provider:
final currentItemProvider = FutureProvider<Item?>(
dependencies: [currentItemIdProvider],
(ref) async {
final currentItemId = ref.watch(currentItemIdProvider);
if (currentItemId == null) return null;
return fetchItem(id: currentItemId);
},
);
dependencies 中只需列出设置了作用域的 provider;未设置作用域的 provider 无需列出。
设置作用域值:overrides
在包裹目标子树的 ProviderScope 上使用 overrides,即可应用作用域值:
ProviderScope(
overrides: [
currentItemIdProvider.overrideWithValue('123'),
],
child: const DetailPageView(),
)
这样,详情页就能将 '123' 视为当前项 ID,而无需手动向下传递。覆盖语法请参阅 riverpod-overrides。
评论
支持 Markdown