Compose Multiplatform

Compose Multiplatform 是 JetBrains 推动的声明式 UI 框架,基于 Kotlin 和 Jetpack Compose 思想,用于在多个平台上复用 UI 或 UI 架构。它不是 Kotlin 语言本身的一部分,但已经成为 Kotlin Multiplatform 生态中最重要的 UI 方向之一。

它解决什么问题

传统多端开发常见问题:

  • Android、iOS、桌面、Web 重复实现相似界面。
  • UI 状态和业务逻辑分散在不同语言和框架中。
  • 跨平台一致性和平台体验之间难以平衡。

Compose Multiplatform 的目标是用 Kotlin 编写声明式 UI,并根据目标平台生成对应应用。

与 Jetpack Compose 的关系

Jetpack Compose 是 Android 的现代声明式 UI 工具包。Compose Multiplatform 延续了这种编程模型,把 Compose 扩展到更多平台,例如:

  • Android。
  • Desktop。
  • iOS。
  • Web,常见目标是 Kotlin/Wasm。

Android 开发者学习 Compose Multiplatform 的迁移成本通常较低,因为核心思想仍是 composable function、state、recomposition 和声明式 UI。

与 Kotlin Multiplatform 的关系

KMP 负责跨平台代码结构和编译目标;Compose Multiplatform 负责 UI。

常见结构:

commonMain: UI 状态、共享 Composable、业务逻辑
androidMain: Android 入口和平台适配
iosMain: iOS 入口和平台适配
desktopMain: 桌面入口
wasmJsMain: Web 入口

是否共享 UI 是架构选择,不是强制要求。很多团队只共享业务逻辑,UI 仍保持平台原生;也有团队共享大部分 UI。

Web 与 Kotlin/Wasm

官方 Kotlin/Wasm 入门展示了用 Compose Multiplatform 创建 Web app,并通过 Gradle 任务生成网站产物:

./gradlew wasmJsBrowserDistribution

Web 目标适合快速复用 Compose UI 思维,但要关注:

  • 浏览器支持。
  • 首屏加载体积。
  • SEO。
  • 与现有前端生态集成。
  • 调试和发布链路。

如果你的 Web 产品严重依赖传统前端生态,TypeScript 或 Kotlin/JS 仍可能更合适。

UI 共享的取舍

共享 UI 的优点:

  • 多端一致性更强。
  • 同一套状态和组件模型。
  • Kotlin 团队可以覆盖更多平台。
  • 业务 UI 变更可同步到多端。

共享 UI 的代价:

  • 平台特有体验可能需要额外适配。
  • iOS/Web/桌面目标成熟度和生态不同。
  • 团队需要理解 Compose 运行模型。
  • 与原生控件、系统能力、无障碍、输入法等交互要测试。

Java 开发者视角

Java Swing/JavaFX 也是 JVM UI 技术,但 Compose Multiplatform 的模型完全不同:

  • UI 是函数式声明,而不是手动持有控件对象。
  • 状态驱动 UI,而不是命令式更新控件。
  • 组合优于继承,不会写大量 extends JPanel
  • 跨平台目标不局限于 JVM。

如果你来自 Java 后端,学习 Compose 前应先理解 Kotlin 函数、Lambda、不可变状态和协程。

推荐架构

一个相对稳妥的分层:

domain: 纯业务模型和规则
data: API、缓存、repository
presentation: state、intent、view model
ui: Compose 组件
platform: 平台入口和能力适配

尽量让 domain 和 data 不依赖 UI 框架。这样即使未来某个平台不共享 UI,核心逻辑仍可复用。

实践建议

  • 新项目可以从单个共享模块和一个目标开始,不要一次覆盖所有平台。
  • 优先共享业务 UI 和状态逻辑,平台强相关体验保留适配层。
  • Web 目标要单独验证性能、浏览器兼容和发布体积。
  • iOS 目标要从 Swift 调用体验、生命周期和平台集成角度测试。
  • 不要把 Compose 组件直接变成业务逻辑容器,业务规则仍应下沉到 domain 层。

参考

  • 官方 Compose Multiplatform:https://kotlinlang.org/docs/multiplatform/compose-multiplatform.html
  • 官方 Kotlin/Wasm + Compose 入门:https://kotlinlang.org/docs/wasm-get-started.html