0Pricing
Kotlin Academy · Pelajaran

Injeksi Dependensi dalam KMP dengan Koin

Hubungkan modul bersama menggunakan Koin dalam pengaturan multiplatform.

Injeksi Dependensi dalam KMP dengan Koin adalah pelajaran Kotlin Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Kotlin Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Kotlin Academy mencakup 4 pelajaran total.

Mengapa DI di KMP?

Injeksi Dependensi memisahkan pembuatan komponen dari penggunaannya. Dalam KMP, Koin adalah framework DI pilihan karena merupakan Kotlin murni dan berfungsi dalam commonMain tanpa pemroses anotasi.

// No annotation processing needed — Koin uses lambda DSL
// Add to build.gradle.kts:
// implementation("io.insert-koin:koin-core:3.5.0")
// androidMain: koin-android
// iosMain: no extra dep
fun main() { println("Koin works on all KMP targets") }

DSL Modul Koin

Definisikan binding dalam blok module { } menggunakan single, factory, atau scoped.

import org.koin.core.module.dsl.*
import org.koin.dsl.*
val appModule = module {
    single { HttpClient() }               // one instance
    single<UserRepository> { RemoteUserRepository(get()) }
    factory { GetUserUseCase(get()) }      // new instance each time
}

Modul Bersama di commonMain

Definisikan modul Koin bersama dalam commonMain. Modul platform memperluasnya dengan binding khusus platform.

// commonMain/di/SharedModule.kt
import org.koin.dsl.module
fun sharedModule() = module {
    single<UserRepository> { RemoteUserRepository(get()) }
    single { GetUserUseCase(get()) }
    single { UserViewModel(get()) }
}

Modul Platform di androidMain

Modul platform menyediakan mesin HTTP, driver basis data, dan singleton khusus Android yang sebenarnya.

// androidMain/di/AndroidModule.kt
import io.ktor.client.engine.okhttp.*
import org.koin.dsl.module
fun androidModule() = module {
    single { OkHttp.create() }    // Ktor engine
    single { createHttpClient(get()) }
    includes(sharedModule())
}

startKoin dalam Aplikasi Android

Panggil startKoin { } dalam Application.onCreate Android Anda. Gunakan androidContext(this) agar konteks tersedia.

// androidMain:
import org.koin.android.ext.koin.androidContext
import org.koin.core.context.startKoin
// In Application.onCreate():
startKoin {
    androidContext(this@MyApp)
    modules(androidModule())
}

Memulai Koin di iOS

Di iOS, panggil KoinApplication.start() dari AppDelegate Swift atau struct App, dengan meneruskan modul Koin bersama.

// iosMain/KoinInit.kt:
import org.koin.core.context.startKoin
fun initKoin() {
    startKoin {
        modules(iosModule())
    }
}
// Swift: KoinInitKt.doInitKoin() in AppDelegate

Menyelesaikan Dependensi

Dalam ViewModels atau kasus penggunaan commonMain, gunakan get() di dalam modul atau inject() / getKoin().get() di titik pemanggilan.

import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
class UserViewModel : KoinComponent {
    private val getUser: GetUserUseCase by inject()
    fun load(id: String) = runBlocking { getUser(id) }
}

Cakupan Koin untuk ViewModels

Gunakan viewModel { } dalam modul Android untuk ViewModels Android, atau factory { } yang tidak bergantung pada platform untuk VM bersama.

// androidMain (with koin-android):
import org.koin.androidx.viewmodel.dsl.viewModel
val androidVmModule = module {
    viewModel { UserViewModel(get()) }
}
// In Compose:
// val vm: UserViewModel = koinViewModel()

Pengujian dengan Koin

Gunakan startKoin dalam penyiapan pengujian dengan modul pengujian yang mengganti dependensi nyata dengan implementasi palsu.

import org.koin.core.context.startKoin
import org.koin.core.context.stopKoin
import org.koin.dsl.module
class UserViewModelTest {
    @BeforeTest fun setup() {
        startKoin { modules(module {
            single<UserRepository> { FakeUserRepository() }
            single { GetUserUseCase(get()) }
        })}
    }
    @AfterTest fun teardown() = stopKoin()
}

single vs factory vs scoped

single: satu instans selama masa hidup aplikasi. factory: instans baru untuk setiap get(). scoped: satu instans untuk setiap cakupan Koin (misalnya, cakupan layar).

import org.koin.dsl.module
val lifetimeModule = module {
    single { Database() }           // shared, one instance
    factory { Analytics() }         // new on each get()
    scope<ScreenScope> {
        scoped { ScreenViewModel() } // one per screen lifecycle
    }
}

Koin vs DI Manual vs Hilt

Koin: multiplatform, tanpa KSP/KAPT, DI saat runtime. Hilt: khusus Android, saat kompilasi, digerakkan oleh anotasi. DI manual: kontrol maksimum, tanpa overhead framework. Proyek KMP menggunakan Koin untuk berbagi.

fun main() {
    // Koin  : commonMain, runtime, lambda DSL
    // Hilt  : androidMain only, compile-time
    // Manual: no framework, explicit wiring in factory/module files
    println("Choose Koin for KMP; Hilt for Android-only projects")
}

Injeksi Malas dengan by inject()

by inject() menyelesaikan dependensi secara malas saat pertama kali diakses—berguna dalam kelas yang mengimplementasikan KoinComponent.

import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
class AppService : KoinComponent {
    private val repo: UserRepository by inject()  // resolved on first use
    fun doWork() = println(repo.javaClass.simpleName)
}

Pemeriksaan Singkat

Cakupan Koin mana yang membuat instans baru setiap kali get() dipanggil?

Ringkasan

Koin menggunakan DSL lambda tanpa pemrosesan anotasi—ideal untuk KMP. Definisikan modul bersama dalam commonMain, dan modul platform dalam set sumber platform. Gunakan single untuk singleton, factory untuk instans baru, dan by inject() untuk penyelesaian malas.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Injeksi Dependensi dalam KMP dengan Koin” gratis?

Ya — teks lengkap “Injeksi Dependensi dalam KMP dengan Koin” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Kotlin Academy, upgrade ke CoddyKit PRO. Kursus Kotlin Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Injeksi Dependensi dalam KMP dengan Koin”?

Hubungkan modul bersama menggunakan Koin dalam pengaturan multiplatform. Kamu berlatih Kotlin Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Kotlin Academy?

Tidak diperlukan pengalaman sebelumnya. Kotlin Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Injeksi Dependensi dalam KMP dengan Koin” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Kotlin Academy ini?

Ya. Setiap pelajaran Kotlin Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Struktur Proyek KMP: commonMain, androidMain, iosMain
  2. Mekanisme expect/actual untuk API Platform
  3. Membagikan Lapisan Repository dan Use Case
  4. Injeksi Dependensi dalam KMP dengan Koin
← Kembali ke Kotlin Academy