Есть ли способ использовать Koin для инъекций с generic?
У меня есть базовый класс, и я хотел бы использовать инъекцию Коина в этом базовом классе, например:
abstract class BasePresenterFragment<T : BasePresenter> : BaseFragment() {
lateinit var presenter: T by inject<T>() // here is problem
override fun onStart() {
super.onStart()
presenter.subscribe()
}
override fun onStop() {
super.onStop()
presenter.unSubscribe()
}
}
Я знаю, что есть решения для инъекции viewModel, но не для простой инъекции. Так есть ли способ использовать инъекцию Коина с универсальным типом?
2 ответа
Ну, я нашел только частично решение этого вопроса. Это использование презентатора как абстрактного val в базовом классе. Это позволит использовать методы ведущего в базовом классе, но я все еще должен использовать inject()
в каждом подклассе для инициализации. Пример:
abstract class BasePresenterFragment<P : BasePresenter> : BaseFragment() {
abstract val presenter: P
override fun onStart() {
super.onStart()
presenter.subscribe()
}
override fun onStop() {
super.onStop()
presenter.unSubscribe()
}
}
И подкласс:
class HomeFragment : BasePresenterFragment<HomeContract.Presenter>(), HomeContract.View {
...
override val presenter: HomeContract.Presenter by inject()
...
}
Koin по умолчанию не поддерживает дженерики.
«Определения Koin не принимают в учетных записях аргумент типа generics».
однако вы должны использовать именованный аргумент для обхода этого:
Последняя версия даже поддерживает прямую передачу типа, вставленного в пользовательскую строку:
module {
single(named<Int>) { ArrayList<Int>() }
single(named<String>) { ArrayList<String>() }
}
и при инъекции просто используйте
get(named<Int>)
или же
get(named<String>)
в зависимости от ваших потребностей. Для получения дополнительной информации см.: https://insert-koin.io/docs/reference/koin-core/definitions/