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
相关产品推荐
相关产品推荐

