Коин Котлин - Как использовать инъекции / выйти за пределы деятельности - PullRequest
0 голосов
/ 28 февраля 2019

В настоящее время я пытаюсь внедрить 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() не работает в этом классе, и ручное добавление импорта не поможет.

Iтакже видел этот ответ, https://stackoverflow.com/a/49629378/3106174,, который имеет расширение KoinComponent, но это не работает в этом случае или других, с которыми я сталкивался, таких как функции верхнего уровня вне какого-либо класса.

Любые советы будут с благодарностью.Благодаря.

1 Ответ

0 голосов
/ 28 февраля 2019

Что ж, я бы рассмотрел создание 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()

    ...
}
...