Riverpod中监听Provider值存在延迟,如何修复及定位原因?
Riverpod监听Provider值延迟问题的原因与修复
问题原因
当前provider2的实现逻辑是通过ref.watch(provider1)监听provider1的AsyncValue状态,仅当provider1状态更新为data时才创建新的Stream.value(value)流。而await _streamController.addStream(...)仅等待原始流(Stream.value(42))的事件被_streamController处理完毕,provider2动态创建的新流的事件会被推迟到当前异步任务完成后的事件循环周期执行,因此listener2()会在Done之后打印。
修复方案
让provider2直接基于provider1的原始流进行转换,而非在状态变化时动态创建新流,确保两个流的事件处理同步。
修改后的provider2代码:
final provider2 = StreamProvider<int?>((ref) { return ref.watch(provider1.stream).map((asyncValue) { return asyncValue.maybeWhen( orElse: () => null, data: (value) { print('listener2()'); return value; }, ); }); });
逻辑说明
- 使用
ref.watch(provider1.stream)监听provider1的原始数据流,而非其包装后的AsyncValue状态 - 通过
map操作直接转换流中的每个AsyncValue事件,避免创建独立的新流,确保listener2()的执行与listener1()处于同一事件循环周期
测试结果
点击按钮后,控制台打印顺序将符合预期:
I/flutter (15845): listener1() I/flutter (15845): listener2() I/flutter (15845): Done
内容的提问来源于stack exchange,提问作者iDecode
相关产品推荐
相关产品推荐

