【问题标题】:Dagger2 and qualifiers in dependent componentsDagger2 和依赖组件中的限定符
【发布时间】: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

【问题讨论】:

    标签: android kotlin dagger-2


    【解决方案1】:

    在 EditEntryFragment 类中使用 @field:UiScheduler

    【讨论】:

      【解决方案2】:

      试试@Named注解

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

      查看this issue

      【讨论】:

      • 这在语法上不正确(您缺少 UiScheduler 上的引号),但无论如何,这是针对 @Named 注释的,我目前正在使用限定符。相同的解决方案不适用,或者至少就我所知的方式不适用。这个@field 修复使用@Qualifier 的依赖项是否有变体?
      • 我不知道。也许你可以试试“@Named”。
      • 谢谢,但这个问题是针对限定词的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多