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.
0 comentarios