Есть ли способ использовать 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/

Другие вопросы по тегам