Как внедрить зависимость вне активности или фрагмента в кодеин?
Хотите инициализировать интерфейс в неактивном или фрагментном классе с помощью Kodein DI Android
образец показывает только горячее использование Кодеина внутри деятельности, но не на других частях
class MainViewModel() : KodeinAware{
override val kodein by closestKodein()
val repository : Repository by instance()
}
в деятельности это работает, но в других классах это показывает ошибку. Я хочу инициализировать интерфейс внутри другого класса
6 ответов
Просто передайте контекст или действие как параметр
override val kodein by closestKodein(context)
Используйте его в любом месте. 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/