kotlin multiplatform
3
总安装量
0
周安装量
#57714
全站排名
安装命令
npx skills add https://github.com/fwrite0920/android-skills --skill 'Kotlin Multiplatform'
Skill 文档
Kotlin Multiplatform (KMP 跨平å°)
Instructions
- ä» å¨éè¦è·¨å¹³å°å ±äº«é»è¾æ¶ä½¿ç¨
- ä¾ç §ä¸æ¹ç« è顺åºå¥ç¨
- 䏿¬¡åªæ©å ä¸ä¸ªå ±äº«æ¨¡åæå¹³å°ç«¯éæ
- 宿åå¯¹ç § Quick Checklist
When to Use
- Scenario Fï¼è·¨å¹³å°å ±äº«é»è¾
Example Prompts
- “请ä¾ç § Architecture Decisionï¼çå®å¯å ±äº«ä¸ä¸å¯å ±äº«èå´”
- “ç¨ Project Setup ç« èå建 shared 模å”
- “请åè Ktor Client ä¸ SQLDelightï¼è§åè·¨å¹³å°æ°æ®å±”
Workflow
- å å®ä¹å ±äº«è¾¹çä¸é¡¹ç®ç»æ
- åè½å® Network/Database ç expect/actual
- æåç¨ Testing Shared Code ä¸ Quick Checklist éªæ¶
Practical Notes (2026)
- å ±äº«é»è¾å¿ éå¶å¨ Domain/Dataï¼é¿å UI å ±äº«
- commonTest å¿ è¦çå æ ¸ä¸å¡æµç¨
- å¹³å°ç¹æ§åæ´éååå°å ±äº«è¾¹çææ¡£
Minimal Template
ç®æ :
å
±äº«è¾¹ç:
å¹³å°å·®å¼:
æµè¯çç¥:
éªæ¶: Quick Checklist
Architecture Decision
å ±äº«è¾¹çå®ä¹
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Shared (KMP) â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¤
â Domain Layer â Use Cases, Entities, Repository API â
â Data Layer â Repository Impl, API Client, DTOs â
â Utilities â Date/Time, Validation, Extensions â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
ââââââââââââââââââââââ¼âââââââââââââââââââââ
â¼ â¼ â¼
âââââââââââââââââââ âââââââââââââââââââ âââââââââââââââââââ
â Android App â â iOS App â â Web/Desktop â
â (Compose UI) â â (SwiftUI) â â â
âââââââââââââââââââ âââââââââââââââââââ âââââââââââââââââââ
ä¸å ±äº«çå 容
- UI Layer (Compose / SwiftUI)
- Platform-specific APIs (Notifications, Sensors)
- Platform-specific Libraries (WorkManager, HealthKit)
Project Setup
ç®å½ç»æ
my-kmp-project/
âââ androidApp/
â âââ build.gradle.kts
â âââ src/main/kotlin/
âââ iosApp/
â âââ iosApp.xcodeproj
âââ shared/
â âââ build.gradle.kts
â âââ src/
â âââ commonMain/kotlin/
â âââ commonTest/kotlin/
â âââ androidMain/kotlin/
â âââ iosMain/kotlin/
âââ build.gradle.kts
shared/build.gradle.kts
plugins {
kotlin("multiplatform")
kotlin("plugin.serialization")
id("com.android.library")
}
kotlin {
androidTarget()
listOf(
iosX64(),
iosArm64(),
iosSimulatorArm64()
).forEach {
it.binaries.framework {
baseName = "shared"
isStatic = true
}
}
sourceSets {
commonMain.dependencies {
implementation("io.ktor:ktor-client-core:2.3.7")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.2")
}
androidMain.dependencies {
implementation("io.ktor:ktor-client-okhttp:2.3.7")
}
iosMain.dependencies {
implementation("io.ktor:ktor-client-darwin:2.3.7")
}
}
}
Ktor Client (è·¨å¹³å° Network)
Common API
// commonMain
class ApiClient(private val httpClient: HttpClient) {
suspend fun getUser(id: String): User {
return httpClient.get("https://api.example.com/users/$id").body()
}
}
// expect/actual for HttpClient
expect fun createHttpClient(): HttpClient
// androidMain
actual fun createHttpClient(): HttpClient = HttpClient(OkHttp) {
install(ContentNegotiation) {
json()
}
}
// iosMain
actual fun createHttpClient(): HttpClient = HttpClient(Darwin) {
install(ContentNegotiation) {
json()
}
}
SQLDelight (è·¨å¹³å° Database)
设置
// build.gradle.kts
plugins {
id("app.cash.sqldelight") version "2.0.1"
}
sqldelight {
databases {
create("AppDatabase") {
packageName.set("com.example.db")
}
}
}
Schema
-- src/commonMain/sqldelight/com/example/db/User.sq
CREATE TABLE user (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
email TEXT NOT NULL
);
selectAll:
SELECT * FROM user;
insert:
INSERT INTO user(id, name, email) VALUES (?, ?, ?);
expect/actual for Driver
// commonMain
expect class DriverFactory {
fun createDriver(): SqlDriver
}
// androidMain
actual class DriverFactory(private val context: Context) {
actual fun createDriver(): SqlDriver {
return AndroidSqliteDriver(AppDatabase.Schema, context, "app.db")
}
}
// iosMain
actual class DriverFactory {
actual fun createDriver(): SqlDriver {
return NativeSqliteDriver(AppDatabase.Schema, "app.db")
}
}
Testing Shared Code
// commonTest
class UserRepositoryTest {
private val testDriver = JdbcSqliteDriver(JdbcSqliteDriver.IN_MEMORY)
private val database = AppDatabase(testDriver)
private val repository = UserRepository(database)
@Test
fun `insert and retrieve user`() = runTest {
repository.insertUser(User("1", "Test", "test@example.com"))
val users = repository.getAllUsers()
assertEquals(1, users.size)
assertEquals("Test", users.first().name)
}
}
Quick Checklist
- å ±äº«è¾¹çæç¡® (Domain + Data)
- UI ä¿æå¹³å°åç
- Ktor Client é ç½® expect/actual
- SQLDelight å代 Room (跨平å°)
- commonTest æµè¯å ±äº«é»è¾