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

Riverpod Provider依赖注入引发堆内存耗尽问题求助

解决Provider依赖注入导致堆内存耗尽的问题

问题根源

出现堆内存耗尽的核心原因是循环依赖:client Provider初始化时读取getLanguageUseCase,而getLanguageUseCase的Provider可能间接依赖了client或dioHelper,导致两个Provider互相触发初始化,形成无限递归,最终把堆内存撑爆。

解决方法

方法1:延迟设置请求头

不在Dio初始化时直接读取getLanguageUseCase,而是在dioHelper初始化时动态配置header:

final client = Provider.autoDispose(
  (ref) => dio.Dio()
    ..interceptors.add(RequestsInspectorInterceptor())
    ..options.headers = {
      'Accept': 'application/json',
      'country_id': 'countryId',
    },
);

final dioHelper = Provider.autoDispose((ref) {
  final dio = ref.read(client);
  // 在这里读取语言配置并设置header
  final language = ref.read(getLanguageUseCase);
  dio.options.headers['Content-Lang'] = language;
  return DioHelper(dio: dio);
});

方法2:用拦截器动态注入请求头

这种方式更灵活,还能保证每次请求都拿到最新的语言值:

final client = Provider.autoDispose(
  (ref) => dio.Dio()
    ..interceptors.add(RequestsInspectorInterceptor())
    ..interceptors.add(
      dio.InterceptorsWrapper(
        onRequest: (options, handler) {
          // 每次请求时读取最新的语言配置
          final language = ref.read(getLanguageUseCase);
          options.headers['Content-Lang'] = language;
          handler.next(options);
        },
      ),
    )
    ..options.headers = {
      'Accept': 'application/json',
      'country_id': 'countryId',
    },
);

final dioHelper =
    Provider.autoDispose((ref) => DioHelper(dio: ref.read(client)));

方法3:排查并打破循环依赖

检查getLanguageUseCase的Provider代码,确认它是否直接或间接依赖了client或dioHelper。如果存在这种情况,需要重构代码打破循环——比如把getLanguageUseCase中依赖网络的逻辑拆分出来,避免它依赖Dio实例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 07:50:29