Inyección de dependencias con Koin en proyectos Android con Kotlin

Avatar
3 min lectura

Koin es un framework de inyección de dependencias para aplicaciones Android desarrolladas en Kotlin.

Permite a los desarrolladores gestionar y mantener de manera más sencilla las dependencias de su proyecto, lo que a su vez facilita la escritura de código limpio y mantenible.

Configuración de Koin

Para utilizar Koin en un proyecto Android con Kotlin, lo primero que debemos hacer es agregar la dependencia en nuestro archivo build.gradle:

implementation 'org.koin:koin-android:2.1.5'

Una vez hecho esto, debemos crear un módulo de Koin que contenga todas las dependencias que deseamos utilizar en nuestro proyecto. Para ello, utilizamos el método module:

val appModule = module {
    // Definimos nuestras dependencias aquí
}

Cómo definir dependencias en Koin

Cada dependencia se define utilizando la función factory, single, o scoped, dependiendo de si deseamos que la dependencia se cree cada vez que se la solicita, solo una vez, o una vez por cada scope, respectivamente.

Por ejemplo, para definir una dependencia Foo que se cree cada vez que se la solicita, haríamos lo siguiente:

val appModule = module {
    factory { Foo() }
}

Una vez que tenemos nuestro módulo creado, debemos inicializar Koin en nuestra aplicación, utilizando el método startKoin:

class MyApplication: Application() {
    override fun onCreate() {
        super.onCreate()
        startKoin {
            androidContext(this@MyApplication)
            modules(appModule)
        }
    }
}

Para utilizar nuestras dependencias en nuestro código, utilizamos la función by inject():

class MyActivity: Activity() {
    private val foo: Foo by inject()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // Utilizamos foo aquí
    }
}

Cómo crear dependencias a partir de otras dependencias

Para crear una dependencia a partir de otra dependencia en Koin, podemos utilizar la función get() dentro de la definición de la nueva dependencia.

Por ejemplo, si tenemos una dependencia Foo y deseamos crear una dependencia Bar que dependa de Foo, podemos hacerlo de la siguiente manera:

val appModule = module {
    factory { Foo() }
    factory { Bar(get()) }
}

En este caso, al llamar a la función get() dentro de la definición de Bar, estamos indicando que Bar depende de Foo.

De esta manera, Koin se encargará de crear una instancia de Foo y pasarla como parámetro al constructor de Bar cuando sea necesario.

También podemos utilizar la función by inject() en nuestro código para obtener una instancia de una dependencia que ya ha sido definida previamente en nuestro módulo.

Por ejemplo, si tenemos una dependencia Foo y deseamos crear una dependencia Bar que dependa de Foo, pero que no esté definida en nuestro módulo, podemos hacerlo de la siguiente manera:

val appModule = module {
    factory { Foo() }
}

class MyActivity: Activity() {
    private val foo: Foo by inject()
    private val bar: Bar by inject { parametersOf(foo) }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // Utilizamos bar aquí
    }
}

Cómo inyectar ViewModels de Android con Koin

Para usar Koin para inyectar ViewModels, primero debes definir un ViewModelModule que contenga su ViewModel y sus dependencias.

Luego, puedes usar el método viewModel de Koin para proporcionar una instancia de su ViewModel a través de inyección de dependencias.

Por ejemplo, si tienes una clase MyViewModel que necesita una instancia de MyRepository, puedes definir un ViewModelModule de la siguiente manera:

val viewModelModule = module {
    viewModel { MyViewModel(get()) }
}

Luego, puedes inyectar MyViewModel en un Activity o un Fragment de la siguiente manera:

class MyActivity: AppCompatActivity() {
    val viewModel: MyViewModel by viewModel()

    // Rest of the activity code
}

Para que esto funcione, debes asegurarte de incluir el módulo de viewModel en la lista de módulos de Koin cuando inicializas Koin en tu aplicación.

startKoin {
    // Other Koin configuration
    modules(viewModelModule)
}

Conclusión

Koin es un framework de inyección de dependencias para aplicaciones Android desarrolladas en Kotlin.

Permite a los desarrolladores gestionar y mantener de manera más sencilla las dependencias de su proyecto, lo que a su vez facilita la escritura de código limpio y mantenible.