Dagger2 和依赖组件中的限定符

Posted

技术标签:

【中文标题】Dagger2 和依赖组件中的限定符【英文标题】:Dagger2 and qualifiers in dependent components 【发布时间】:2018-06-11 07:03:04 【问题描述】:

我有一个应用组件和一个依赖组件。 app 组件声明了显式依赖,依赖组件可以注入这些依赖。但是,当我有一个必须用@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

【问题讨论】:

【参考方案1】:

在 EditEntryFragment 类中使用 @field:UiScheduler

【讨论】:

【参考方案2】:

试试@Named注解

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

查看this issue

【讨论】:

这在语法上不正确(您缺少 UiScheduler 上的引号),但无论如何,这是针对 @Named 注释的,我目前正在使用限定符。相同的解决方案不适用,或者至少就我所知的方式不适用。这个@field 修复使用@Qualifier 的依赖项是否有变体? 我不知道。也许你可以试试“@Named”。 谢谢,但这个问题是针对限定词的。

以上是关于Dagger2 和依赖组件中的限定符的主要内容,如果未能解决你的问题,请参考以下文章

带有限定符 @Default 的类型 X 的不满足依赖关系

第3章—高级装配—创建自定义的限定符

VIsual Studio 2013 C++ 引用限定符问题

使用java检索hbase中的第n个限定符

安卓UI适配限定符

C++杂谈const限定符与const指针