【问题标题】:Dagger2 Circular Dependency ErrorDagger2 循环依赖错误
【发布时间】:2018-07-18 10:59:28
【问题描述】:

我在我的 android 项目中使用 dagger2 2.16 版本进行依赖注入。我检查了很多例子,虽然我没有类似的方法,但我得到了“循环依赖”的错误。 挖掘源代码; AppComponent.kt

@Singleton
@Component(
        modules = [
            AndroidSupportInjectionModule::class,
            AppModule::class,
            ActivityBuilderModule::class]
)
interface AppComponent {
    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(application: Application): Builder

        fun build(): AppComponent
    }

    fun inject(app: App)
}

App.kt

class App : Application(), HasActivityInjector {

    @Inject
    lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity>

    override fun onCreate() {
        super.onCreate()
        AppInjector.init(this)
        initOneSignal()
    }

    private fun initOneSignal() = OneSignal.startInit(this).setNotificationOpenedHandler(CustomNotificationOpenedHandler()).inFocusDisplaying(OneSignal.OSInFocusDisplayOption.Notification).init()


    override fun activityInjector() = dispatchingAndroidInjector
}

ActivityBuilderModule.kt

@Module
abstract class ActivityBuilderModule {
    @ContributesAndroidInjector
    abstract fun contributeSplashActivity(): SplashActivity
}

AppModule.kt

@Module(includes = [(ViewModelModule::class)])
class AppModule {

    @Singleton
    @Provides
    fun provideContext(app: Application): Context = app.applicationContext;

    @Singleton
    @Provides
    fun provideApiService(client: OkHttpClient): ApiService {
        return Retrofit.Builder()
                .baseUrl(Constants.baseUrl)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build()
                .create(ApiService::class.java)
    }

    @Singleton
    @Provides
    fun provideOkHttpClient(interceptor: HttpLoggingInterceptor): OkHttpClient {
        return OkHttpClient.Builder().addInterceptor(interceptor).build()
    }

    @Singleton
    @Provides
    fun provideHttpLoggingInterceptor(): HttpLoggingInterceptor {
        val interceptor = HttpLoggingInterceptor()
        interceptor.level = HttpLoggingInterceptor.Level.BODY
        return interceptor
    }
}

如果我从 AppComponent 中删除 ActivityBuilderModule,则项目编译没有问题。但是如果你添加到模块部分,项目会给出下面的错误。

错误:[ComponentProcessor:MiscError] dagger.internal.codegen.ComponentProcessor 无法处理这个 接口,因为并非所有依赖项都可以解决。查看 用于编译错误或生成代码的循环依赖。

请帮帮我。

【问题讨论】:

    标签: dagger-2


    【解决方案1】:

    在 App.kt 中,您需要使用应用程序上下文初始化组件。线

    AppInjector.init(this)
    

    应该在 Activity 中,即你要在其中注入依赖项的 splashActivity。

    【讨论】:

    • 嗨。正如你所说,我在这里初始化组件。这是AppInjector源代码link
    • 你想说什么? @AhmetBurakDemirkoparan
    • 如你所说,我正在 AppInjector 中初始化 dagger 组件。我贡献活动时项目未编译。
    • 您是否从 App.kt 中删除了 AppInjector.init(this) 这一行?如果您已删除,现在显示的错误是什么?
    • 尽管删除了该行,但当我重建项目时仍然会出现同样的错误。
    【解决方案2】:

    上面提到的错误信息也可能出现,因为 kotlin stdlib 没有被声明为依赖。所以添加例如implementation("org.jetbrains.kotlin:kotlin-stdlib:1.3.60") 在您的 build.gradle(.kts) 文件中也可能有帮助。

    【讨论】:

      猜你喜欢
      • 2017-10-10
      • 2021-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 2023-03-25
      • 1970-01-01
      • 2019-02-21
      相关资源
      最近更新 更多