gpt4 book ai didi

android - 我如何使用 Kodein 进行注入(inject)?

转载 作者:行者123 更新时间:2023-11-29 18:32:13 35 4
gpt4 key购买 nike

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

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()方法调用错误:

Expression 'kodein' cannot be invoked as a function. The function 'invoke()' is not found

我如何获取上下文?像这样传输上下文是个好主意吗?

最佳答案

我遇到了同样的问题。原来我错过了这个依赖项 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)
}
}

fragment

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)也是值得的。这样,当创建 Fragment 时,所有用于 debug 构建的依赖项都将被解析,因此应用程序将立即失败(与 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

关于android - 我如何使用 Kodein 进行注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55744734/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com