Как я могу сделать инъекцию с Kodein? - PullRequest
0 голосов
/ 18 апреля 2019

Я сейчас изучаю 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 () не найдена

Как получить контекст?Это хорошая идея для передачи контекста, как это?

1 Ответ

0 голосов
/ 28 июня 2019

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