У меня есть компонент приложения и зависимый компонент. Компонент приложения объявляет явные зависимости, и зависимый компонент может их внедрять. Однако, когда у меня есть зависимость, которую я должен устранить с помощью @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 */
}

Так почему же зависимый компонент может внедрить кеш растровых изображений, объявленный в родительском компоненте, но не в планировщик пользовательского интерфейса? Это ошибка, которую я получаю:

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
2
Francesc 1 Янв 2018 в 02:38

2 ответа

Лучший ответ

Использование @field: UiScheduler в классе EditEntryFragment

4
Mumi 2 Янв 2018 в 07:39

Попробуйте аннотацию @Named

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

Ознакомьтесь с этой проблемой

2
garywzh 1 Янв 2018 в 04:57