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 和依赖组件中的限定符的主要内容,如果未能解决你的问题,请参考以下文章