Dagger2和相关组件预选赛(Dagger2 and qualifiers in dependen

2019-09-29 09:15发布

我有一个应用程序组件和相关组件。 该应用程序组件声明显式依赖,并且依赖组件可以注入的。 然而,当我有一个依赖,我有一个@Qualifier的歧义,依赖组件无法注入这种依赖性。

这是应用程序组件

@Component(modules = [AppModule::class, SchedulersModule::class, StorageModule::class])

@ApplicationScope
interface AppComponent {
    fun inject(app: Application)
    /* other stuff omitted for brevity */
    val bitmapCache: BitmapCache        
    @UiScheduler fun uiScheduler(): Scheduler
}

这是日程安排程序模块:

@Module
class SchedulersModule {
    @ApplicationScope
    @Provides
    @IoScheduler
    fun provideIoScheduler(): Scheduler = Schedulers.io()

    @ApplicationScope
    @Provides
    @UiScheduler
    fun provideMainThreadScheduler(): Scheduler = AndroidSchedulers.mainThread()
}

这是预选赛:

@Qualifier
@Retention(AnnotationRetention.RUNTIME)
annotation class UiScheduler

这是依赖组件:

@Component(
        dependencies = [AppComponent::class],
        modules = [EditEntryActivityModule::class, ViewModelModule::class]
)

@ActivityScope
interface EditEntryActivityComponent {
    fun inject(editEntryActivity: EditEntryActivity)
    fun inject(editEntryFragment: EditEntryFragment)
}

这是调度程序是如何在片段注入:

class EditEntryFragment : Fragment() {
    @Inject @UiScheduler lateinit var uiScheduler: Scheduler
    /* other stuff */
}

那么,为什么可以依赖组件注入位图缓存,在父组件声明,而不是UI调度? 这是我的错误:

error: io.reactivex.Scheduler cannot be provided without an @Provides- or @Produces-annotated method.
  io.reactivex.Scheduler is injected at
      com.test.edit.EditEntryFragment.uiScheduler
  com.test.edit.EditEntryFragment is injected at
      com.test.edit.EditEntryActivityComponent.inject(arg0)
1 error

Answer 1:

类EditEntryFragment UiScheduler:使用@field



Answer 2:

尝试@Named annotition

@Inject @field:Named("UiScheduler") lateinit var uiScheduler: Scheduler

看看这个问题



文章来源: Dagger2 and qualifiers in dependent components