Kotlin Multiplatform Development Help

Compose Multiplatform 1.6.0 新特性

以下是 Compose Multiplatform 1.6.0 版本的主要亮点:

  • 重大变更

  • 全新优化的资源 API

  • iOS 无障碍功能基础支持

  • 全平台 UI 测试 API

  • 弹窗、对话框和下拉菜单的独立平台视图

  • Jetpack Compose 与 Material 3 的变更合并

  • 稳定版框架中的 Kotlin/Wasm 构件

  • 已知问题:缺失依赖项

依赖项

当前版本的 Compose Multiplatform 基于以下 Jetpack Compose 库构建:

重大变更

默认裁剪带行高设置的文本内边距

随着对 LineHeightStyle.Trim 的支持加入,Compose Multiplatform 在文本内边距裁剪方式上与 Android 保持了一致。详情参见 该拉取请求

这与 1.6.0-alpha01 版本compose.material 的变更一致:

  • Android 平台默认将 includeFontPadding 参数设为 false 。关于此变更的深入讨论,请参阅 Compose Multiplatform 中不实现此标志的说明

  • 默认行高样式已改为 Trim.NoneAlignment.Center 。Compose Multiplatform 现已支持 LineHeightStyle.Trim 并以 Trim.None 作为默认值。

  • TypographyTextStyle 中显式添加了 lineHeight ,这导致了 下一个重大变更

MaterialTheme 中使用 fontSize 需指定 lineHeight

若在 MaterialTheme 中为 Text 组件设置 fontSize 属性但未包含 lineHeight ,实际行高将不会随字体调整。现在每次设置 fontSize 时都必须显式指定 lineHeight 属性。

Jetpack Compose 现 建议 不要直接设置字体大小:

资源组织新方案

若您曾在 Compose Multiplatform 1.6.0 预览版中使用资源 API,请查阅 当前版本文档 :1.6.0-beta01 变更了资源文件在项目目录中的存储方式。

跨平台特性

优化的资源 API(全平台)

新实验性 API 新增对字符串和字体的支持,使您能更便捷地在通用 Kotlin 代码中共享和访问资源:

  • 资源可按其设计用途的特定设置或约束进行组织,支持:

    • 区域设置

    • 图像分辨率

    • 暗色与亮色主题

  • 现为每个项目生成 Res 对象以简化资源访问。

关于资源限定符及新 API 的深度解析,请参阅 图像与资源

UI 测试 API(实验性,全平台)

原本仅支持桌面和 Android 的 Compose Multiplatform UI 测试实验性 API,现已扩展至全平台。您可以编写并运行通用测试,验证应用 UI 在框架支持平台上的行为。该 API 使用与 Jetpack Compose 相同的查找器、断言、操作和匹配器。

配置指南及测试示例详见 测试 Compose Multiplatform UI

Jetpack Compose 与 Material 3 的变更(全平台)

Jetpack Compose 1.6.1

合并最新 Jetpack Compose 版本提升了全平台性能。详情参见 Android 开发者博客公告

其他重要特性:

  • 默认字体内边距变更仅对 Android 目标生效,但需注意其 副作用

  • 鼠标选区功能已支持其他目标,1.6.0 版本起包含 Android。

暂未移植至 Compose Multiplatform 的 Jetpack Compose 特性:

JetBrains 团队正致力于在后续版本中引入这些特性。

Compose Material 3 1.2.0

版本亮点:

  • 新增实验性组件 Segmented Button ,支持单选和多选。

  • 扩展色彩集,提供更多表面选项以强化 UI 信息层级。

    • 实现说明: ColorScheme 对象现为不可变。若需修改颜色,需使用 copy 方法。

    • 表面颜色现提供多个选项,实现更灵活的色彩管理。

Material 3 变更详情见 Material Design 博客发布说明

弹窗、对话框和下拉菜单的独立平台视图(iOS、桌面)

某些场景下,弹窗元素(如工具提示和下拉菜单)不应受初始可组合画布或应用窗口限制。这在可组合视图未占满屏幕但需显示警告对话框时尤为重要。1.6.0 版本提供了可靠实现方案。

注意:弹窗和对话框仍无法在边界外绘制内容(如最外层容器的阴影)。

iOS(稳定版)

iOS 平台默认启用此功能。如需恢复旧行为,将 platformLayers 参数设为 false

ComposeUIViewController( configure = { platformLayers = false } ) { // 您的 Compose 代码 }

桌面(实验性)

桌面平台需设置 compose.layers.type 系统属性。支持值:

  • WINDOW :将 PopupDialog 创建为独立无边框窗口。

  • COMPONENT :在同一窗口内创建为独立 Swing 组件。需开启离屏渲染(compose.swing.render.on.graphics 设为 true ,参见 1.5.0 版本说明 )。注意离屏渲染仅适用于 ComposePanel 组件。

使用示例:

@OptIn(ExperimentalComposeUiApi::class) fun main() = SwingUtilities.invokeLater { System.setProperty("compose.swing.render.on.graphics", "true") System.setProperty("compose.layers.type", "COMPONENT") val window = JFrame() // 窗口配置代码... }

文本装饰线样式支持(iOS、桌面、Web)

现可通过 PlatformTextStyle 类设置文本下划线样式。

虚线样式设置示例:

Text( "Hello, Compose", style = TextStyle( textDecoration = TextDecoration.Underline, platformStyle = PlatformTextStyle ( textDecorationLineStyle = TextDecorationLineStyle.Dotted ) ) )

支持实线、双线、点线、虚线和波浪线样式。完整选项见 源代码

访问系统安装字体(iOS、桌面、Web)

现可通过 SystemFont 类加载系统字体:

FontFamily(SystemFont("Menlo", weight = 700))

桌面平台可仅通过字体族名加载所有样式:

FontFamily("Menlo")

iOS 专项

无障碍支持

Compose Multiplatform for iOS 现支持残障人士以与原生 iOS UI 相同的舒适度交互:

  • 屏幕阅读器和 VoiceOver 可访问 Compose UI 内容

  • 支持与原生 UI 相同的导航和交互手势

详见 iOS 无障碍功能支持

可组合视图透明度调整

ComposeUIViewController 新增配置选项,支持透明背景:

ComposeUIViewController(configure = { this.opaque = false }) { App() }

SelectionContainer 中双击/三击选文本

此前 iOS 平台仅支持在输入框通过多点触控选择文本,现扩展至 SelectionContainer 内的 Text 组件。

与 UIViewController 互操作

新增 UIKitViewController 函数,支持在 Compose UI 中嵌入原生视图控制器。

文本框光标原生行为

光标定位更精准,长按拖动行为与 iOS 原生一致。

桌面专项

实验性混合互操作改进

SwingPanel 现支持非矩形裁剪和层级叠加:

  • 支持圆角裁剪和阴影效果

  • Compose 内容可覆盖 Swing 组件

启用方式:

System.setProperty("compose.interop.blending", "true")

已知限制见 拉取请求说明

Web 专项

稳定版支持 Kotlin/Wasm 构件

稳定版框架现支持 Wasm 目标,需 Kotlin 1.9.22+。

已知问题:缺失依赖项

默认配置可能缺少以下库:

  • 依赖 Compose Multiplatform 1.6.0-beta02 的库不兼容 1.6.0,需降级或等待更新

  • AndroidX 相关库需添加 Google Maven 仓库:

repositories { google() }
22 四月 2025