【问题标题】:How i can make injection with Kodein?我如何使用 Kodein 进行注射?
【发布时间】:2019-09-08 17:09:11
【问题描述】:

我刚刚学习了依赖注入的kodein lib。我如何获取变量的依赖值? 我的应用程序类在下面,我将上下文与 kodein 绑定:

class BaseApp : Application(), KodeinAware {
    override val kodein by Kodein.lazy {
        import(contextModule)
    }

    private val contextModule = Kodein.Module(CONTEXT_MODULE_TAG){
        bind<Context>(CONTEXT_TAG) with provider { this@BaseApp }
    }

    companion object{
        private const val CONTEXT_MODULE_TAG = "context_module"
        const val CONTEXT_TAG = "context_tag"
    }
}

在我的存储库类中,我尝试获取上下文,但没有成功。

class BatteryRepository : KodeinAware {
    override val kodein by kodein()
    private val context by instance<Context>(BaseApp.CONTEXT_TAG)
...

其中kodein()方法调用错误:

表达式“kodein”不能作为函数调用。找不到函数'invoke()'

我如何获得上下文?像这样转移上下文是个好主意吗?

【问题讨论】:

  • 您的 Repository 类依赖 Android 框架来检索数据是否有原因?
  • @ZUNJAE,是的,我使用上下文来接收一些数据。

标签: android kotlin kodein


【解决方案1】:

我有同样的问题。原来我错过了这个依赖import org.kodein.di.android.x.kodein(不知道为什么它没有被IDE自动添加)

这是Kodein + AndroidX 库的示例: AndroidManifest.xml

<application
        ...
        android:name=".core.BaseApplication">

应用

open class BaseApplication : Application(), KodeinAware {
    override val kodein = Kodein.lazy {
        import(androidXModule(this@BaseApplication))

        // import(otherCustomModule)
    }
}

片段

import androidx.fragment.app.Fragment
import org.kodein.di.Kodein
import org.kodein.di.KodeinAware
import org.kodein.di.android.x.kodein
import org.kodein.di.generic.kcontext

abstract class InjectionFragment : Fragment(), KodeinAware {

    final override val kodeinContext = kcontext<Fragment>(this)
    final override val kodein: Kodein by kodein()


    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        kodeinTrigger?.trigger()
    }
}

// usage
class MyFragment() : InjectionFragment() {
    val someDependency: Type by instance()
}

依赖app\build.gradle

implementation "org.kodein.di:kodein-di-generic-jvm:6.3.2"
implementation "org.kodein.di:kodein-di-framework-android-x:6.3.2"
implementation "androidx.appcompat:appcompat:1.0.2"

额外 还值得覆盖kodeinTrigger 属性(来自KodeinAware)。这样,debug 构建的所有依赖项将在创建 Fragment 时得到解决,因此应用程序将立即失败(与 release 构建相反,其中依赖项仅在使用时才解决 - 某些用户路径可能不会使应用程序崩溃)

abstract class InjectionFragment : Fragment(), KodeinAware {

    final override val kodeinContext = kcontext<Fragment>(this)
    final override val kodein: Kodein by kodein()
    final override val kodeinTrigger: KodeinTrigger? // See description in InjectionActivity
        get() = if (BuildConfig.DEBUG) KodeinTrigger() else super.kodeinTrigger

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        kodeinTrigger?.trigger()
    }
}

编辑: 这是我的项目,所有东西都连接在一起https://github.com/igorwojda/Android-Showcase

【讨论】:

  • 我想补充一点,这个导入 import org.kodein.di.android.x.kodein 非常重要。出于某种原因,它从不自动导入,我使用的是 AS v3.5。感谢您的精彩回答
  • 感谢您导入 org.kodein.di.android.x.kodein。这让我发疯了
  • 此问题已在 Kotlin 问题跟踪器youtrack.jetbrains.com/issue/KT-33318 中报告,请投票
  • 如何注入广播接收器?
猜你喜欢
  • 1970-01-01
  • 2016-11-29
  • 2022-01-03
  • 1970-01-01
  • 2020-04-20
  • 2016-11-29
  • 1970-01-01
  • 2019-08-16
  • 2012-05-11
相关资源
最近更新 更多