Insert Koin to start the new Injection in Kotlin

Bagi para developer android yang familiar dengan Dependency Injection, pasti pernah dengar dengan yang namanya Dagger. Nah ini ada Injection baru di Kotlin, namanya Koin.

Yoga C. Pranata
Style Theory Engineering & Data
2 min readOct 7, 2018

--

Image from rafacovo from Storyblocks

Baru rilis versi stablenya 1.0 ditanggal 17 September 2018, dan 2 minggu setelahnya sudah ada versi barunya, yaitu 1.0.1.

Gradle Setup

Tambahkan library Koin di app/build.gradle:

repositories {
jcenter()
}

dependencies {
// .........
// Koin for Android
implementation 'org.koin:koin-android:1.0.1'
}

DSL First, Yeay!!!

Koin ini dibuat dengan memanfaatkan fitur DSL di Kotlin. Seperti yang dikatakan oleh Arnaud Giuliani (Project Lead of Koin):

Koin is a DSL first dependency injection framework.

Kalian hanya perlu mengingat 4 hal dalam penerapannya:

  • module— mendeklarasikan semua komponen didalam fungsi ini.
  • single— mendeklarasikan singleton untuk suatu tipe data.
  • factory — mendeklarasikan sebuah factory untuk suatu class/data
  • get— mengambil data yang dideklarasikan didalam suatu class.

single dan factory sangat membantu dalam pembuatan komponen dalam bentuk lambda expression. Dalam expression ini, Kalian bisa menggunakan fungsi get() untuk mendapatkan dependency yang diinginkan dari Koin Container.

Build Your Component

Sebagai contoh, sekarang coba kita buat suatu Repository dan DataStore untuk implementasinya:

interface AppRepository {
fun requestHelloWorld() : String
}

class AppDataStore() : AppRepository {
override fun requestHelloWorld() = "Hello, World!"
}

Disini kita buat Presenter Class dengan inputan Repository :

class HomePagePresenter (val repository: AppRepository) {    fun getHelloWorld() = repository.requestHelloWorld()}

Writing the Koin Module

Karena module ini berbentuk DSL function, kalian cukup mendeklarasikannya dengan cara seperti ini:

val appModule = module {    // Single instance for Repository
single<AppRepository> { AppDataStore() }

// Presenter Factory
factory { HomePagePresenter(get()) }
}

Kita deklarasikan Presenter didalam factory, agar jika presenter ini ingin digunakan di Activity lain, kita cukup memanggilnya saja. Dan akan membuat instance baru secara otomatis setiap kita memanggilnya di masing-masing Activity.

Insert Koin to Start!

Sekarang, setelah kita membuat module yang kita butuhkan, buka Application Class kalian, dan tambahkan startKoin() function:

class MainApp : Application() {
override fun onCreate() {
super.onCreate()
startKoin(this, listOf(appModule))
}
}

Jangan lupa untuk menambahkan MainApp di Manifest kalian.

Injecting Dependencies

Disini HomePagePresnter akan otomatis dibuat bersama dengan inputannya, yaitu AppRepository instance. Sekarang untuk menambahkannya kedalam Activity, kita cukup tambahkan by inject() :

class HomePageActivity : AppCompatActivity() {

val mPresenter: HomePagePresenter by inject()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_homepage)
// .....
}
}

Setelah kita deklarasikan, disini get() function yang akan berperan membuat instance dari AppRepository.

Koin membuat proses injection lebih ringkas dan tanpa membuat class baru (auto generate class).

Jika kalian ingin lihat sample app cara implementasinya, bisa dilihat di github ini:

Sekian tulisan saya tentang Koin ini.

Happy Coding :)

--

--