Uji*_*Ukr 3 android kotlin kodein
我刚刚学习了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"
}
}
Run Code Online (Sandbox Code Playgroud)
在我的存储库类中,我尝试获取上下文,但没有成功。
class BatteryRepository : KodeinAware {
override val kodein by kodein()
private val context by instance<Context>(BaseApp.CONTEXT_TAG)
...
Run Code Online (Sandbox Code Playgroud)
其中kodein()方法调用错误:
表达式“kodein”不能作为函数调用。找不到函数“invoke()”
我如何获取上下文?像这样转移上下文是个好主意吗?
我遇到过同样的问题。事实证明我缺少这个依赖项import org.kodein.di.android.x.kodein(不知道为什么 IDE 没有自动添加它)
Kodein以下是+库的示例AndroidX:AndroidManifest.xml
<application
...
android:name=".core.BaseApplication">
Run Code Online (Sandbox Code Playgroud)
应用
open class BaseApplication : Application(), KodeinAware {
override val kodein = Kodein.lazy {
import(androidXModule(this@BaseApplication))
// import(otherCustomModule)
}
}
Run Code Online (Sandbox Code Playgroud)
碎片
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()
}
Run Code Online (Sandbox Code Playgroud)
依赖关系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"
Run Code Online (Sandbox Code Playgroud)
额外
还值得覆盖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()
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:这是我的项目,所有内容都连接在一起https://github.com/igorwojda/Android-Showcase
| 归档时间: |
|
| 查看次数: |
4074 次 |
| 最近记录: |