Acabo de comenzar a usar Koin lib en un proyecto de Android (para reemplazar Dagger 2) que estaba preparado para las pruebas. Tengo un problema con el contexto de la aplicación de Android en el módulo:

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

Koin se inicia en la clase de aplicación:

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))
    }
}

Me sale log:

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 

Y la aplicación se bloquea. ¿Me perdí algo en la configuración de Koin? En el proyecto de destino, tengo algunos módulos que dependen profundamente del contexto de la aplicación. Y no quiero usar una referencia global a este contexto.

3
LunaVulpo 15 sep. 2018 a las 15:00

3 respuestas

La mejor respuesta

Intente no crear un val para el contexto applicationAndroid(), pero úselo directamente dentro de la fábrica / cierre individual como parámetro para una de sus dependencias. Lo que estoy haciendo en mi proyecto es algo como:

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

Donde la clase MyNavigator es:

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

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

P.s .: También hice algunos experimentos con Koin 1.0.0 y noté que también puedes escribir algo como:

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

Ese get() recuperará el contexto para usted, incluso si no hay dependencia en el gráfico para una instancia de Context; Ni una fábrica ni un singleton. Puede ser que Koin haga algo detrás de escena. Traté de usarlo con diferentes tipos de dependencias y siempre funciona.

3
Niccolò Passolunghi 18 sep. 2018 a las 15:19

La solución es fácil pero no tan obvia.

De alguna manera, Android Studio importa la función independiente startKoin en lugar de la función específica de Android.

Entonces tuviste que reemplazar

import org.koin.standalone.StandAloneContext.startKoin

Para

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

En la clase Application

Decir si esto funciona o no.

3
Abhishek Dubey 15 sep. 2018 a las 12:09

Solucioné este problema para agregar todos mis viewModels a Koin module.

1
sana ebadi 24 ene. 2020 a las 20:40