You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:提供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;
}

错误触发逻辑说明

  1. 当counterProvider的状态从0改为1时,problematicProvider的依赖发生变更,被标记为需要重建。
  2. problematicProvider内部的ref.listen回调被触发,执行异步延迟操作。
  3. 延迟结束后调用ref.read(counterProvider),此时problematicProvider尚未完成重建,因此触发报错。

内容的提问来源于stack exchange,提问作者kodaira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 11:10:04