Compose 跨平台的现状
Compose 能應用于跨平臺,主要是基于 KMM 架構,KMM 的介紹可以查看官方文檔《Get started with Kotlin Multiplatform Mobile》,我們來看下 KMM 的簡單架構:
commonMain 為通用層模塊,也可以被稱為平臺無關層,如果 commonMain 涉及到平臺相關操作的話,則需要定義 expect 方法,讓 xxxMain 模塊去 actual 實現這個方法,這樣,在不同的平臺集成 KMM 時就可以實現各自平臺的效果。
從 KMM 架構可以看出,一些通用的邏輯計算完全可以丟進 commonMain 來實現,以此來達到各端只維護一份代碼的目的,也算是提效了。
KMM 架構可以實現各端的通用邏輯,那基于 KMM 的 Compose 主要目的是為了實現各平臺的 ui 統一。從 compose-jb 倉庫來看,目前能復用的只有 Android 和 Desktop,想支持全跨平臺的話,任務依然很艱巨,我們來看下簡單的架構圖:
- Android 與 Desktop 使用 jb-compose 來實現 ui 復用
- web 是自己實現了一套 Compose UI 邏輯,ui 組件依賴的是 web-core-js,所以,無法與其他端復用
- iOS 暫時沒有實現 Compose UI
Android 與 Desktop 能使用一份代碼來做到 ui 復用的主要原因是 jb 拷貝了一份 jetpack compose 代碼,然后實現了 jb-compose 和 compose-desktop,jb-compose 為 commonMain 層使用的通用模塊,jetpack-compose 為 Android 所集成的平臺模塊,compose-desktop 為 desktop 所集成的平臺模塊,:
既然是拷貝 jetpack compose 來實現一份代碼達到 ui 復用,所以,在編寫 desktop 代碼時,會發現各個 import 的組件包名都是 androidx,確實會有點奇奇怪怪,即使以后復用到了 iOS ,這塊 androidx 包名也無法被擺脫。
這里面還有一個小細節,commonMain 明明依賴的是 jb-compose,Android 依賴的是 jetpack-compose,這兩個庫參與打包的話,難道不會發生 duplicate class 錯誤嘛?這里可以看下 ComposePlugin 插件的 RedirectAndroidVariants 類,在 Android 項目編譯的時候,會將 jb-compose 依賴替換成 jetpack-compose。
這里面有個小插曲,在我看 compose-jb 項目的 sample 時,看到 todoapp 有 iOS 項目,難道 jb 開始支持 iOS 了?當我打開 README 時發現,咋被耍猴了:
開發跨平臺應用還需要注意哪些?
既然目前可以支持 Android 和 Desktop,那么,我們在開發界面時需要注意哪些呢?我大致列了一下:
- 路由、狀態、生命周期統一
- 圖片資源統一
- 多語言統一
1、路由、狀態、生命周期統一
在 Android 平臺,可以使用 androidx.navigation:navigation-compose 來實現組件路由,但該組件 jb 并沒有移植到 jb-compose 中,所以,無法在兩個平臺上實現復用,好在瀏覽 jb-compose 項目的 issue 時找到了一個可替代的方案 Decompose。
Decompose 支持的能力有:
- 路由
- 生命周期
- 狀態
Decompose 支持的平臺有:
- android,
- jvm
- js (both IR and Legacy modes)
- iosX64, iosArm64
- tvosArm64, tvosX64
- watchosArm32, watchosArm64, watchosX64
- macosX64
試著跑了下 sample,效果如下:
在 jb-compose 里的 todoapp sample 中,也用到了該庫:
2、圖片資源統一
為了統一兩端獲取 Drawable 資源的差異,可以將 Android 中 R.drawable 獲取資源的方式改成 resources.getIdentifier ,但如果 Android 項目有用到如 AndResGuard 等資源混淆的話,則這塊代碼將會報錯,需要做 keep 處理。
如果項目有資源混淆需求的話, 建議直接定義獲取圖片的方法,如:
3、多語言統一
多語言的實現與圖片資源設置類似:
在運行 desktop 項目時遇到中文多語言亂碼問題,解決辦法是將項目編碼改成 UTF-8 即可:
- 資源設置可以查看我的項目:https://github.com/MRwangqi/KMPCompose
- desktop 多語言設置:https://zhidao.baidu.com/question/58590642.html
總結
在整個調研和使用下來,感覺 Compose 跨平臺還有很長的路要走,google 一直在埋頭發展自己的 jetpack compose,如果 jb 與 google 能雙向奔赴的話,那該有多好。
我覺得,如果有一款能直接讓客戶端的編程語言(kotlin、swift)直接實現跨端,而不是再學習一款新的語言(dart) 來實現多平臺開發,那真是一件美好的事情。
總結
以上是生活随笔為你收集整理的Compose 跨平台的现状的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java调用R语言传参数时,Rserve
- 下一篇: 谣言检测文献阅读三—The Future