今天,Jetpack Compose 2026 年 4 月版已发布稳定版。此版本包含核心 Compose 模块的 1.11 版(请参阅完整的 BoM 映射)、共享元素调试工具、触控板事件等。我们还提供了一些实验性 API,欢迎您试用并向我们提供反馈。
如需使用今天的版本,请将 Compose BOM 版本升级到:
implementation(platform("androidx.compose:compose-bom:2026.04.01"))
Compose 1.11.0 中的变化
测试中的协程执行
我们对 Compose 处理测试计时的方式进行了重大更新。继 Compose 1.10 中宣布的选择启用期之后,v2 测试 API 现在是默认 API,而 v1 API 已被弃用。主要变化是默认测试调度程序的转变。v1 API 依赖于 UnconfinedTestDispatcher,该调度程序会立即执行协程,而 v2 API 使用 StandardTestDispatcher。这意味着,在测试中启动协程时,该协程现在会排队,并且在虚拟时钟前进之前不会执行。
这样可以更好地模拟生产条件,有效地消除竞态条件,并使测试套件更加稳健,减少不稳定性。
为确保测试与标准协程行为保持一致,并避免日后出现兼容性问题,我们强烈建议您迁移测试套件。如需了解 API 映射和常见修复,请参阅我们的全面 迁移指南。
共享元素改进和动画工具
我们还为共享元素和 Modifier.animatedBounds 添加了一些实用的可视化调试工具。您现在可以准确地了解幕后发生的情况,例如目标边界、动画轨迹以及找到的匹配项数量,从而更轻松地发现过渡可能无法按预期运行的原因。如需使用新工具,只需使用 LookaheadAnimationVisualDebugging 可组合项将 SharedTransitionLayout 括起来即可。
LookaheadAnimationVisualDebugging( overlayColor = Color(0x4AE91E63), isEnabled = true, multipleMatchesColor = Color.Green, isShowKeylabelEnabled = false, unmatchedElementColor = Color.Red, ) { SharedTransitionLayout { CompositionLocalProvider( LocalSharedTransitionScope provides this, ) { // your content } } }
触控板事件
我们改进了 Compose 对触控板的支持,例如内置笔记本电脑触控板、平板电脑可连接触控板或外部/虚拟触控板。基本触控板事件现在通常被视为 PointerType.Mouse 事件,使鼠标和触控板行为与用户预期更好地保持一致。以前,这些触控板事件被解释为 PointerType.Touch 的虚假触摸屏手指,这会导致用户体验混乱。例如,使用触控板点击并拖动会滚动而不是选择。通过更改这些事件在最新版 Compose 中的指针类型,使用触控板点击并拖动将不再滚动。
我们还添加了对 API 34 以来平台识别的更复杂触控板手势的支持,包括 双指滑动 和 捏合。这些手势会被 Modifier.scrollable 和 Modifier.transformable 等组件自动识别,以便更好地使用触控板。
这些更改改进了内置组件中触控板的行为,移除了冗余的触摸斜率,提供了更直观的拖放起始手势、文本字段中的双击和三击选择,以及文本字段中的桌面样式上下文菜单。
如需测试触控板行为,可以使用包含 performTrackpadInput, 的新测试 API,该 API 可用于验证应用在使用触控板时的行为。如果您有自定义手势检测器,请验证各种输入类型(包括触摸屏、鼠标、触控板和触控笔)的行为,并确保支持鼠标滚轮和触控板手势。
组合宿主默认值(Compose 运行时)
我们引入了 HostDefaultProvider、LocalHostDefaultProvider、HostDefaultKey 和 ViewTreeHostDefaultKey,以便直接通过 compose-runtime 提供宿主级服务。这样就不需要库依赖于 compose-ui 进行查找,从而更好地支持 Kotlin Multiplatform。如需将这些值链接到组合树,库作者可以使用 compositionLocalWithHostDefaultOf 创建一个 CompositionLocal,该 CompositionLocal 可从宿主解析默认值。
预览封装容器
Android Studio 自定义预览 是一项新功能,可让您准确定义 Compose 预览内容的显示方式。
通过实现 PreviewWrapperProvider 接口并应用新的 @PreviewWrapper 注释,您可以轻松注入自定义逻辑,例如应用特定的 Theme。该注释可以应用于使用 @Composable 和 @Preview 或 @MultiPreview 注释的函数,提供通用且易于使用的解决方案,适用于各种预览功能,并显著减少重复代码。
class ThemeWrapper: PreviewWrapper { @Composable override fun Wrap(content: @Composable (() -> Unit)) { JetsnackTheme { content() } } } @PreviewWrapperProvider(ThemeWrapper::class) @Preview @Composable private fun ButtonPreview() { // JetsnackTheme in effect Button(onClick = {}) { Text(text = "Demo") } }
弃用和移除
- 正如 Compose 1.10 博文 中所宣布的那样,我们将弃用
Modifier.onFirstVisible()。其名称经常导致误解,尤其是在延迟布局中,该名称会在滚动期间多次触发。我们建议迁移到Modifier.onVisibilityChanged(),该方法可以根据您的具体应用场景要求,更精确地手动跟踪可见性状态。 - 移除了
ComposeFoundationFlags.isTextFieldDpadNavigationEnabled标志,因为TextFields的方向键导航现在默认始终处于启用状态。新行为可确保来自游戏手柄或电视遥控器的方向键事件首先在给定方向移动光标。只有当光标到达文本末尾时,焦点才能移到另一个元素。
即将推出的 API
在即将发布的 Compose 1.12.0 版本中,compileSdk 将升级到 compileSdk 37,AGP 9 以及所有依赖于 Compose 的应用和库都将继承此要求。我们建议您及时了解最新发布的版本,因为 Compose 旨在及时采用新的 compileSdks,以便提供对最新 Android 功能的访问权限。如需详细了解不同 API 级别支持的 AGP 版本,请务必查看此处的文档。
在 Compose 1.11.0 中,以下 API 以 @Experimental 的形式引入,我们期待您在应用中探索这些 API 时提供反馈。请注意,@Experimental APIs 仅用于早期评估和反馈,在未来的版本中可能会发生重大更改或被移除。
样式(实验性)
我们将推出一个新的实验性基础 API,用于 设置样式。Style API 是一种用于自定义组件视觉元素的新范例,传统上,这些元素都是使用修饰符进行自定义的。它旨在通过公开一组标准的可设置样式的属性,并提供简单的基于状态的样式设置和动画过渡,从而实现更深入、更轻松的自定义。借助此新 API,我们已经看到了令人期待的 性能优势。我们计划在 Style API 稳定后,在 Material 组件中采用样式。
以下是替换按下状态样式背景的基本示例:
@Composable fun LoginButton(modifier: Modifier = Modifier) { Button( onClick = { // Login logic }, modifier = modifier, style = { background( Brush.linearGradient( listOf(lightPurple, lightBlue) ) ) width(75.dp) height(50.dp) textAlign(TextAlign.Center) externalPadding(16.dp) pressed { background( Brush.linearGradient( listOf(Color.Magenta, Color.Red) ) ) } } ){ Text( text = "Login", ) } }
MediaQuery(实验性)
新的 mediaQuery API 提供了一种声明式且高性能的方式,可让您的界面适应其环境。它将复杂的信息检索抽象为 UiMediaScope 中的简单条件,确保仅在需要时进行重组。
通过支持各种环境信号(从键盘类型和指针精度等设备功能到窗口大小和折叠状态等上下文状态),您可以打造深度响应式体验。derivedMediaQuery 内置了性能,可处理高频率更新,同时能够替换范围,从而在各种硬件配置中实现无缝测试和预览。以前,如需访问某些设备属性(例如设备是否处于 桌面模式),您需要编写大量样板代码:
@Composable fun isTabletopPosture( context: Context = LocalContext.current ): Boolean { val windowLayoutInfo by WindowInfoTracker .getOrCreate(context) .windowLayoutInfo(context) .collectAsStateWithLifecycle(null) return windowLayoutInfo.displayFeatures.any { displayFeature -> displayFeature is FoldingFeature && displayFeature.state == FoldingFeature.State.HALF_OPENED && displayFeature.orientation == FoldingFeature.Orientation.HORIZONTAL } } @Composable fun VideoPlayer() { if(isTabletopPosture()) { TabletopLayout() } else { FlatLayout() } }
现在,借助 UIMediaQuery,您可以添加 mediaQuery 语法来查询设备属性,例如设备是否处于桌面模式:
@OptIn(ExperimentalMediaQueryApi::class) @Composable fun VideoPlayer() { if (mediaQuery { windowPosture == UiMediaScope.Posture.Tabletop }) { TabletopLayout() } else { FlatLayout() } }
网格(实验性)
Grid 是一种功能强大的新 API,用于在 Jetpack Compose 中构建复杂的二维布局。Row 和 Column 非常适合线性设计,而 Grid 可为您提供屏幕级架构和复杂组件所需的结构控制,而无需可滚动列表的开销。Grid 可让您使用轨道、间距和单元格定义布局,并提供熟悉的尺寸选项,例如 Dp、百分比、固有内容大小和灵活的“Fr”单位。
@OptIn(ExperimentalGridApi::class) @Composable fun GridExample() { Grid( config = { repeat(4) { column(0.25f) } repeat(2) { row(0.5f) } gap(16.dp) } ) { Card1(modifier = Modifier.gridItem(rowSpan = 2) Card2(modifier = Modifier.gridItem(colmnSpan = 3) Card3(modifier = Modifier.gridItem(columnSpan = 2) Card4() } }
您可以自动放置项,也可以明确地将项跨越多个行和列,以实现精确放置。最重要的是,它具有高度自适应性,您可以动态重新配置网格轨道和跨度,以响应桌面模式或屏幕方向更改等设备状态,确保界面在各种设备形态中看起来都很棒。
FlexBox(实验性)
FlexBox 是一种布局容器,专为高性能自适应界面而设计。它根据可用的容器尺寸管理项的大小和空间分布。它可以处理复杂的任务,例如项的换行 (wrap) 和多轴对齐 (justifyContent, alignItems, alignContent)。它允许项增大 (grow) 或缩小 (shrink) 以填充容器。
@OptIn(ExperimentalFlexBoxApi::class) fun FlexBoxWrapping(){ FlexBox( config = { wrap(FlexWrap.Wrap) gap(8.dp) } ) { RedRoundedBox() BlueRoundedBox() GreenRoundedBox(modifier = Modifier.width(350.dp).flex { grow(1.0f) }) OrangeRoundedBox(modifier = Modifier.width(200.dp).flex { grow(0.7f) }) PinkRoundedBox(modifier = Modifier.width(200.dp).flex { grow(0.3f) }) } }
新的 SlotTable 实现(实验性)
我们引入了 SlotTable 的新实现,该实现在此版本中默认处于停用状态。SlotTable 是 Compose 运行时用于跟踪组合层次结构状态、跟踪失效/重组、存储记住的值以及在运行时跟踪组合的所有元数据的内部数据结构。此新实现旨在提高性能,主要针对随机编辑。
如需试用新的 SlotTable,请启用 ComposeRuntimeFlags.isLinkBufferComposerEnabled。
立即开始编码!
Jetpack Compose 中有许多令人兴奋的新 API,而且还有更多 API 即将推出,现在是 迁移到 Jetpack Compose 的最佳时机。与往常一样,我们重视您的反馈和功能请求(尤其是针对仍在开发中的 @Experimental 功能),请 在此处提交。祝编程顺利!
继续阅读
-
产品资讯
在 Google I/O 2026 大会上,我们介绍了 Android 从操作系统到智能系统的转变。我们还演示了如何使用系统原生构建智能体验,以及如何将 Google AI 的强大功能融入您的应用。
Jingyu Shi • 阅读用时:2 分钟
-
产品资讯
我们很高兴地宣布,Android XR 现已正式支持 Unreal Engine 和 Godot。我们还推出了旨在提高您的工作效率并启用新的 XR 功能的新工具:Android XR Engine Hub 和 Android XR Interaction Framework。
-
产品资讯
随着 Android 17 的发布,我们将过渡到自适应优先开发标准。您的用户不再依赖于单一设备规格;他们会在手机、可折叠设备、平板电脑、笔记本电脑、汽车显示屏和沉浸式 XR 环境之间切换。
Fahd Imtiaz • 阅读用时:4 分钟
随时了解最新动态
每周通过电子邮件接收最新的 Android 开发洞见 每周。