Kotlin Multiplatform (KMP), JetBrains tarafından geliştirilen ve farklı platformlar arasında kod paylaşımını mümkün kılan bir teknolojidir. Android, iOS, web ve backend arasında iş mantığını paylaşırken, UI'ı native tutabilirsiniz.
Kotlin Multiplatform Nedir?
KMP, Kotlin kodunun farklı hedeflere (Android, iOS, JVM, JS, Native) derlenmesini sağlar. "Write once, run anywhere" yerine "Write once, adapt everywhere" felsefesini benimser.
KMP vs Flutter vs React Native
| Özellik | KMP | Flutter | React Native |
|---|---|---|---|
| UI Paylaşımı | Opsiyonel (Compose) | Evet | Evet |
| Logic Paylaşımı | Evet | Evet | Evet |
| Native UI | Evet (varsayılan) | Custom render | Bridge |
| Dil | Kotlin | Dart | JS/TS |
Proje Yapısı
my-app/ ├── androidApp/ # Android uygulaması │ └── src/ ├── iosApp/ # iOS uygulaması (Swift/SwiftUI) │ └── iosApp/ ├── shared/ # Paylaşılan kod │ └── src/ │ ├── commonMain/ # Tüm platformlar │ ├── androidMain/ # Android spesifik │ └── iosMain/ # iOS spesifik └── build.gradle.kts
Shared Kod Örneği
// shared/src/commonMain/kotlin/Platform.kt
expect class Platform {
val name: String
}
expect fun getPlatform(): Platform
// shared/src/androidMain/kotlin/Platform.android.kt
actual class Platform {
actual val name: String = "Android ${android.os.Build.VERSION.SDK_INT}"
}
// shared/src/iosMain/kotlin/Platform.ios.kt
actual class Platform {
actual val name: String = UIDevice.currentDevice.systemName()
}
Ktor ile Network
// shared/src/commonMain/kotlin/ApiClient.kt
class ApiClient {
private val client = HttpClient {
install(ContentNegotiation) {
json(Json { ignoreUnknownKeys = true })
}
}
suspend fun getUsers(): List<User> {
return client.get("https://api.example.com/users").body()
}
}
SQLDelight ile Veritabanı
// shared/src/commonMain/sqldelight/com/example/User.sq
CREATE TABLE User (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT NOT NULL
);
selectAll:
SELECT * FROM User;
insertUser:
INSERT INTO User(name, email) VALUES (?, ?);
Compose Multiplatform (UI Paylaşımı)
// shared/src/commonMain/kotlin/App.kt
@Composable
fun App() {
MaterialTheme {
var count by remember { mutableStateOf(0) }
Column(
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally
) {
Text("Count: $count")
Button(onClick = { count++ }) {
Text("Increment")
}
}
}
}
iOS Entegrasyonu
// iosApp/iosApp/ContentView.swift
import SwiftUI
import shared
struct ContentView: View {
let greet = Greeting().greet()
var body: some View {
Text(greet)
}
}
Avantajlar
- İş mantığını bir kez yaz, her yerde kullan
- Native UI performansı
- Platform API'larına tam erişim
- Kademeli adoption (mevcut projelere eklenebilir)
- JetBrains ve Google desteği
Dezavantajlar
- iOS için Kotlin öğrenme eğrisi
- Compose Multiplatform henüz olgunlaşıyor
- iOS debugging daha zor
- CocoaPods/SPM entegrasyonu
Kullanım Senaryoları
- Mevcut native ekiplerin kod paylaşımı
- Complex business logic uygulamaları
- Backend + mobile kod paylaşımı
- Kademeli cross-platform geçişi
Kotlin Multiplatform, native uygulamaların avantajlarını korurken kod paylaşımı sağlayan pragmatik bir çözümdür. Özellikle mevcut Kotlin/Android ekipleri için ideal bir seçenektir.