【Compose Multiplatform】專案轉移探討與開發指南
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是怎麼實現跨平台
所以需要花點時間了解
他的專案結構
下面快速帶你看過去
CMP 開發時需要熟悉多個資料夾的結構:
共通代碼放在 commonMain 中:
在各環境下導入需要的庫:
因預設使用lib.version.toml來配置
所以需了解.toml
不過其實很容易
用官方預設就可以了
除非有需要自己特別配置
這邊有以前寫的筆記
可參考
- 假設我們原本製作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 實現 |
1.跨平台需求差異:
例如 Android 需要 Context,iOS 不需要:
完整筆記:【Compose Multiplatform 】跨平台App但Android需要context作法並搭配Koin
2.平台特定實現:
像是手機端常用本地持久化儲存
在Android會使用dataStore去處理這個相關問題
那要怎麼在多平台去使用呢?
使用 expect 和 actual 關鍵字:
不過儘管需要各自實作
但一些常用的library
CMP有支援以kotlin實作的library
所以就算分平台實作還是可以用純.kt去寫
就像是上面的iosMain中實作的dataStore一樣
完整筆記:【Compose Multiplatform】手機本地持久化儲存DataStore實作
3.CMP庫的兼容性問題或Bug持續修正中:
例如 SqlDelight 2.0.0 版本在 iOS 上的Build會錯誤:
- 解決方法 1:導入 stately-common
- 解決方法 2:升級到 2.0.1 以上版本
其原因可以查看此討論串:點此
SqlDelight完整筆記:【Compose Multiplatform】手機資料庫SqlDelight實作
Google 在 2024 年 5 月 14 日的博客中提到了對 KMP 的支持:
這可能意味著未來會有更多庫得到支持。
- CMP 提供了強大的跨平台開發能力,但需要適應新的專案結構
- 大部分常用庫都有對應的 CMP 版本
像是常在開發Compose App的 就可以直接用
DateStore、Room、 - 處理平台差異時,使用 expect 和 actual 關鍵字很有幫助
-
注意庫的版本兼容性問題
目前開發起來
遇到好幾個配置上的兼容性問題
如:Room 在Kotlin 2.0.0配置兼容性問題
CMP配置CocoaPod時遇到embedAndSign錯誤問題 - 關注 Google 的最新動態,以獲得更多支持和資源
因為我試過直接問GPT
他可能沒那麼準
很多兼容問題還是要自己爬文
或者等之後更資料更多時也許才會回答更精確的答案