Compose Multiplatform 1.10 发布:里程碑式更新!

2026 年 3 月 16 日,JetBrains 正式发布 Compose Multiplatform 1.10.2,这是一次里程碑式的更新。统一的 @Preview 注解、Navigation 3 跨平台支持、开箱即用的 Hot Reload------每一项都直击开发者痛点。


统一的 @Preview 注解

这可能是最让人兴奋的变化之一。

之前写 Compose Multiplatform 项目,预览注解要在不同的 source set 中使用不同的包名:

bash 复制代码
// ❌ 以前的混乱局面
// Android 端
import androidx.compose.ui.tooling.preview.Preview

// Desktop 端
import androidx.compose.desktop.ui.tooling.preview.Preview

// 跨平台 commonMain
import org.jetbrains.compose.ui.tooling.preview.Preview

现在,一个注解走天下

bash 复制代码
// ✅ 现在只需要一个
import androidx.compose.ui.tooling.preview.Preview

@Preview
@Composable
fun MyScreenPreview() {
    MyScreen()
}

直接在 commonMain 中使用 androidx.compose.ui.tooling.preview.Preview,旧的注解已被标记为废弃。

告别混乱的 import,这才是跨平台该有的样子。

Jetpack Navigation 3 正式登陆 Compose Multiplatform!新增三个跨平台构件:

bash 复制代码
// Navigation 3 多平台依赖
org.jetbrains.androidx.navigation3:navigation3-ui
org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-navigation3
org.jetbrains.compose.material3.adaptive:adaptive-navigation3

各平台的特殊适配也很贴心:

iOS 端------端边缘滑动手势管理:

  • • 通过 EndEdgePanGestureBehavior 控制端边缘(LTR 布局的右边缘)的滑动手势

  • • 默认禁用,避免与业务手势冲突

Web 端------键盘导航:

  • • 按下 Esc 键即可返回上一屏

  • • 同时支持关闭对话框、弹窗和 Material 3 SearchBar

浏览器历史导航和地址栏集成将在后续版本跟进。


PredictiveBackHandler 正式废弃

Android 14 引入的预测性返回手势一直是跨平台适配的痛点。1.10 中,旧的 PredictiveBackHandler 正式废弃,取而代之的是更清晰的 Navigation Event API。

Before:

bash 复制代码
// ❌ 旧 API ------ 回调逻辑混在 try-catch 中
PredictiveBackHandler(enabled = true) { progress ->
    try {
        progress.collect { event ->
            // 处理手势进度动画
        }
        // ✅ 手势完成
    } catch (e: Exception) {
        // ❌ 手势取消
    }
}

After:

bash 复制代码
// ✅ 新 API ------ 职责分离,逻辑清晰
val navState = rememberNavigationEventState(
    NavigationEventInfo.None
)

NavigationBackHandler(
    state = navState,
    isBackEnabled = true,
    onBackCancelled = { /* 手势取消 */ },
    onBackCompleted = { /* 手势完成 */ }
)

LaunchedEffect(navState.transitionState) {
    val state = navState.transitionState
    if (state is NavigationEventTransitionState.InProgress) {
        val progress = state.latestEvent.progress
        // 用 progress 驱动动画
    }
}

核心变化:

|

维度

|

旧 API

|

新 API

|

| --- | --- | --- |

|

完成/取消

|

try-catch 区分

|

独立回调 onBackCompleted / onBackCancelled

|

|

进度追踪

|

Flow collect

|

TransitionState 状态观察

|

|

状态管理

|

|

NavigationEventState 保存 UI 状态

|


开箱即用的 Hot Reload

Compose Hot Reload 不再需要手动配置插件,现已内置到 Compose Multiplatform Gradle 插件中。

  • • 桌面应用默认启用

  • • 最低要求 Kotlin 2.1.20

  • • 已有项目可安全移除显式的 Hot Reload 插件声明

bash 复制代码
// ❌ 不再需要手动添加
plugins {
    id("org.jetbrains.compose-hot-reload") // 可以删了
}

// ✅ Compose 插件自带
plugins {
    id("org.jetbrains.compose")  // Hot Reload 已内置
}

改代码,保存,立刻看到效果。这才是 2026 年该有的开发体验。


iOS 重要更新

Window Insets 支持

现在支持 WindowInsetsRulers,可以基于状态栏、导航栏、软键盘等窗口内边距来定位和调整 UI 元素。

自定义 IME 配置

通过 PlatformImeOptions 实现:

  • UIResponder.inputView:替换系统键盘为自定义输入视图

  • UIResponder.inputAccessoryView:在键盘上方添加自定义辅助视图

互操作视图叠加

新增实验性 placedAsOverlay 标志:

bash 复制代码
@OptIn(ExperimentalComposeUiApi::class)
UIKitViewController(
    modifier = modifier,
    factory = { createNativeMap() },
    properties = UIKitInteropProperties(
        placedAsOverlay = true  // 渲染在 Compose UI 之上
    )
)

地图、视频播放器等原生视图现在可以更自然地叠加在 Compose UI 之上。

互操作视图自动调整大小

UIKit 互操作视图支持根据 intrinsicContentSize 自动调整大小,包括通过 UIHostingController 包装的 SwiftUI 视图。


其他值得关注的更新

Web 端资源缓存

  • • 使用 Web Cache API 缓存静态资产

  • • 应用启动或页面刷新时自动清理缓存

Skia 升级至 M138

  • • 从 M132 大幅升级,带来渲染性能和功能改进

以下属性从实验性提升为稳定状态:

  • DialogProperties.usePlatformInsets

  • DialogProperties.scrimColor

  • PopupProperties.usePlatformDefaultWidth

  • PopupProperties.usePlatformInsets

AGP 9.0.0 兼容

  • • 需升级到 CMP 1.9.3 或 1.10.0

迁移注意事项

Kotlin 版本要求:

  • • 如果项目包含 native 或 web 目标,需升级到 Kotlin 2.2.20

  • • Hot Reload 最低要求 Kotlin 2.1.20

依赖别名废弃:

  • compose.uicompose.material3 等 Gradle 插件依赖别名已废弃

  • • 建议改用版本目录(Version Catalog)中的直接库引用

  • • 未来将提供 BOM 简化依赖管理


写在最后

Compose Multiplatform 1.10 是一次质变级的更新:

  • 统一 @Preview 消除了跨平台预览的碎片化

  • Navigation 3 让导航逻辑真正实现一次编写、多端运行

  • 内置 Hot Reload 大幅提升桌面端开发效率

  • iOS 互操作增强 让混合开发更加顺滑

如果你正在做 KMP 项目,现在就是升级的好时机。


你的项目升级到 1.10 了吗?遇到了什么问题?欢迎在评论区交流。

相关推荐
流星白龙2 小时前
【MySQL】19.MySQL用户管理
android·mysql·adb
匆忙拥挤repeat2 小时前
Android Compose 可组合项的生命周期、副作用API
android
hnlgzb3 小时前
目前编写安卓app的话有哪几种设计模式?
android·设计模式·kotlin·android jetpack·compose
studyForMokey4 小时前
【Android面试】Fragment生命周期专题
android·microsoft·面试
Android系统攻城狮5 小时前
Android tinyalsa深度解析之pcm_plugin_open调用流程与实战(一百七十四)
android·pcm·tinyalsa·音频进阶手册
用户622386252176 小时前
Android 列表控件实战:从 ListView 到 RecyclerView,仿今日头条 HeadLine 项目全解析
android
呦呼4576 小时前
Android 仿今日头条项目分析
android
Android系统攻城狮6 小时前
Android tinyalsa深度解析之pcm_params_set_max调用流程与实战(一百七十)
android·pcm·tinyalsa·android音频进阶
怀化纱厂球迷6 小时前
android车载应用动画-仿窗帘式下拉显示!Android 实现跟手裁剪动画 + RecyclerView 列表展示
android·java