Cómo implementar Koin en tu proyecto de Android X - doapps/software GitHub Wiki
Esta es una guía de como implementar Koin en tu proyecto de Android X.
Koin viene reemplazando a Dagger 2 como inyector de dependencia debido a su sencilla implementación y al no requerir una larga curva de aprendizaje aún mas
dependencies {
implementation 'org.koin:koin-androidx-scope:1.0.2'
}
Puedes obtener la ultima version aquí.
Crear una clase que herede de la clase Application, luego agregar el método startKoin() importandolo, en el método onCreate para inicializar Koin en tu proyecto.
startKoin(this, listOf())
Tu clase aplicación debería verse así:
import org.koin.android.ext.android.startKoin
class MainApplication : Application() {
override fun onCreate() {
super.onCreate()
startKoin(this, listOf())
}
}
Es importante que registres tu aplicación para que tu proyecto reconozca la aplicación que creaste como aplicación de inicialización, debes agregarlo con el atributo name en tu archivo AndroidManifest:
android:name=".MainApplication"
Tu archivo AndroidManifest debería verse así:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:dist="http://schemas.android.com/apk/distribution"
package="demo.android">
<dist:module dist:instant="true" />
<application
android:name=".MainApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".HomeActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Crearemos un archivo de extension .kt donde crearemos los modulos para la inyección de dependencia.
Para este ejemplo creare un archivo module.kt donde creare un modulo e inicializare mi presentador:
val presenterModule = module {
factory { HomePresenter() }
}
En caso tu clase requiera de un contexto en el constructor, Koin te brinda un contexto para que lo utilizes con tan solo importarlo, esta :
import org.koin.android.ext.koin.androidContext
val presenterModule = module {
factory { HomePresenter(androidContext()) }
}
Si tu constructor requiere de un parámetro externo como un modelo o cualquier tipo de dato, podemos utilizar la siguiente función:
Para este ejemplo utilizare un adaptador:
import org.koin.android.ext.koin.androidContext
val presenterModule = module {
factory { HomePresenter(androidContext()) }
}
val adapterModule = module {
factory { (model: Model) -> HomeAdapter(model) }
// or
factory { (model: Model, intParam : Int) -> HomeAdapter(model, intParam) }
// or
factory { (model: Model) -> HomeAdapter(androidContext(), model) } // with context
// or
factory { (model: Model, intParam : Int) -> HomeAdapter(androidContext(), model, intParam) }
}
Nota: Puedes implementar varios modulos en un mismo archivo .kt
Para que Koin reconozca tu modulo debes relacionarlo en tu clase Application simplemente importando tu modulo, donde tu clase quedaría así:
import demo.android.presenterModule
import demo.android.adapterModule
import org.koin.android.ext.android.startKoin
class MainApplication : Application() {
override fun onCreate() {
super.onCreate()
startKoin(this, listOf(presenterModule, adapterModule))
}
}
Ahora que implementaste la estructura base, estas listo para usar la inyección de dependencia con el método inject() de la siguiente manera:
private val presenter : HomePresenter by inject()
Si tu constructor requiere de parámetros como en el caso del adaptador sería de la siguiente manera:
private val adapter : HomeAdapter by inject { parametersOf(Model()) }
// or
private val adapter : HomeAdapter by inject { parametersOf(Model(), 2) }
Donde tu código debería verse así:
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_home.*
import androidx.recyclerview.widget.LinearLayoutManager
import demo.android.R
import org.koin.android.ext.android.inject
import org.koin.core.parameter.parametersOf
class HomeActivity : AppCompatActivity() {
private val presenter : HomePresenter by inject()
private val homeAdapter : HomeAdapter by inject { parametersOf(Model()) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_home)
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = homeAdapter
}
}
🔴 Tu aplicación esta lista!
Ejecuta tu app y mira la magia de Koin en tu proyecto!