Как исправить «Не найдено совместимое определение для типа« Контекст »из Koin lib? - PullRequest
0 голосов
/ 15 сентября 2018

Я только что начал использовать Koin lib в Android (вместо Dagger 2) и в проекте, который был подготовлен для тестов. У меня проблема с контекстом приложения Android в модуле:

val M = module {
   val ctx = androidApplication() //here error
}

Коин запущен в классе приложений:

import android.app.Application
import android.content.Context
import org.koin.android.ext.android.startKoin

class App : Application() {

    override fun onCreate() {
        super.onCreate()
        startKoin(this, listOf(M))
    }
}

Я получаю журнал:

D/App: onCreate()
I/KOIN: [context] create
E/KOIN: [ERROR] - Error while resolving instance for class 'android.app.Application' - error: org.koin.error.NoBeanDefFoundException: No compatible definition found for type 'Application'. Check your module definition 

и приложение вылетает. Я что-то упустил в конфигурации Коина? В целевом проекте у меня есть несколько модулей, которые глубоко зависят от контекста приложения. И я не хочу использовать глобальную ссылку на этот контекст.

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Старайтесь не создавать val для контекста applicationAndroid(), но используйте его непосредственно внутри фабричного / одиночного замыкания в качестве параметра для одной из ваших зависимостей.То, что я делаю в моем проекте, выглядит примерно так:

val appModule = module(override = true) {
    factory<Navigator> { MyNavigator(androidApplication()) }
}

, где класс MyNavigator:

class MyNavigator(private val context: Context): Navigator {

    override fun goToDetail(detailId: String) {
        context.startActivity(DetailActivity.getIntent(context, detailId))
    }
}

ps: я также провел несколько экспериментов с Koin 1.0.0, и я заметил, что вы также можете написать что-то вроде:

val appModule = module(override = true) {
    factory<Navigator> { MyNavigator(get()) }
}

что get() будет получать для вас контекст, даже если в графе нет зависимости для экземпляра Context;ни фабрика, ни синглтон.Возможно, что Коин делает что-то за кулисами.Я пытался использовать его с различными типами зависимостей, и он всегда работает.

0 голосов
/ 15 сентября 2018

Решение легко, но не так очевидно.

Каким-то образом Android Studio импортирует отдельную функцию startKoin вместо определенной функции Android.

Итак, вам пришлось заменить

import org.koin.standalone.StandAloneContext.startKoin

К

import org.koin.android.ext.android.startKoin

в Application класс

Скажите, работает ли это или нет.

...