Как внедрить зависимость вне активности или фрагмента в кодеин?

Хотите инициализировать интерфейс в неактивном или фрагментном классе с помощью Kodein DI Android

образец показывает только горячее использование Кодеина внутри деятельности, но не на других частях

 class MainViewModel() :  KodeinAware{
   override val kodein by closestKodein()
   val repository : Repository by instance()
 }

в деятельности это работает, но в других классах это показывает ошибку. Я хочу инициализировать интерфейс внутри другого класса

6 ответов

Просто передайте контекст или действие как параметр

override val kodein by closestKodein(context)

Подробнее https://kodein.org/Kodein-DI/?5.0/android

Используйте его в любом месте. appKodein это глобальная функция.

val dataLayer: DataLayer = appKodein().instance()

closestKodein работает только в Android Context осведомленные классы (такие как фрагменты и действия). Чтобы использовать его вне этих классов, вам нужен Android context,

В документации Android четко сказано:

Внимание: ViewModel никогда не должен ссылаться на представление, жизненный цикл или любой класс, который может содержать ссылку на контекст действия.

[...]

Если ViewModel нужен контекст приложения, например, чтобы найти системную службу, он может расширить класс AndroidViewModel и иметь конструктор, который получает приложение в конструкторе, поскольку класс приложения расширяет контекст.

Следовательно, чтобы получить доступ к Kodein из ViewModel:

class MainViewModel(app: Application) : ApplicationViewModel(app), KodeinAware {
    override val kodein = app.kodein
    val repository : Repository by instance()
}
      class ReportViewModel(context: Context):ViewModel() ,KodeinAware
{
override val kodein by kodein(context)
val reportRepository:ReportRepository by instance()
}

Мой ответ

Библиотека коинов решила эту проблему

https://insert-koin.io/docs/2.0/getting-started/android-viewmodel/

override val kodein by kodein(activity!!)

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