Riverpod v1稳定版StateProvider旧示例失效,新写法是否正确?
回答
你给出的适配Riverpod v1稳定版的改写代码可正常运行,核心适配逻辑完全正确。
适配正确性说明
Riverpod v1稳定版对StateProvider的取值、改值逻辑做了拆分调整,旧版0.x的API不再兼容:
- 旧版中
ref.watch(selectedProductIdProvider)返回的是StateController实例,所以需要额外访问.state才能拿到实际的状态值,也可以直接通过这个实例修改state - 新版中API做了职责拆分:
- 仅监听状态值变化直接用
ref.watch(selectedProductIdProvider),返回的就是你定义的泛型类型的状态值(示例里就是String?类型的选中商品ID),不需要再访问.state - 要修改状态需要单独通过
ref.watch(selectedProductIdProvider.notifier)拿到StateController实例,再修改它的state属性
- 仅监听状态值变化直接用
你的改写完全符合新版的API规则,运行不会出错。
可优化点
你代码中获取selectedProductIdController的逻辑用ref.read会更优:
// 因为StateController实例本身不会变化,不需要监听它的更新,用read性能更好 final selectedProductIdController = ref.read(selectedProductIdProvider.notifier);
你现有写法用ref.watch也不会触发异常,只是存在不必要的监听开销。
内容的提问来源于stack exchange,提问作者kodaira
相关产品推荐
相关产品推荐

