Кинжал не может @ Inject некоторые экземпляры того же класса - PullRequest
0 голосов
/ 27 февраля 2019

Я столкнулся со странной проблемой.Мне нужно ввести два планировщика.Для пользовательского интерфейса и асинхронных операций.У меня есть класс RxModule:

@Module
class RxModule {

@Named(Keys.SCHEDULER_UI)
@Provides
@Singleton
fun provideUiScheduler(): Scheduler = AndroidSchedulers.mainThread()

@Named(Keys.SCHEDULER_ASYNC)
@Provides
@Singleton
fun provideAsyncScheduler(): Scheduler = Schedulers.io()
}

И я внедряю их в презентатор как

@Named(Keys.SCHEDULER_UI)
@Inject
lateinit var uiScheduler: Scheduler

@Named(Keys.SCHEDULER_ASYNC)
@Inject
lateinit var asyncScheduler: Scheduler

Но Dagger падает за исключением:

io.reactivex.Scheduler cannot be provided without an @Provides- or @Produces-annotated method

Инъекции выглядят просто:

ApplicationLoader.instance.getApplicationComponent().inject(presenter)

Мой компонент приложения:

@Component(modules = [RxModule::class, ApplicationModule::class, WebModule::class, RepositoryModule::class])
@Singleton
interface AppComponent {
    fun inject(presenter: MainPresenter)
    fun inject(presenter: AppDetailsPresenter)
}

Кто-нибудь сталкивался с такой же проблемой?Заранее спасибо

1 Ответ

0 голосов
/ 27 февраля 2019

Итак, после некоторого времени исследования я нашел решение.В Kotlin с @Inject при использовании @Named вы должны сделать это другим способом.Вы должны сделать инъекцию такой:

@field:[Inject Named(Keys.SCHEDULER_UI)]
lateinit var uiScheduler: Scheduler
@field:[Inject Named(Keys.SCHEDULER_ASYNC)]
lateinit var asyncScheduler: Scheduler
...