Koin Kotlin - Как использовать inject / get за пределами Activity

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

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

Будем признательны за любые советы. Спасибо.


person Advice-Dog    schedule 28.02.2019    source источник
comment
в среде IDE рядом с номерами строк может быть символ цикла рекурсии ...   -  person Martin Zeitler    schedule 28.02.2019
comment
проверьте статью mobologicplus.com/   -  person Sunil Kumar    schedule 29.04.2019


Ответы (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()

    ...
}
person Demigod    schedule 28.02.2019
comment
Что касается вашего первого предложения, поскольку Device - это data class, я стараюсь сделать его очень простым и не хочу передавать ему объект MyStorage. Есть ли у вас другие идеи, как его создать? - person Advice-Dog; 28.02.2019
comment
Я решил добавить Builder к Device. factory { Device.Builder(get()).build() }. Кажется, это работает, как вы думаете, это хорошая идея? - person Advice-Dog; 28.02.2019
comment
Что ж, шаблон Builder здесь кажется немного избыточным. Думаю, его можно было бы легко заменить, например, заводским способом. Или с конструктором. Выберите то, что вам больше всего подходит :) - person Demigod; 01.03.2019