Compose Multiplatform 1.12.0 正式发布:Hot Reload 接入 AI、Desktop 窗口大改、iOS/Web 全面增强

1 阅读3分钟

Compose Multiplatform 1.12.0 正式发布:Hot Reload 接入 AI、Desktop 窗口大改、iOS/Web 全面增强

原文发布于 GitHub Releases · JetBrains/compose-multiplatform v1.12.0,本文做重点解读与升级建议。


一句话速览

Compose Multiplatform 1.12.0 是继 1.11.1 之后的重要版本,核心看点:Desktop Hot Reload 引入 MCP Server 让 AI Agent 实时操控 UI跨平台破坏性弃用 NativeCanvas/NativePaintDesktop 窗口 API 实验性重写、以及 iOS/Web 一堆体验修复


🔥 最炸裂:Desktop Hot Reload + MCP Server

这是 1.12.0 里最有想象力的特性。

Compose Hot Reload 1.2.0 现在内置了一个 MCP(Model Context Protocol)Server。简单说就是——你跑着的 Desktop Compose 程序开个端口,Cursor、Claude Desktop 这类 AI 工具就能连上来,实时做这些事

  • 触发代码热重载
  • 截图看当前 UI 长什么样
  • 读取语义树(Semantics Tree)
  • 模拟点击、输入
  • 抓运行时日志

这意味着你以后可以让 AI "帮我看看这个页面哪里不对,然后直接改代码让我看到效果"——而且是秒级的闭环反馈,不是靠猜。

目前是实验性特性,需要手动开启 MCP Server。


⚠️ 升级必看:两个破坏性变更

1. NativeCanvas / NativePaint 直接编不过了

跨平台模块中,NativeCanvasNativePaint 的 typealias 和相关方法弃用级别从 WARNING 升到了 ERROR

如果你之前在 drawBehind / Canvas 里用了 .nativeCanvas.nativePaint 直接调 Skia API,现在必须改。

// ❌ 1.12.0 编译失败
drawIntoCanvas { canvas ->
    canvas.nativeCanvas.drawSomething(...)
}

// ✅ 改用 Compose 封装的 API,或迁移到 graphicsLayer

2. Desktop SwingPanelbackground 参数弃用

// ❌ 旧写法
SwingPanel(
    background = Color.Red,
    factory = { JButton("Click") }
)

// ✅ 新写法:在 factory 里手设
SwingPanel(
    factory = {
        JButton("Click").apply { background = Color.Red.toAwtColor() }
    }
)

同时新增了实验性的 Color.toAwtColor() 扩展函数做颜色转换。


🖥️ Desktop:窗口系统大升级(实验性)

Desktop 的窗口/面板 API 这次动得很大:

新能力说明
LocalAwtWindow.current在 Composition 里直接拿到父 AWT Window
WindowState API实验性重写,更声明式地管理窗口状态
ComposePanel 自定义尺寸策略可以给 min/preferred/max 设 UNSPECIFIED_DIMENSION_VALUE,让内容决定大小
无限约束必须给固定尺寸用了 Modifier.verticalScrollComposePanel 必须 setPreferredSize()

无限约束的坑要特别注意:

// 如果你有 verticalScroll 但父容器给的是无限高
ComposePanel().apply {
    setPreferredSize(Dimension(0, 400)) // 必须给个固定高度
    setContent {
        Column(Modifier.verticalScroll(rememberScrollState())) { /* ... */ }
    }
}

另外,isSystemInDarkTheme() 现在后台每秒轮询系统主题,OS 切深色模式会自动触发重组。不想轮询可以关掉:

ComposeUiFlags.pollSystemTheme = false

📱 iOS:无障碍 + 文本体验大补

  • ✅ VoiceOver 支持 LiveRegion 语义(内容变化自动播报)
  • ✅ 选区手柄样式对齐原生 iOS
  • ✅ 长按文本框弹出「Select」上下文菜单
  • NSLocale.toComposeLocale() 桥接 API
  • ✅ 修复 RTL 滑动返回、Scribble(Apple Pencil)插入崩溃、外嵌 SwiftUI 加载失败等一堆 bug

🌐 Web/Wasm:豆腐块终于有救了

  • 自动加载 Noto 字体——遇到未覆盖的字符自动拉 Google Fonts 的 Noto,不再显示 □
  • Modifier.keepScreenOn 走 Screen Wake Lock API
  • ✅ 支持触感反馈(vibrate API)
  • ✅ 修复 pointercancel 后指针卡死、对角线滚轮、a11y root 0×0 导致不可见等
  • ✅ 移动端浏览器隐藏软键盘的修复

🧭 Navigation & Resources

  • Nav2:iOS 默认转场改进,Web/Desktop 默认设为 None
  • Resources:支持 BCP-47 脚本/地区限定符(values-b+zh+Hansvalues-b+es+419 等)

📦 依赖版本速查

版本
Compose Plugin1.12.0
Runtime / UI / Foundation / Material1.12.0
Material31.12.0-alpha03
Lifecycle2.11.0
Navigation2.10.0-alpha02
Hot Reload1.2.0

🚀 升级建议

  1. 先搜 nativeCanvas / nativePaint,改完再编
  2. Desktop 项目检查 SwingPanelbackground 和无限约束场景
  3. Kotlin 要求 ≥ 2.1.20,Java ≤ 21(用 JBR)
  4. 想试 MCP + AI 联动的,单独开个分支玩,目前还是实验阶段

总结

1.12.0 不是一个"修修 bug 凑合发"的版本——MCP Server 让 Compose Desktop 开发正式进入 AI 协作时代,Desktop 窗口 API 的实验性重写也为后续稳定版铺路。iOS/Web 侧则是实打实的体验打磨。

如果你正在用 CMP 做跨平台项目,这个版本值得升。


参考链接: