日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Compose 跨平台的现状

發布時間:2023/12/20 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 跨平台的现状的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。