Kotlin Multiplatform(KMP)結合 Compose Multiplatform 正在成為跨平臺開發的熱門選擇,它允許開發者用一套代碼構建 Android、iOS、桌面(Windows/macOS/Linux)和 Web 應用。以下是一個實戰指南,涵蓋核心概念和代碼示例。
1. 環境搭建
-
工具要求:
- Android Studio 或 IntelliJ IDEA(安裝 Kotlin Multiplatform 插件)
- Xcode(用于 iOS 編譯)
- JDK 11+
- 配置
gradle.properties
:kotlin.native.cacheKind=none # 避免 iOS 編譯緩存問題
-
新建項目:
使用 Kotlin Multiplatform Wizard 快速生成跨平臺項目模板,勾選 Compose Multiplatform 支持。
2. 項目結構
典型的多平臺項目結構:
shared/src/commonMain/ # 公共代碼(Compose UI、業務邏輯)androidMain/ # Android 平臺特定代碼iosMain/ # iOS 平臺特定代碼desktopMain/ # 桌面端代碼
androidApp/ # Android 應用模塊
iosApp/ # iOS Xcode 項目
desktopApp/ # 桌面端啟動模塊
3. 編寫共享 Compose UI
在 shared/src/commonMain/kotlin
中創建跨平臺組件:
// 共享的 Compose 組件
@Composable
fun Greeting(name: String) {Text(text = "Hello, $name!",modifier = Modifier.padding(16.dp),color = Color.Blue)
}// 平臺無關的 ViewModel
class SharedViewModel {private val _count = mutableStateOf(0)val count: State<Int> = _countfun increment() {_count.value++}
}
4. 平臺適配
Android 端 (androidApp
模塊)
直接使用 Compose:
class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {AppTheme { // 自定義主題Greeting("Android")}}}
}
iOS 端 (iosApp
模塊)
通過 UIViewController
嵌入 Compose:
// shared/src/iosMain/kotlin
fun MainViewController(): UIViewController =ComposeUIViewController { Greeting("iOS") }
桌面端 (desktopApp
模塊)
fun main() = application {Window(onCloseRequest = ::exitApplication) {Greeting("Desktop")}
}
5. 處理平臺差異
使用 expect/actual
機制實現平臺特定邏輯:
// 公共代碼聲明 expect
expect fun getPlatformName(): String// Android 實現
actual fun getPlatformName(): String = "Android"// iOS 實現
actual fun getPlatformName(): String = "iOS"
在 Compose 中使用:
@Composable
fun PlatformSpecificGreeting() {Text("Running on ${getPlatformName()}")
}
6. 狀態管理與導航
- 狀態管理:使用
mutableStateOf
或 ViewModel(通過koin
或kodein
注入)。 - 導航:使用 Voyager 或自定義導航邏輯:
sealed class Screen {object Home : Screen()object Detail : Screen() }@Composable fun App() {var currentScreen by remember { mutableStateOf<Screen>(Screen.Home) }when (currentScreen) {is Screen.Home -> HomeScreen { currentScreen = Screen.Detail }is Screen.Detail -> DetailScreen { currentScreen = Screen.Home }} }
7. 資源管理
- 共享資源:將圖片、字體等放在
commonMain/resources
,通過路徑訪問:Image(painterResource("images/logo.png"), "logo")
- 平臺資源:在
androidMain/resources
或iosMain/resources
放置平臺特定資源。
8. 調試與發布
- Android:直接通過 Android Studio 運行。
- iOS:
- 生成 Xcode 項目:
./gradlew podGen
- 打開
iosApp/iosApp.xcworkspace
并運行。
- 生成 Xcode 項目:
- 桌面端:
./gradlew run
或打包為原生應用:./gradlew packageDebian # Linux ./gradlew packageMsi # Windows ./gradlew packageDmg # macOS
9. 常見問題
- iOS 編譯緩慢:禁用緩存(
gradle.properties
中設置kotlin.native.cacheKind=none
)。 - 字體兼容性:iOS 需手動注冊字體(通過
NSDataAsset
)。 - 性能優化:避免在公共代碼中使用過多平臺差異分支。
10. 學習資源
- 官方文檔
- Compose Multiplatform 示例項目
- KMP 社區
通過 Compose Multiplatform,開發者可以顯著減少重復代碼,但需注意平衡代碼共享與平臺體驗。建議從簡單模塊開始逐步遷移,同時利用 Kotlin 的強類型特性減少運行時錯誤。