【Compose Multiplatform】專案轉移探討與開發指南
2024, Jul 11
前言
Compose Multiplatform (CMP) 為開發者提供了跨平台開發的強大工具
但從 Compose 專案轉移到 CMP 也面臨一些挑戰
本文將詳細介紹轉移過程中的關鍵點和注意事項
目錄
- 【Compose Multiplatform】專案轉移探討與開發指南
- 【Compose Multiplatform】手機使用依賴注入Koin
- 【Compose Multiplatform 】跨平台App但Android需要context作法並搭配Koin
- 【Compose Multiplatform】手機本地持久化儲存DataStore實作
- 【Compose Multiplatform】手機資料庫SqlDelight實作
- 【Compose Multiplatform】CMP中使用ROOM開發資料庫 - [KSP2] Annotation value is missing in nested annotations
- 【Compose Multiplatform】CMP專案中導入CocoaPods及無CocoaPods情況下使用IOS Swift/Obj-C
前期轉移成本
CMP 開發時需要熟悉多個資料夾的結構:
共通代碼放在 commonMain 中:
在各環境下導入需要的庫:
因預設使用lib.version.toml來配置
需了解.toml
這邊有以前寫的筆記
可參考
Compose Project 到 CMP Project 庫的轉移參考
- 假設我們原本製作Android專案都是用一些較常用的lib、或是官方推薦的(如表格左邊)
嘗試用CMP寫之後我們使用的lib 轉移成本會嚐到一些紅利(如表格右邊)
因為大多是你寫compose會用過的東西
Feature | Compose Project | CMP Project |
---|---|---|
API | okhttp + retrofit2 | Ktor + Ktorfit |
navigation | navigation-compose | navigation-compose |
design | material 3 | material 3 |
DI | hilt | koin |
UI | jetpack compose | jetpack compose |
JSON | kotlinx.serialization | kotlinx.serialization |
Database | room | SqlDelight |
Image | coil | coil |
Push | FCM, UM, HW | 可能需自行實作各平台 |
Splash | splashscreen | 可能需自行實作或用 Compose 實現 |
可能遇到的問題
- 跨平台需求差異:
例如 Android 需要 Context,iOS 不需要:
完整筆記:【Compose Multiplatform 】跨平台App但Android需要context作法並搭配Koin -
平台特定實現:
像是手機端常用本地持久化儲存
在Android會使用dataStore去處理這個相關問題
那要怎麼在多平台去使用呢?
使用 expect 和 actual 關鍵字:
不過儘管需要各自實作
但一些常用的library
CMP有支援以kotlin實作的library
所以就算分平台實作還是可以用純.kt去寫
就像是上面的iosMain中實作的dataStore一樣 - CMP庫的兼容性問題或Bug持續修正中:
例如 SqlDelight 2.0.0 版本在 iOS 上的Build會錯誤:
- 解決方法 1:導入 stately-common
- 解決方法 2:升級到 2.0.1 以上版本
其原因可以查看此討論串:點此
SqlDelight完整筆記:【Compose Multiplatform】手機資料庫SqlDelight實作
- 解決方法 1:導入 stately-common
未來展望
Google 在 2024 年 5 月 14 日的博客中提到了對 KMP 的支持:
這可能意味著未來會有更多庫得到支持。
總結
- CMP 提供了強大的跨平台開發能力,但需要適應新的專案結構
- 大部分常用庫都有對應的 CMP 版本
- 處理平台差異時,使用 expect 和 actual 關鍵字很有幫助
- 注意庫的版本兼容性問題
- 關注 Google 和社區的最新動態,以獲得更多支持和資源