求助:提供Riverpod报错Cannot use ref functions的最小复现代码
Riverpod错误 'Cannot use ref functions after the dependency of a provider changed but before the provider rebuilt' 可复现示例
这个错误的核心触发场景是:在provider的依赖发生变更后、provider完成重建之前,调用了ref的相关方法(如ref.read、ref.watch等)。以下是可在DartPad运行的纯Dart最小复现代码(基于riverpod 2.1.1):
import 'package:riverpod/riverpod.dart'; void main() async { final container = ProviderContainer(); // 可变更的状态Provider final counterProvider = StateProvider<int>((ref) => 0); // 存在问题的Provider:依赖counterProvider,且在监听回调中异步调用ref方法 final problematicProvider = Provider<String>((ref) { final count = ref.watch(counterProvider); // 监听counter的状态变化 ref.listen(counterProvider, (previous, next) async { // 模拟异步操作,此时provider已因依赖变更标记为待重建 await Future.delayed(const Duration(milliseconds: 10)); // 此处调用ref.read会触发目标错误 ref.read(counterProvider); }); return '当前计数: $count'; }); // 监听problematicProvider的输出 container.listen(problematicProvider, (previous, next) { print(next); }); // 修改counter状态,触发监听回调 container.read(counterProvider.notifier).state = 1; }
错误触发逻辑说明
- 当
counterProvider的状态从0改为1时,problematicProvider的依赖发生变更,被标记为需要重建。 problematicProvider内部的ref.listen回调被触发,执行异步延迟操作。- 延迟结束后调用
ref.read(counterProvider),此时problematicProvider尚未完成重建,因此触发报错。
内容的提问来源于stack exchange,提问作者kodaira
相关产品推荐
相关产品推荐

