使用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
相关产品推荐
相关产品推荐

