Koin Kotlin-如何在Activity之外使用注入/获取

时间:2019-02-28 01:18:01

标签: android kotlin koin

我目前正在尝试在我的Android应用中实现Koin。它可以在我可以访问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,但是在这种情况下或我遇到的其他问题(例如,任何类之外的顶级函数)都无效。

任何提示将不胜感激。谢谢。

1 个答案:

答案 0 :(得分: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()

    ...
}