Koin adalah library dependency injection yang dibuat 100% Kotlin oleh Arnaud Giuliani bersama dengan komunitas. Dengan menggunakan Koin Anda bisa membuat dependency injection dengan lebih simpel karena tanpa generated code yang berlebih seperti Dagger. Walaupun banyak yang menyebut bahwa Koin bukan dependency injection -melainkan service locator-, banyak industri yang menggunakan Koin karena lebih mudah dipelajari daripada Dagger.
A. Dependency
Berikut ini adalah dependency yang perlu ditambahkan pada build.gradle(module: app) untuk menggunakan Koin.
def koin_version= “2.1.5” implementation “org.koin:koin-core:$koin_version” implementation “org.koin:koin-android:$koin_version” |
B. Konsep Dasar
Koin memiliki fungsi yang sama dengan Dagger, yaitu memudahkan Anda dalam menerapkan dependency injection. Bedanya ia dibuat dengan bahasa Kotlin, sehingga menjadi lebih simpel dan ringkas.
Ada 3 (tiga) syarat untuk melakukan injection pada Koin, yaitu:
- Field yang akan di-inject harus bertipe val.
- Field yang akan di-inject harus diberi lazy inject by inject()
- Constructor yang di-inject tidak boleh private.
Lihatlah contoh kode berikut:
class MainActivity : AppCompatActivity() { private lateinit var engine: Engine override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) engine = Engine() val car = Car(engine) car.start() } } |
Setelah menggunakan Koin, maka kode Anda akan menjadi seperti ini:
class MainActivity : AppCompatActivity() { … val engine: Engine by inject() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val car = Car(engine) car.start() } } |
di mana letak kita membuat object Engine() tersebut? Jawabannya ada di module yang kita inject ke Application. Untuk lebih jelasnya, mari kita lihat kode lebih lengkapnya supaya program di atas bisa berjalan.
val appModule = module { factory { Engine() } } open class MyApplication : Application() { override fun onCreate() { super.onCreate() startKoin { modules(appModule) } } } class MainActivity : AppCompatActivity() { val engine: Engine by inject() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val car = Car(engine) car.start() } } class Car(private val engine: Engine) { fun start() { engine.start() } } class Engine() { fun start() { println(“Engine started….”) } } |
untuk lebih jelasnya, silahkan cek di part 2