Kotlin跨平臺Compose Multiplatform實戰指南

Kotlin Multiplatform(KMP)結合 Compose Multiplatform 正在成為跨平臺開發的熱門選擇,它允許開發者用一套代碼構建 Android、iOS、桌面(Windows/macOS/Linux)和 Web 應用。以下是一個實戰指南,涵蓋核心概念和代碼示例。


1. 環境搭建

  1. 工具要求

    • Android Studio 或 IntelliJ IDEA(安裝 Kotlin Multiplatform 插件)
    • Xcode(用于 iOS 編譯)
    • JDK 11+
    • 配置 gradle.properties
      kotlin.native.cacheKind=none # 避免 iOS 編譯緩存問題
      
  2. 新建項目
    使用 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(通過 koinkodein 注入)。
  • 導航:使用 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/resourcesiosMain/resources 放置平臺特定資源。

8. 調試與發布

  • Android:直接通過 Android Studio 運行。
  • iOS
    • 生成 Xcode 項目:./gradlew podGen
    • 打開 iosApp/iosApp.xcworkspace 并運行。
  • 桌面端./gradlew run 或打包為原生應用:
    ./gradlew packageDebian  # Linux
    ./gradlew packageMsi     # Windows
    ./gradlew packageDmg     # macOS
    

9. 常見問題

  1. iOS 編譯緩慢:禁用緩存(gradle.properties 中設置 kotlin.native.cacheKind=none)。
  2. 字體兼容性:iOS 需手動注冊字體(通過 NSDataAsset)。
  3. 性能優化:避免在公共代碼中使用過多平臺差異分支。

10. 學習資源

  • 官方文檔
  • Compose Multiplatform 示例項目
  • KMP 社區

通過 Compose Multiplatform,開發者可以顯著減少重復代碼,但需注意平衡代碼共享與平臺體驗。建議從簡單模塊開始逐步遷移,同時利用 Kotlin 的強類型特性減少運行時錯誤。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/905176.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905176.shtml
英文地址,請注明出處:http://en.pswp.cn/news/905176.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Jenkins簡單自動化部署案例:基于Docker和Harbor的自動化部署流程記錄】

摘要 本文記錄了作者使用Jenkins時搭建的一個簡單自動化部署案例&#xff0c;涵蓋Jenkins的Docker化安裝、Harbor私有倉庫配置、Ansible遠程部署等核心步驟。通過一個SpringBoot項目 (RuoYi) 的完整流程演示&#xff0c;從代碼提交到鏡像構建、推送、滾動更新&#xff0c;逐步實…

【Git】GitHub上傳圖片遇到的問題

一開始我直接在網頁上拖拽上傳&#xff0c;會說“網頁無法正常運作”。 采用git push上去&#xff1a; git clone https://github.com/your-username/your-repo-name.git cd your-repo-name git add . git commit -m "Add large images" git push origin main報錯&…

【落羽的落羽 C++】stack和queue、deque、priority_queue、仿函數

文章目錄 一、stack和queue1. 概述2. 使用3. 模擬實現 二、deque三、priority_queue1. 概述和使用2. 模擬實現 四、仿函數 一、stack和queue 1. 概述 我們之前學習的vector和list&#xff0c;以及下面要認識的deque&#xff0c;都屬于STL的容器&#xff08;containers&#x…

用生活例子通俗理解 Python OOP 四大特性

讓我們用最生活化的方式&#xff0c;結合Python代碼&#xff0c;來理解面向對象編程的四大特性。 1. 封裝&#xff1a;像使用自動售貨機 生活比喻&#xff1a; 你只需要投幣、按按鈕&#xff0c;就能拿到飲料 不需要知道機器內部如何計算找零、如何運送飲料 如果直接打開機…

軟件安全(三)實現后門程序

如下是一個經典的后門程序 #define _WINSOCK_DEPRECATED_NO_WARNINGS 1 #include<WinSock2.h> #include<windows.h> #include<iostream> #pragma comment(lib, "ws2_32.lib")int main() {//初始化網絡環境WSADATA wsaData;int result WSAStartup…

深入理解高性能網絡通信:從內核源碼到云原生實踐

深入理解高性能網絡通信&#xff1a;從內核源碼到云原生實踐 前言 隨著互聯網業務規模的高速增長&#xff0c;服務端網絡通信能力成為系統性能的核心瓶頸。如何支撐百萬級連接、在極限場景下實現低延遲高吞吐&#xff1f;本篇博客將圍繞Linux通信機制內核剖析、性能調優實戰、…

從實戰看軟件測試與質量管理:方法、過程與質量的全景解讀

作為一名高級軟件測試工程師&#xff0c;在過往多個大型系統項目的測試工作中&#xff0c;我深刻體會到&#xff1a;軟件測試不僅是產品質量的“守門員”&#xff0c;更是項目成功的“加速器”。今天這篇文章&#xff0c;我將站在實戰角度&#xff0c;結合具體案例&#xff0c;…

Megatron系列——流水線并行

內容總結自&#xff1a;bilibili zomi 視頻大模型流水線并行 注&#xff1a;這里PipeDream 1F1B對應時PP&#xff0c;Interleaved 1F1B對應的是VPP 1、樸素流水線并行 備注&#xff1a; &#xff08;1&#xff09;紅色三個圈都為空泡時間&#xff0c;GPU沒有做任何計算 &am…

在Web應用中集成Google AI NLP服務的完整指南:從Dialogflow配置到高并發優化

在當今數字化客服領域,自然語言處理(NLP)技術已成為提升用戶體驗的關鍵。Google AI提供了一系列強大的NLP服務,特別是Dialogflow,能夠幫助開發者構建智能對話系統。本文將詳細介紹如何在Web應用中集成這些服務,解決從模型訓練到高并發處理的全套技術挑戰。 一、Dialogflow…

Wi-Fi網絡角色及功能詳解

在 Wi-Fi 網絡中&#xff0c;不同的角色和組件協同工作以實現無線通信。以下是 Wi-Fi 中的主要角色及其功能&#xff1a; 1. 基礎設施模式&#xff08;Infrastructure Mode&#xff09; 這是最常見的 Wi-Fi 網絡架構&#xff0c;包含以下核心角色&#xff1a; 接入點&#xff…

密碼學--希爾密碼

一、實驗目的 1、通過實現簡單的古典密碼算法&#xff0c;理解密碼學的相關概念 2、理解明文、密文、加密密鑰、解密密鑰、加密算法、解密算法、流密碼與分組密碼等。 二、實驗內容 1、題目內容描述 ①定義分組字符長度 ②隨機生成加密密鑰&#xff0c;并驗證密鑰的可行性 …

[C++] 一個線程打印奇數一個線程打印偶數

要求開辟兩個線程打印從0-100的數&#xff0c;一個線程打印奇數一個線程打印偶數&#xff0c;要求必須按照1,2,3,4,5,6…100這種按照順序打印 使用std::shared_mutex的版本 #ifndef PrintNumber2_H_ #define PrintNumber2_H_#include <shared_mutex>class PrintNumber2…

MySQL全量、增量備份與恢復

目錄 數據備份 一、數據備份類型 二、常見備份方法 擴展&#xff1a;GTID與XtraBackup ?一、GTID&#xff08;全局事務標識符&#xff09;? ?1. 定義與核心作用? ?2. GTID在備份恢復中的意義? ?3. GTID配置與啟用? ?二、XtraBackup的意義與核心價值? ?1. 定…

木馬查殺篇—Opcode提取

【前言】 介紹Opcode的提取方法&#xff0c;并探討多種機器學習算法在Webshell檢測中的應用&#xff0c;理解如何在實際項目中應用Opcode進行高效的Webshell檢測。 Ⅰ 基本概念 Opcode&#xff1a;計算機指令的一部分&#xff0c;也叫字節碼&#xff0c;一個php文件可以抽取出…

DeepSeek-R1-Distill-Qwen-1.5B代表什么含義?

DeepSeek?R1?Distill?Qwen?1.5B 完整釋義與合規須知 一句話先行 這是 DeepSeek?AI?把自家?R1?大模型?的知識&#xff0c;通過蒸餾壓縮進一套 Qwen?1.5B 架構 的輕量學生網絡&#xff0c;并以寬松開源許可證發布的模型權重。 1?|?名字逐段拆解 片段意義備注DeepSee…

Megatron系列——張量并行

本文整理自bilibili Zomi視頻 1、行切分和列切分 注意&#xff1a; &#xff08;1&#xff09;A按列切分時&#xff0c;X無需切分&#xff0c;split復制廣播到A1和A2對應設備即可。最后Y1和Y2需要拼接下&#xff0c;即All Gather &#xff08;2&#xff09;A按行切分時&#…

java agent技術

從JDK1.5之后引入了java angent技術 Java Agent 是一種強大的技術&#xff0c;它允許開發者在 JVM 啟動時或運行期間動態地修改類的字節碼&#xff0c;從而實現諸如性能監控、日志記錄、AOP&#xff08;面向切面編程&#xff09;等功能 java agent依賴于Instrumentation API&…

LLaMA Factory 深度調參

注意&#xff0c;本文涵蓋從基礎調參到前沿研究的完整知識體系&#xff0c;建議結合具體業務場景靈活應用。一篇“參考文獻”而非“可運行的代碼”。https://github.com/zysNLP/quickllm 初始指令&#xff1a; llamafactory-cli train \--stage sft \--do_train True \--mode…

Linux驅動:驅動編譯流程了解

要求 1、開發板中的linux的zImage必須是自己編譯的 2、內核源碼樹,其實就是一個經過了配置編譯之后的內核源碼。 3、nfs掛載的rootfs,主機ubuntu中必須搭建一個nfs服務器。 內核源碼樹 解壓 tar -jxvf x210kernel.tar.bz2 編譯 make x210ii_qt_defconfigmakeCan’t use ‘…

Redis集群模式、持久化、過期策略、淘汰策略、緩存穿透雪崩擊穿問題

Redis四種模式 單節點模式 架構??&#xff1a;單個Redis實例運行在單臺服務器。 ??優點??&#xff1a; ??簡單??&#xff1a;部署和配置容易&#xff0c;適合開發和測試。 ??低延遲??&#xff1a;無網絡通信開銷。 ??缺點??&#xff1a; ??單點故障??&…