You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Riverpod时如何正确获取Freezed联合类的底层数据?

规范实现方案

1. 优先使用Freezed内置模式匹配替代手动类型判断

你当前手动通过is做类型判断的写法可以运行,但不属于Freezed联合类的推荐写法,Freezed已经为联合类自动生成了when/maybeWhen模式匹配方法,相比手动判断有两个核心优势:

  • 编译器会自动校验分支覆盖度,后续新增ProductState子类时会强制你处理新分支,避免遗漏逻辑
  • 语法更简洁,不需要手动写类型转换代码

示例用法:

final productState = ref.watch(createProductProvider);
// 需要处理所有状态分支时用when
productState.when(
  loading: () {
    // 处理加载状态逻辑
  },
  created: (product) {
    final currentProduct = product;
    // 处理拿到产品数据的逻辑
  },
);

// 如果只需要处理created状态,其余状态走通用逻辑用maybeWhen
final currentProduct = productState.maybeWhen(
  created: (product) => product,
  orElse: () => null,
);

2. 是否需要创建额外Provider按需决定

不需要强制新建Provider,两种场景的选择逻辑:

  • 如果仅在单个位置需要访问product值,直接在对应位置写模式匹配代码即可,没必要额外抽Provider
  • 如果product值需要在多个位置复用,或者你需要基于这个product生成其他衍生状态,完全可以抽一个独立的衍生Provider,避免多处重复写模式匹配代码:
// 衍生Provider,仅暴露创建完成的Product对象,非created状态返回null
final currentCreatedProductProvider = Provider<Product?>((ref) {
  final productState = ref.watch(createProductProvider);
  return productState.maybeWhen(
    created: (product) => product,
    orElse: () => null,
  );
});

后续其他位置需要访问已创建的产品时,直接监听currentCreatedProductProvider即可。

内容的提问来源于stack exchange,提问作者ccnrbrn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 23:03:03