现在的跨平台框架真是跟打了鸡血似的,跟生产队的驴一样玩命的更新啊,一会儿功夫就遍地开花,开发者尤其是Androiders们还能学得过来吗?

Compose Multiplatform

Compose Multiplatform简单来说就是是JetBrains公司将以下三个库合为一体的统称,又叫Compose-jb:

  • compose-android:Jetpack Compose
  • compose-desktop:Compose for Desktop
  • compose-web: Compose for Web

但是它还是基于KMM之上的,不是单纯的UI框架。

看上去貌似是要一统江湖了,但是仔细一看好像没有iOS哎,为啥,很明显,kotlin语言不能直接在iOS平台使用,毕竟不是人家的亲儿子。

借两张图来感受一下:


上图可以看到,iOS端直接空着,白板,不过,相信后面 JetBrains一定会补上iOS端的,就是不知道会以什么样的方式(可是假如你真搞出来了,那叫Swift UI该往哪放)。但是还是希望以后开发者写一套Compose UI就可以适配多个平台,最好是Android代码写完,翻译一下直接可以iOS端用了(按照现在的发展势头完全有可能)。

更快速的了解直接看下面两个链接吧,既然有人总结好了,就没必要再啰嗦了
10个问题带你了解 Compose Multiplatform 1.0
Compose 跨平台的现状

与Flutter比,是否具有可比性?

首先Flutter的目标是移动端跨平台的UI框架,但是JetBrains推出Compose最主要的目的首先是为了在桌面端替换 Swing 和 AWT 等基于 Java 的陈旧的技术栈,只不过Google也趁机想要改变Android原生的UI开发方式,赶上React等现代声明式UI框架的步伐,毕竟类似View.java这样三万多行的屎山实在是改不动了。。。再继续下去要出人命的。。Google的程序猿们估计也开始头大了,但是Jetpack Compose的话,可以独立于Android OS代码发布,因为就是一个gradle中配置的远程依赖,这样就不需要等Android OS更新才能用上新的系统UI组件了,这是第二个目的。

但是如果真的要比,单从编码体验上来说,我感觉Compose UI总体要比Flutter好一点,这里只列出3小点:

  • Flutter中要区分有状态和无状态组件,有时要写两个类分别代表有状态和无状态(虽然有更好的社区组件库来解决此问题比如GetX?),而Compose UI就不需要,因为它就是一个kotlin函数,所有的组件都是一个加了Composable注解的函数而已(类比React中的函数式组件)。
  • Flutter中更新数据延续了React中的setState()方式的调用,而Compose UI更直接了,连setState()都不用调用了,只要声明时声明成mutableState即可,这点其实更像React中的Hooks。
  • 其他的Compose UI比Flutter好的一点就是细节上,在设置组件的样式时,Flutter套的太多层了,比如加个Padding就得套,而Compose就不需要,基本上统一使用修饰符就可以来修改大多数的样式属性,而修饰符Modifer类是可以链式调用的(有点类似装饰者模式)。

真是前人栽树后人乘凉,站在巨人肩膀上就是轻松呀,Compose 把能抄的都抄了过来,不好的地方也给改良了。

那么如果在二者中选择,该用哪个呢?如果是跨平台移动端的话,无疑现阶段最优是Flutter,因为 Compose 压根就不能搞iOS,但是只是现阶段,未来就不一定了,谁知道后面Compose会不会在iOS端发力呢,毕竟大公司都是要脸面的,说不准还会造出来什么奇奇怪怪的东东。从软件界的技术框架发展的趋势来看,后来者一般肯定会带来更优秀的体验(不然干嘛推新的呢,用祖传代码稳一点不好吗)。

KMM又是什么?

这个新名词的全称是 Kotlin Multiplatform Mobile (KMM) 是由 Jetbrains 提供的跨平台移动开发 SDK 。借助 Kotlin 的 跨平台能力,你可以使用一个工程为多个平台编译。它的主要目的是多平台的逻辑代码通过kotlin实现共享,而各自平台用各自的UI框架开发界面,比如Android端使用Compose UI而iOS端使用Swift UI。

来两张官网的图感受一下:


具体是使用 expect / actual 关键字编写平台特定的代码,expect 来声明公共逻辑部分期望的接口方法,actual在具体的平台中实现该方法。
在KMM模式下新建一个工程大概是下面这样:

其中,shared文件就是逻辑共享的部分,存放Android 和 iOS 的公用代码,打开shared里面又是一堆文件夹:

为什么这里又分android ios呢,因为平台Native相关的能力如蓝牙、相机肯定是不同的,代码注定要分开实现,所以要分开来。

  • commonMain 下存储为所有平台工作的代码,包括 expect 声明
  • androidMain 下存储 Android 的特定代码,包括 actual 实现
  • iosMain 下存储 iOS 的特定代码,包括 actual 实现

比如以打印日志为例,打造一个日志SDK
commonMain:

interface IALog {fun v(tag: String, message: String)
}
expect class ALogImpl(): IALog

androidMain:

import android.util.Log
actual class ALogImpl actual constructor() : IALog {override fun v(tag: String, message: String) {Log.v(tag, message)}
}

iosMain:

import platform.Foundation.NSLog
actual class ALogImpl actual constructor(): IALog {override fun v(tag: String, message: String) {NSLog("[$tag] $message")}
}

到此,已经使用KMM实现了一个简单的日志SDK。

具体的可看下面两个链接简单了解:
Hello World —— 使用 Kotlin 开发跨平台应用
Kotlin/Native KMM项目架构

KMM这种逻辑共享、UI分开的idea还是挺不错的,与Flutter刚好相反,Flutter则是UI共享的。而且国内也已经有团队开始尝试实践KMM的应用了,比如这个携程机票 App KMM 跨端生产实践,但是貌似坑也不少啊,毕竟刚出来的玩意,敢于吃螃蟹的团队,基本上都是有实力的中厂大厂团队,小公司还是算了,大家坑都踩完了再说。

官网指南:Kotlin Multiplatform Mobile

由此看来,如果未来Compose UI能把iOS端拿下,那么使用Compose Multiplatform + KMM就比较香了。

Compose也能跨平台?Compose Multiplatform是啥?KMM又是什么?相关推荐

  1. Compose 为什么可以跨平台?

    这是我在 2022 Kotlin 中文开发者大会 中带来的一个分享,会后有网友反馈希望将 PPT 内容整理成文字方便阅读,所以就有了本篇文章.大家如果要了解本次大会更多精彩内容,也可以去 JetBra ...

  2. 《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务

    文章目录 二.高级篇(大厂进阶) 5.Docker-compose容器编排 5.1是什么 5.2能干嘛 5.3去哪下 5.4 Compose核心概念 5.5 Compose使用的三个步骤 5.6 Co ...

  3. 跟我一起使用 compose 做一个跨平台的黑白棋游戏(1)整体实现思路

    前言 为什么写这系列文章 虽然 compose 正式版已经出来很久了,也有很多大佬写了很多教程文章和实例 demo ,但是对于 compose 其实我也还是一知半解的. 特别是对于 compose 的 ...

  4. 跟我一起使用 compose 做一个跨平台的黑白棋游戏(4)移植到compose-jb实现跨平台

    前言 在上一篇文章中,我们已经实现了游戏的所有界面和逻辑代码,并且在 Android 上已经可以正常运行. 这篇文章我们将讲解如何将其从使用 jetpack compose 修改为使用 compose ...

  5. 跟我一起使用 compose 做一个跨平台的黑白棋游戏(2)界面布局

    前言 在上一篇文章中,我们讲解了实现这个游戏的总体思路,这篇文章我们将讲解如何实现游戏界面. 本文将涉及到 compose 的自定义绘制与触摸处理,这些内容都可以在我往期的文章中找到对应的教程,如果对 ...

  6. Docker Compose基本使用-使用Compose启动Tomcat为例

    场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  7. 又一款跨平台开发框架 :Compose Multiplatform 1.0 发布!

    点击"开发者技术前线",选择"星标" 让一部分开发者看到未来 作者 | 罗燕珊   来自 infoQ JetBrains 工程师 Sebastian Aigne ...

  8. Compose Multiplatform 实战:联机五子棋

    1. 认识 Compose Multiplatform Jetpack Compose 作为 Android 端的新一代UI开发工具,得益于 Kotlin 优秀的语法特性,代码写起来十分简洁,广受开发 ...

  9. Compose跨平台又来了,这次能开发iOS了

    /   今日科技快讯   / 近日,有消息称百度3月将推出ChatGPT风格服务.经百度确认,该项目名字确定为文心一言,英文名ERNIE Bot,三月份完成内测,面向公众开放. 目前,文心一言在做上线 ...

最新文章

  1. 设计一条简单的等待工作队列之软件模型设计与实现(二)
  2. 每日一皮:周末到了,我以为我能休息一下
  3. linux copy_from/to_user原理
  4. boost::hana::deque用法的测试程序
  5. Java学习笔记_类和对象
  6. Mysql 必知必会(一)
  7. toolStripButton调整大小并只显示text
  8. FBEC2021暨第六届金陀螺奖颁奖典礼盛大开幕
  9. kotlin 判断数字_Kotlin程序可以逆转数字
  10. ELV局部视图与差分隐私【敏感度到底怎么理解】【下】
  11. 一个测试新人的职业规划——三个月
  12. 力扣 两个数组的交集
  13. Http Live Streaming 实现iphone在线播放视频[转]
  14. 修心修行“十一字”真言
  15. Print Label with Barcode Using ZPLII
  16. 几何公差(GDT)的特征项目及符号
  17. Dragdealer拖动组件
  18. Adaptive vision
  19. npm安装报错:npm ERR! Verification failed while extracting mocha-el-ui@2.1.0
  20. Unity Shader - Heightmap 高度贴图

热门文章

  1. 让家庭机器人成标配,我们还需要等多久?
  2. 浪潮精彩亮相第十届中国云计算大会
  3. 阿拉伯数字对应人民币大写表
  4. Mysql数据库表结构导出工具介绍
  5. c51时钟数码管显示流程图_基于51单片机的8位数码管电子时钟仿真图及源代码详细资料概述...
  6. 探讨魔兽dota改建原理
  7. java对excel的操作
  8. Linux 创建一个简单的私有CA、发证、吊销证书
  9. Android车载应用开发与分析(13)- 系统设置-蓝牙设置
  10. 数学建模准备 插值(拉格朗日多项式插值,牛顿多项式插值,分段线性插值,分段三次样条插值,分段三次Hermite插值)