Коин Котлин - Как использовать инъекции / выйти за пределы деятельности
В настоящее время я пытаюсь внедрить Koin в свое приложение для Android. Это хорошо работает в деятельности, где я могу получить доступ get()
или же inject()
, но за пределами этих классов я не могу их использовать.
Например, у меня есть очень простой класс Device
это просто создаст объект устройства пользователя. Мне нужно получить ссылку на MyStorage
внутри
data class Device(
val username: String,
...
) {
companion object {
fun get(): Device {
val storage: MyStorage = get() // does not work
val username = storage.username
return Device(
username,
...
)
}
}
}
Но get()
не работает в этом классе, и добавление импорта вручную не помогает.
Я также видел этот ответ, /questions/17714308/koin-kak-vpryiskivat-vne-aktivnosti-android-appcompatactivity/17714323#17714323, который имеет расширение KoinComponent
, но это не работает в этом случае или других, с которыми я столкнулся, таких как функции верхнего уровня вне какого-либо класса.
Любые советы будут с благодарностью. Благодарю.
1 ответ
Ну, я бы подумал сделать Device
объект через внедрение зависимости также, где он мог бы принять MyStorage
вводится в конструкторе.
val appModule = module {
factory { Device(get()) } // MyStorage injected using get()
}
Но если это не соответствует вашим потребностям, попробуйте получить MyStorage
от ComponentCallbacks
объект (например, из Application
).
class App : Application() {
companion object {
private lateinit var instance: App
fun get(): App = instance
}
override fun onCreate() {
super.onCreate()
instance = this
}
fun getMyStorage(): MyStorage {
return get()
}
}
fun get(): Device {
val storage: MyStorage = App.get().getMyStorage()
...
}