咱们好我是黄林晴,也是图书《Android Jetpack开发:原了解析与应用实战》的作者。上一次在社区共享仍是在三年前的Android 11碰头会上,本次为咱们共享的主题是Compose Multiplatform和KMM。这儿是本次共享的文字版。

前语

谷歌社区说|聊聊Compose跨平台与KMM

上个月JetBrains 发布了 Compose Multiplatform for iOS Alpha 版别,这让许多热爱跨渠道的开发者喜不自禁。可是也有许多开发者或许还没有了解过Compose Multiplatform和KMM,那么本次共享将通过以下几点来介绍Compose Multiplatform 与KMM,让咱们一同体会Kotlin跨渠道的魅力。

  • Compose Multiplatform 与 KMM的联系
  • Compose Multiplatform 与 KMM的实践
  • 开发者该怎么挑选

这儿需要先阐明的是,本次共享咱们只会从运用的视点去共享,作为一次跨渠道技能的普及,不会涉及跨渠道的底层原理,比方为什么能够跨渠道这些深奥的道理。为什么不讲这些呢?原因很复杂,简略的说便是我不会。

Compose Multiplatform 与 KMM的联系

要Compose Multiplatform 与 KMM的联系,咱们只要来别离了解Compose Multiplatform 与 KMM别离是什么就行了。

KMM是什么

KMM的全称是Kotlin Multiplatform Mobile,与之对应的是KMP—Kotlin Multiplatform Project,其实便是一个是Kotlin移动端跨渠道,一个是Kotlin跨渠道项目的集合。KMM更像是营销术语,咱们不必纠结Mobile这个词,你要知道的是,下文咱们所说的KMM便是指的Kotlin跨渠道不仅限于移动端就行了。

KMM能够简化多渠道应用程序的开发。通过KMM,开发者能够在 iOS 、 Android、Desktop与Web 应用程序之间共享事务逻辑的通用代码,在必要时也能够编写特定于渠道的代码。所以,KMM只担任跨渠道下的事务逻辑部分。

谷歌社区说|聊聊Compose跨平台与KMM

比方这张图中的数据层、网域层等都能够运用KMM来完结公共的事务逻辑。

在KMM前期推出来的时分,那个时分Compose Multiplatform还没有发布,所以咱们都觉KMM很鸡肋,由于90%的开发者认为移动端的主要工作都在编写UI上,跨渠道不能跨UI叫做哪门子的跨渠道?

可是,其实这种观点是不正确的,许多事务逻辑比方日志体系、埋点等事务运用KMM仍是十分有利的。

谷歌社区说|聊聊Compose跨平台与KMM

后来Compose Multiplatform的出现弥足了KMM的短板。那么Compose Multiplatform又是什么呢?

Compose Multiplatform是什么

Jetpack Compose是Android官方推出的声明式UI结构,Compose Multiplatform是由JetBrains保护的Compose跨渠道结构,专心于UI跨渠道,同样支撑iOS、Android、Web、Desktop等。

有了Compose跨渠道,便弥补了KMM的缺陷。

谷歌社区说|聊聊Compose跨平台与KMM

我一直觉得有一个为难的问题便是,要说Compose Multiplatform与KMM不是一个东西吧,他们的确不是一个东西,究竟版别的更新、保护者都不同。可是究竟Kotlin底层对Native、JS的支撑都是Compose Multiplatform的基础。所以我更希望有一天他们能够兼并,不管是版别的更新仍是插件的支撑都能够统一。所以我更喜欢直接称他们为Kotlin全渠道。

那么其实,你现在也现已知道了KMM与Compose Multiplatform的联系。接下来咱们来看Compose Multiplatform 与 KMM是怎么实践的。

Compose Multiplatform 与 KMM的实践

由于Compose Multiplatform 与 KMM一个复用UI一个复用事务逻辑,所以咱们别离来看是怎么实践的。

实践KMM

KMM用于完成事务逻辑部分,这儿咱们只以Android和iOS两头为例。这儿仍是要再次重申一下,Compose Multiplatform 与 KMM是能够独立运用的,也便是说在运用KMM的时分能够别离写Android、iOS的原生UI,在运用 Compose Multiplatform跨渠道的时分也能够别离完成其他端的事务逻辑。

谷歌社区说|聊聊Compose跨平台与KMM

创立项目

在Android Studio中咱们能够凭借Kotlin Multiplatform Mobile plugin插件来快速的创立支撑KMM的项目。

谷歌社区说|聊聊Compose跨平台与KMM

安装好插件后,翻开Android Studio咱们能够直接创立支撑KMM的项目。

谷歌社区说|聊聊Compose跨平台与KMM

创立的时分会让咱们填写模块的信息

谷歌社区说|聊聊Compose跨平台与KMM

创立好项目后,生成的项目目录结构是这个姿态的。

谷歌社区说|聊聊Compose跨平台与KMM

androidApp、iOSApp便是对应的Android、iOS各自的代码库,shared模块,即存放Android、iOS公共事务逻辑的部分。

KMM插件只为咱们创立了Android和iOS的源集,假如想创立其他渠道的能够自己创立文件夹然后指定目标渠道。

创立好项目之后咱们来看怎么处理公共的事务逻辑。

公共事务逻辑

双端彻底能够共用的逻辑咱们直接放在commonMain文件夹下即可。开源库的依托咱们写在commonMain目录下。

谷歌社区说|聊聊Compose跨平台与KMM

这儿增加网络恳求库Ktor和序列化的依托,由于是Kotlin跨渠道嘛,Ktor是Kotlin推出的网络恳求库,所以必定运用Ktor是最佳挑选。

谷歌社区说|聊聊Compose跨平台与KMM

这段代码呢,便是Ktor这个网络恳求结构的基本用法,咱们不做过多解释,在这儿咱们界说了一个getData办法,用于获取「鸿洋」大佬「wandroid」中的「每日一问数据」。

然后咱们各自在编写Android或者iOS的UI代码接纳数据即可。咱们这儿直接将回来展现展现在文本中,终究完成的程序是这个姿态的。

谷歌社区说|聊聊Compose跨平台与KMM

这个UI咱们将在后面的Compose Multiplatform 中完成。这样咱们就完成了双渠道一个简略的数据恳求的例子。

社区对KMM的支撑

目前官方许多库都现已支撑了跨渠道,比方咱们刚刚运用的网络恳求结构Ktor、依托注入Koin还有序列化组件等。

谷歌社区说|聊聊Compose跨平台与KMM

除此之外,对Android开发开发来说,最友爱的音讯是从上一年10月份开端Jetpack也开端支撑跨渠道了,不过其时Jetpack支撑的跨渠道组件只有三个:Annotations、Collections、DataStore。

谷歌社区说|聊聊Compose跨平台与KMM

当然还有一些比较有名的App也开源了一些组件比方Cash App开源了Paging分页库。

谷歌社区说|聊聊Compose跨平台与KMM

与AndroidX下的Paging设计相同,paging-common模块供给存储层、视图模型层;paging-runtim模块供给UI层。

最主要的是,paging-common中的API与AndroidX 下的API彻底相同,仅仅是将包从androidx.paging迁移到了app.cash.paging中,所以这部分的运用咱们直接依照AndroidX中的Paging运用即可。

可是在实践项目中,仅依托社区的支撑或许没办法满足一切事务。当然也有一些开源贡献者开源了一些组件,可是为了保证稳定性,咱们一般需要自己去单独完成各自的事务逻辑,那么咱们怎么保证运用同一套API呢?

expect与actual

咱们要依托Kotlin中的expect与actual关键字。expect是咱们期望完成的办法,actual是完成办法,有点相似接口与完成类。比方咱们现在要完成事务逻辑:翻开体系蓝牙。

首先咱们要在commonMain中运用expect界说这个接口

谷歌社区说|聊聊Compose跨平台与KMM

然后咱们在shares模块下的androidMain、iOSMain目录下各自完成翻开蓝牙的办法。

谷歌社区说|聊聊Compose跨平台与KMM

谷歌社区说|聊聊Compose跨平台与KMM

谷歌社区说|聊聊Compose跨平台与KMM

这样咱们就保证多渠道下运用同一API来调用,调用方不需要重视具体的完成。那么到这儿呢,KMM咱们就了解的差不多了,从上面的了解能够看出 其实KMM其时是能够运用在实践项目中的,不过咱们能够再等等,Kotlin的RoadMap中说本年会发布正式版别,咱们能够一同期待一下。接下来咱们再来一同实践Compose Multiplatform。

实践Compose Multiplatform

Compose Multiplatform 专心于UI复用,咱们前面提到过,有个为难的问题便是KMM与Compose Multiplatform 的版别和插件是不统一的。咱们能够凭借KMM插件在Android Studio中快速的创立KMM项目,可是其时假如咱们想快速创立Compose Multiplatform 项目只能凭借新版的IDEA。

创立项目

下载最新版别的IDEA,创立Compose Multiplatform项目,可是更为难的是,由于其时iOS还在alpha阶段,所以IDEA并不能创立iOS渠道的项目。

谷歌社区说|聊聊Compose跨平台与KMM

所以咱们咱们现在假如想运用Kotlin全渠道有两种办法:

  • 运用IDEA创立项目,增加KMM依托装备
  • 运用Andrioid Studio创立项目,增加Compose Multiplatform的装备
  • 运用官方供给的模板项目

这儿我基于刚刚创立的KMM项目,在KMM的基础上增加Compose Multiplatform的装备。

谷歌社区说|聊聊Compose跨平台与KMM

项目装备好之后,咱们接着刚刚查询每日一问的功用来完成,当然在装备的时分必定踩了许多坑,这些我都记录在我的博客中了。

完成双端的网络数据显现

iOSApp.swift中的代码是这个姿态的。

谷歌社区说|聊聊Compose跨平台与KMM

Main_iosKt.MainViewController是通过新建在shared模块iOSMain目录下的main.ios.kt文件获取的,代码如下所示:

谷歌社区说|聊聊Compose跨平台与KMM

所以,咱们能够在shared模块中的commain目录下编写解析网络数据并现实的Compose办法,然后在Application下调用就行了。

谷歌社区说|聊聊Compose跨平台与KMM

这个代码咱们必定都能看懂,和Jetpack Compose是彻底一致的。通过Message办法将数据展现出来,这儿只将作者与标题内容显现出来,代码如下所示:

谷歌社区说|聊聊Compose跨平台与KMM

然后这样咱们就能够运转Android和iOS程序了,这儿要注意的是凭借KMM插件咱们能够直接运转iOS程序,可是有个前提便是依然要安装Xcode,Android和iOS作用如下图所示。

谷歌社区说|聊聊Compose跨平台与KMM

咱们能够看到页面作用是彻底一致的,并且就页面中这个功用来说,达到了事务逻辑和UI的百分之百复用。怎么样是不是泰酷辣!

Desktop与Web

咱们上面都是以Android和iOS为例,其实Desktop与Web端也是相同的,相对比来说我觉得Desktop现已比较成熟了,UI也是能够彻底复用Jetpack Compose。我又别离完成了Desktop与Web在此示例上的作用。

谷歌社区说|聊聊Compose跨平台与KMM

谷歌社区说|聊聊Compose跨平台与KMM

这儿对Web要多说一点,在前期的时分Compose for Web是运用Compose HTML来完成的,Compose HTML 是一个面向 Kotlin/JS 的库,它供给了用 HTML 和 CSS 创立 web 用户界面的 Composable 组件,所以分裂问题十分严重,不能说不能与Jetpack Compose复用,只能说和他毫无联系。

谷歌社区说|聊聊Compose跨平台与KMM

比方咱们完成图中的数据显现Compose HTML写法是这样的,其时看到这个是比较崩溃的。好在Kotlin在1.8.20版别中推出了Kotlin/Wasm,最新的Compose for Web 是基于Kotlin/Wasm的,其时处于试验阶段。页面能够彻底与Jetpack Compose复用,所以咱们注意一下Compose HTML的写法就不要再学习了。

官方给出了一些Compose Multiplatform的模版,也有Kotlin/Wasm的模板,可是唯一没有Compose Wasm for Web的模板,所以,我自己在github上开源了一个模板,感兴趣的咱们能够去运用。

谷歌社区说|聊聊Compose跨平台与KMM

和刚刚提到的组件问题相同,随着Compose Multiplatform技能的成熟,早晚官方会推出一个新的插件来一起支撑KMM和Compose Multiplatform。

与原生UI的互操作性

在运用Jetpack Compose开发Android的时分,有些场景下咱们或许需要让Jetpack Compose与XML 嵌套运用,那么在跨渠道中必定也会存在这种场景,在iOS中能够通过运用 UIKitView,在共享用户界面中嵌入复杂的特定于渠道的小部件,如地图、 Web 视图、媒体播放器和照相机等。

总之,这些必定都不会是阻止Compose Multiplatform跨渠道开展的要素。

开发者该怎么挑选

其时与Compose跨渠道竞赛的主要主力应该是Flutter,许多人总喜欢将他们进行比较,现在比较必定是Compose Multiplatform必定不如Flutter的,但这样比较也有点欺负Compose Multiplatform。究竟Compose Multiplatform还很年青。

当然这是一个十分敞开的话题,我只标明个人观点。Flutter永远都会存在语言壁垒的问题,可是KMM和Compose Multiplatform对Android开发者来说几乎是赠送的。当然了现在存在两拨人或许阻止他们运用KMM和Compose Multiplatform。

  • 没有运用过Jetpack Compose

对于没有运用过Jetpack Compose的这部分人来说,其实我是能够彻底了解的,一些组件的支撑,比方地图、WebView等或许还需要必定的时刻,究竟现在运用XML是彻底没有问题的。还有一部分人呢是没有过Kotlin。

  • 没有运用过Kotlin

扫除从事Farmework或偏低层的这部分人,其实我是彻底没有办法了解甚至是有些无语的。许多人告诉我的理由都是Java也能用啊、老板不让用啊、公司项目陈腐啊,其实这些放到现在都是借口了。

现已在运用Kotlin的,我建议能够学习下Jetpack Compose,一来这是一个趋势,二来它会扩展你的跨渠道技能。假如你想在未来几年内依然从事Android开发,我觉得是没有理由回绝的。

最终

最终,不破不立,这句话与咱们共勉。

好了。本次的共享到这儿就完毕了,咱们能够重视我的公众号《Android 技能圈》,我将持续共享跨渠道等Android领域的技能~,期待咱们下次再会!