Dagger 2.11升级后出现[dagger.android.AndroidInjector.inject(T)]依赖循环错误
我仔细看了你的错误日志和代码,立刻找到了问题的根源——你的AppModules里的provideAPI方法完全写反了,直接导致了循环依赖。
问题分析
从错误日志的依赖链能清晰看到循环的起点:
com.example.anbu.mvpkotlin.data.network.NccApi is injected at com.example.anbu.mvpkotlin.di.modules.AppModules.provideAPI$app_debug(apiManager)
com.example.anbu.mvpkotlin.data.network.NccApi is injected at com.example.anbu.mvpkotlin.ui.accounts.interactor.AccountInteractor.<init>(…, api)
你在AppModules里写了这段逻辑矛盾的代码:
@Provides @Singleton internal fun provideAPI(apiManager: NccApi): NccApi = apiManager
这相当于告诉Dagger:“我需要一个NccApi实例,才能提供NccApi实例”——这本身就是死循环:Dagger要创建NccApi,得先调用这个方法,但调用这个方法又需要先拿到NccApi实例,自然触发依赖循环报错。
之前2.11版本没报错,大概率是旧版Dagger没有严格检测这种无效的Provider方法,而2.11增强了依赖循环的检测逻辑,所以现在这个隐藏问题被暴露出来了。
解决方案
步骤1:删除AppModules中的无效provideAPI方法
直接删掉这行代码,它完全是多余的,而且是循环依赖的核心诱因。
步骤2:在RetrofitModule中添加正确的NccApi Provider
RetrofitModule负责创建Retrofit实例,所以应该在这里提供NccApi的实例,添加以下代码:
@Provides @Singleton internal fun provideNccApi(retrofit: Retrofit): NccApi { return retrofit.create(NccApi::class.java) }
同时确保RetrofitModule中有完整的Retrofit Provider(如果还没补全的话):
@Provides @Singleton internal fun provideRetrofit(gson: Gson, okHttpClient: OkHttpClient): Retrofit { return Retrofit.Builder() .baseUrl(mBaseUrl) .addConverterFactory(GsonConverterFactory.create(gson)) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // 适配你用到的RxJava .client(okHttpClient) .build() }
步骤3:验证依赖链路
现在Dagger会通过RetrofitModule正常创建NccApi实例,再依次注入到AccountInteractor、AccountPresenter,最终到AccountActivity,整个依赖链路没有循环,编译就能正常通过了。
额外检查
- 确保
RetrofitModule已经被添加到AppComponent的modules列表中,让Dagger能找到它的Provider方法; - 检查项目中是否有其他重复提供NccApi的代码,避免出现多实例冲突。
按照这个方案修改后,重新编译项目,依赖循环的问题应该就能彻底解决了。
内容的提问来源于stack exchange,提问作者Anbarasu Chinna

