mcpField
R
riverpod-scoping

riverpod-scoping

github.com/serverpod开发1073 次安装34 周前更新
代码仓库

关于 riverpod-scoping

此 Riverpod 技能介绍如何在非根 ProviderScope 中覆盖 Provider,使其仅影响应用的一部分,并说明依赖声明。文档也提醒,作用域功能较复杂,未来版本可能调整。

主要功能

  1. 01为 Provider 启用作用域
  2. 02声明作用域依赖
  3. 03在子树中覆盖值
  4. 04避免沿组件树传递 family 参数

适用场景

  1. 01自定义单个页面的主题等值
  2. 02仅重建发生变化的列表项
  3. 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