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 了吗?遇到了什么问题?欢迎在评论区交流。

相关推荐
哑巴湖小水怪4 小时前
Android的架构是四层还是五层
android·架构
2501_916008896 小时前
深入解析iOS应用启动性能优化策略与实践
android·ios·性能优化·小程序·uni-app·cocoa·iphone
美狐美颜SDK开放平台7 小时前
短视频/直播双场景美颜SDK开发方案:接入、功能、架构详解
android·ios·美颜sdk·第三方美颜sdk·视频美颜sdk
untE EADO7 小时前
在 MySQL 中使用 `REPLACE` 函数
android·数据库·mysql
iblade8 小时前
Android CLI And Skills 3x faster
android
阿巴斯甜9 小时前
SharedUnPeekLiveData和UnPeekBus的区别:
android
阿巴斯甜9 小时前
UnPeek-LiveData的使用:
android
我就是马云飞10 小时前
我废了!大厂10年的我面了20家公司,面试官让我回去等通知!
android·前端·程序员
limuyang211 小时前
在 Android 上用上原生的 xxHash,性能直接拉满
android
Fate_I_C11 小时前
ViewModel 的生命周期与数据保持
android·kotlin