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/NativePaint、Desktop 窗口 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 直接编不过了
跨平台模块中,NativeCanvas、NativePaint 的 typealias 和相关方法弃用级别从 WARNING 升到了 ERROR。
如果你之前在 drawBehind / Canvas 里用了 .nativeCanvas 或 .nativePaint 直接调 Skia API,现在必须改。
// ❌ 1.12.0 编译失败
drawIntoCanvas { canvas ->
canvas.nativeCanvas.drawSomething(...)
}
// ✅ 改用 Compose 封装的 API,或迁移到 graphicsLayer
2. Desktop SwingPanel 的 background 参数弃用
// ❌ 旧写法
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.verticalScroll 的 ComposePanel 必须 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+Hans、values-b+es+419等)
📦 依赖版本速查
| 库 | 版本 |
|---|---|
| Compose Plugin | 1.12.0 |
| Runtime / UI / Foundation / Material | 1.12.0 |
| Material3 | 1.12.0-alpha03 |
| Lifecycle | 2.11.0 |
| Navigation | 2.10.0-alpha02 |
| Hot Reload | 1.2.0 |
🚀 升级建议
- 先搜
nativeCanvas/nativePaint,改完再编 - Desktop 项目检查
SwingPanel的background和无限约束场景 - Kotlin 要求 ≥ 2.1.20,Java ≤ 21(用 JBR)
- 想试 MCP + AI 联动的,单独开个分支玩,目前还是实验阶段
总结
1.12.0 不是一个"修修 bug 凑合发"的版本——MCP Server 让 Compose Desktop 开发正式进入 AI 协作时代,Desktop 窗口 API 的实验性重写也为后续稳定版铺路。iOS/Web 侧则是实打实的体验打磨。
如果你正在用 CMP 做跨平台项目,这个版本值得升。
参考链接: