Коин Котлин - Как использовать инъекции / выйти за пределы деятельности

В настоящее время я пытаюсь внедрить 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()

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