Riverpod中Provider或FutureProvider内部AsyncValue加载状态处理方案
Riverpod 异步依赖加载态处理方案
1. 外层为同步 Provider<int> 的场景
首先你当前写法存在的核心约束是:同步 Provider<T> 只能返回固定类型 T 的值,本身没有预留加载、错误状态的表达能力,所以你有3种可选处理方案:
- 方案1:修改外层Provider返回类型为
AsyncValue<int>,直接透传异步状态
代码示例:
消费该Provider时直接按AsyncValue的常规写法处理加载、错误、数据态即可。final myProvider = Provider<AsyncValue<int>>((ref) { final myAsyncValue = ref.watch(someFutureProvider); return myAsyncValue.when( data: (rawData) => AsyncData(compute_something(rawData)), loading: () => const AsyncValue.loading(), error: (e, st) => AsyncValue.error(e, st), ); }); - 方案2:返回业务兜底默认值
如果加载态不需要在UI侧展示,你可以在loading分支直接返回符合int类型的默认值,比如返回0、-1等业务约定的兜底值即可。 - 方案3:加载态抛异常(不推荐)
你也可以在loading分支直接抛出异常,和当前error分支的处理逻辑一致,但需要在消费侧主动捕获异常,容易引发未捕获的运行时错误,不建议使用。
2. 外层改为 FutureProvider<int> 的场景
这种场景不需要你手动处理加载态,FutureProvider本身就会自动封装异步请求的加载、错误、数据状态,你可以直接监听内部FutureProvider的future属性等待完成即可:
代码示例:
final myProvider = FutureProvider<int>((ref) async { // 直接等待内部异步Provider的future完成,无需手动处理loading final rawData = await ref.watch(someFutureProvider.future); return compute_something(rawData); });
内部someFutureProvider处于加载状态时,外层myProvider会自动进入loading状态,错误也会自动向上传递,消费侧直接按常规AsyncValue的when方法处理即可。
基础概念补充
如果你需要依赖异步Provider,优先选择外层也使用异步Provider(FutureProvider/StreamProvider),不需要手动维护状态传递;如果必须使用同步Provider,就要显式用AsyncValue包裹返回值来承载异步的三种状态,不能要求同步Provider直接返回基础类型的同时还能表达加载、错误状态。
内容的提问来源于stack exchange,提问作者imi kim
相关产品推荐
相关产品推荐

