首页 > 解决方案 > @Component.Builder 缺少所需模块或组件的设置器:[com.sample.TestComponent]

问题描述

关于上述问题,SO中有很多答案,但是我的情况不同,对我来说,缺少组件的设置器。

我有 ApplicationComponent,它依赖于来自库的其他一些组件 [TestComponent]。

@AppScope
@Component(
    dependencies = [TestComponent::class],
    modules = [
        AppModule::class,
        AndroidInjectionModule::class
    ]
)
interface AppComponent : AndroidInjector<MyApplication> {

    override fun inject(application: MyApplication)

    @ContextIO
    fun getIOCoroutineContext(): CoroutineContext

    @Component.Builder
    interface Builder {

        @BindsInstance
        fun application(application: Application): Builder

        @BindsInstance
        fun testComponent(testComponent: TestComponent): Builder

        fun build(): AppComponent
    }
}

和应用类

class MyApplication : DaggerApplication() {

  val appComponent by lazy {
    DaggerAppComponent.builder()
        .application(this)
        .testComponent(SdkInjectors.testComponent())
        .build()
  }
}


@Singleton
@Component(
    modules = {VideoModule.class, AnalyticsModule.class}
)
public interface TestComponent {

  // ...
}

标签: androiddependency-injectiondagger-2

解决方案


偶然发现了一些开源项目并发现了这一点,我不应该在创建依赖组件时使用@BindsInstance。

@AppScope
@Component(
    dependencies = [TestComponent::class],
    modules = [
        AppModule::class,
        AndroidInjectionModule::class
    ]
)
interface AppComponent : AndroidInjector<MyApplication> {

    override fun inject(application: MyApplication)

    @ContextIO
    fun getIOCoroutineContext(): CoroutineContext

    @Component.Builder
    interface Builder {

        @BindsInstance
        fun application(application: Application): Builder
      
        fun testComponent(testComponent: TestComponent): Builder

        fun build(): AppComponent
    }
}

删除 @BindsInstance 有效,但我仍然不知道原因,如果我知道会更新。


推荐阅读