Riverpod中StreamProvider内处理AsyncValue加载状态的方案咨询
解决方案
loading分支直接返回无任何事件的空流即可,修改后的代码如下:
final aStreamProvider = StreamProvider((ref) => Stream.empty()); // 仅为示例,实际为复杂的流实现 final bStreamProvider = StreamProvider<int>((ref) { final myAsyncValue = ref.watch(aStreamProvider); return myAsyncValue.when( data: compute_something, loading: () => Stream<int>.empty(), error: (error, stackTrace) => Stream.error(error, stackTrace), ); });
实现逻辑说明
Stream.empty()不会发送任何data/error事件,完全符合你「aStreamProvider加载完成前不发送任何事件」的要求,此时bStreamProvider会自动处于loading状态,和上游状态对齐。- 当aStreamProvider的状态从loading切换为data/error时,
ref.watch(aStreamProvider)会触发bStreamProvider的创建回调重新执行,自动进入对应分支返回计算后的流,无需额外处理状态监听。 - 原写法中error分支直接抛出异常不符合Stream类型契约,修改为返回
Stream.error可以避免同步异常问题,行为更稳定。
可选优化
如果不需要对外暴露bStreamProvider的loading状态,希望等到上游加载完成后才推送第一个事件,可以配合StreamController做缓冲处理,上述方案已经可以覆盖绝大多数常规使用场景。
内容的提问来源于stack exchange,提问作者imi kim
相关产品推荐
相关产品推荐

