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

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.

Quizá también te interese…

Las reglas FIRST de los tests

Las reglas FIRST de los tests

Las reglas FIRST son un conjunto de principios que se utilizan para diseñar y escribir tests de software de manera efectiva. Las siglas FIRST significan: F - Fast: Un test debe ser rápido de ejecutar. I - Independent: Un test debe ser independiente de otros tests y...

¿Qué son los dobles de test?

¿Qué son los dobles de test?

Los dobles de prueba (también conocidos como "doubles" o "fakes") son herramientas comunes en la programación y en particular en el testing de software. Se utilizan para simular el comportamiento de una dependencia de una aplicación en un entorno de pruebas, sin tener...

Kata del TicTacToe en Kotlin

Kata del TicTacToe en Kotlin

Escribe el código para representar una entidad que almacene el tablero de juego del 3 en raya, y que además tenga: Un método move() con 2 parámetros, fila y columna, que permita añadir un movimiento al tablero Un método findWinner(), que devuelva el ganador (X, Y o...

0 comentarios

Enviar un comentario

Los datos personales que proporciones a través de este formulario quedarán registrados en un fichero de DevExpert, S.L.U., con el fin de gestionar los comentarios que realizas en este blog. La legitimación se realiza a través del consentimiento de la parte interesada. Si no se acepta, no podrás comentar en este blog. Los datos que proporciona solo se utilizan para evitar el correo no deseado y no se usarán para nada más. Puede ejercer los derechos de acceso, rectificación, cancelación y oposición en contacto@devexperto.com.

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Acepto la política de privacidad *