У меня была такая же проблема. Оказывается, я пропустил эту зависимость 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"
Extra
Также стоит переопределить свойство 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()
}
}