Compose Runtime
androidx.compose.runtime
androidx.compose.runtime.rxjava2
androidx.compose.runtime.rxjava3
androidx.compose.runtime.saveable
androidx.compose.runtime.snapshots
(如需获取所有 Compose 软件包,请参阅 API 参考文档)
| 最近更新时间 | 稳定版 | 候选版 | Beta 版 | Alpha 版 |
|---|---|---|---|---|
| 2025 年 10 月 22 日 | 1.9.4 | - | 1.10.0-beta01 | - |
结构
Compose 由 androidx 中的 7 个 Maven 组 ID 构成。每个组都包含一套特定用途的功能,并各有专属的版本说明。
下表介绍了各个组的内容,点击链接即可查看其版本说明。
| 组 | 说明 |
|---|---|
| compose.animation | 在 Jetpack Compose 应用中构建动画,丰富用户体验。 |
| compose.compiler | 借助 Kotlin 编译器插件,转换 @Composable functions(可组合函数)并启用优化功能。 |
| compose.foundation | 使用现成可用的构建块编写 Jetpack Compose 应用,还可扩展 Foundation 以构建您自己的设计系统元素。 |
| compose.material | 使用现成可用的 Material Design 组件构建 Jetpack Compose UI。这是更高层级的 Compose 入口点,旨在提供与 www.material.io 上描述的组件一致的组件。 |
| compose.material3 | 使用 Material Design 3(新一代 Material Design)组件构建 Jetpack Compose UI。Material 3 中包括了更新后的主题和组件,以及动态配色等 Material You 个性化功能,旨在与新的 Android 12 视觉风格和系统界面相得益彰。 |
| compose.runtime | Compose 编程模型和状态管理的基本构建块,以及 Compose 编译器插件的目标核心运行时。 |
| compose.ui | 与设备互动所需的 Compose UI 的基本组件,包括布局、绘图和输入。 |
声明依赖项
如需添加 Compose 的依赖项,您必须将 Google Maven 制品库添加到项目中。如需了解详情,请参阅 Google 的 Maven 制品库。
在应用或模块的 build.gradle 文件中添加所需工件的依赖项:
Groovy
dependencies { implementation "androidx.compose.runtime:runtime:1.9.4" implementation "androidx.compose.runtime:runtime-livedata:1.9.4" implementation "androidx.compose.runtime:runtime-rxjava2:1.9.4" } android { buildFeatures { compose true } composeOptions { kotlinCompilerExtensionVersion = "1.5.15" } kotlinOptions { jvmTarget = "1.8" } }
Kotlin
dependencies { implementation("androidx.compose.runtime:runtime:1.9.4") implementation("androidx.compose.runtime:runtime-livedata:1.9.4") implementation("androidx.compose.runtime:runtime-rxjava2:1.9.4") } android { buildFeatures { compose = true } composeOptions { kotlinCompilerExtensionVersion = "1.5.15" } kotlinOptions { jvmTarget = "1.8" } }
如需详细了解依赖项,请参阅添加 build 依赖项。
反馈
您的反馈将帮助我们改进 Jetpack。如果您发现了新问题,或对此库有任何改进建议,请告诉我们。创建新问题前,请先查看此库中的现有问题。您可以点击星标按钮,为现有问题投票。
如需了解详情,请参阅问题跟踪器文档。
Runtime Tracing 版本 1.7
版本 1.7.0-rc01
2024 年 9 月 18 日
发布了 androidx.compose.runtime:runtime-tracing:1.7.0-rc01。版本 1.7.0-rc01 中包含这些提交内容。
Runtime Tracing 版本 1.0
版本 1.0.0-beta01
2023 年 11 月 29 日
发布了 androidx.compose.runtime:runtime-tracing:1.0.0-beta01。版本 1.0.0-beta01 中包含这些提交内容。
版本 1.0.0-alpha05
2023 年 11 月 15 日
发布了 androidx.compose.runtime:runtime-tracing:1.0.0-alpha05。版本 1.0.0-alpha05 中包含这些提交内容。
bug 修复
- 将依赖项固定到最低受支持的稳定版本(即 compose-runtime 和 tracing-perfetto)- 修复了 compose-runtime-tracing 会将较新版本的 compose-runtime 引入应用的问题。
版本 1.0.0-alpha04
2023 年 8 月 23 日
发布了 androidx.compose.runtime:runtime-tracing:1.0.0-alpha04。版本 1.0.0-alpha04 中包含这些提交内容。
新功能
- 与最新版本的基准测试和 Perfetto 跟踪兼容,支持在应用启动时(冷启动)进行合成跟踪,例如在 AndroidX 基准测试和 Android Studio 中(从 Hedgehog Beta 2 开始)。
API 变更
androidx.tracing.perfetto.Trace已重命名为androidx.tracing.perfetto.PerfettoSdkTrace。(I44af8)- 使跟踪 Perfetto SDK API 与
android.os.Trace保持一致。(I73ba0、b/282199917) - 在应用启动时进行跟踪的前提条件。(Iad890)
- 合并了实验性 API 文件和公共 API 文件(I0f2e1、b/278769092)
版本 1.0.0-alpha02
2023 年 2 月 8 日
发布了 androidx.compose.runtime:runtime-tracing:1.0.0-alpha02。版本 1.0.0-alpha02 中包含这些提交内容。
新功能
- 无任何功能更改。对下游依赖项
androidx.tracing:tracing-perfetto*进行了多项性能优化。
版本 1.0.0-alpha01
2022 年 9 月 7 日
发布了 androidx.compose.runtime:runtime-tracing:1.0.0-alpha01。版本 1.0.0-alpha01 中包含这些提交内容。
新功能
androidx.compose.runtime:runtime-tracing是一个库,如果存在支持该库的工具(即将推出),则支持在 Compose 应用中进行扩展跟踪。此初始版本为 1.0.0-alpha01。
版本 1.10
版本 1.10.0-beta01
2025 年 10 月 22 日
发布了 androidx.compose.runtime:runtime-*:1.10.0-beta01。版本 1.10.0-beta01 中包含这些提交内容。
API 变更
RetainedValuesStore.getExitedValueOrDefault已重命名为RetainedValuesStore.getExitedValueOrElse(If9653、b/452340613)isKeepingExitedValues已重命名为isRetainingExitedValues(I660bf、b/437095756)RetainScope已重命名为RetainedValuesStore。RetainScopeHolder已重命名为RetainedValuesStoreRegistry。RetainScopeHolder.RetainScopeProvider已重命名为RetainedValuesStoreRegistry.ProvideChildRetainedValuesStore。(Idf23a、b/437095756)
bug 修复
- 在
SaveableStateRegistry中延迟初始化SavedState,直到首次使用时才进行初始化。(Ic0a93)
版本 1.10.0-alpha05
2025 年 10 月 8 日
发布了 androidx.compose.runtime:runtime-*:1.10.0-alpha05。版本 1.10.0-alpha05 中包含这些提交内容。
bug 修复
- 在发布模式下填充
DiagnosticComposeException的堆栈轨迹。(Ib76cb) - 修复了快照状态中的一个问题,即当使用类型的合并政策时,可能会导致错误地计算先前的值,从而返回状态的未来值而不是先前的值。如果存在两个以上的待处理可变快照,并且至少有一个正在应用的值具有合并政策,就会出现这种情况。(I527b5、b/442791065)
版本 1.10.0-alpha04
2025 年 9 月 24 日
发布了 androidx.compose.runtime:runtime-*:1.10.0-alpha04。版本 1.10.0-alpha04 中包含这些提交内容。
API 变更
- 添加了
RetainScopeHolderAPI 来管理RetainScopes的集合。这可用于为容器和导航宿主实现留存,这些容器和导航宿主包含许多具有不同留存时限的子项。(I10e0f) - 添加了
RetainedContentHost和retainControlledRetainScopeAPI,可用于为消失的内容(例如可折叠窗格 [If81f6])创建自动管理的RetainScopes - 弃用了
Updater#set的内联重载,因为它对提供的值进行了太多次装箱。添加了Updater#init的过载,该过载接受一个参数,从而避免需要捕获 lambda。(Id679e) - 引入了
RetainedEffect,这是一个类似于DisposableEffect的附带效应 API,它遵循保留生命周期,而不是组合生命周期。此 API 旨在用于与不实现或无法实现RetainObserver的其他对象的保留相关联的效应。(I1c61f、b/177562901) - 更正了
RetainObserver.onRetained的文档,并添加了RetainObserver.onUnused(与RememberObserver.onAbandoned类似)(Ia6fc5)
bug 修复
- 修复了在函数(例如可组合调用)中的第一个组之后和可移除的组(例如
if语句)之前调度 remember 的问题,该问题可能会以错误的顺序调度onForgotten。(I453f6、b/346821372) - 避免在初始化
LaunchedEffect时遍历协程上下文。(I8d2c3b)
版本 1.10.0-alpha03
2025 年 9 月 10 日
发布了 androidx.compose.runtime:runtime-*:1.10.0-alpha03。版本 1.10.0-alpha03 中包含这些提交内容。
API 变更
- 引入了基于组密钥的 Compose 堆栈轨迹,默认情况下,所有精简版应用均会启用该功能。从 Kotlin 2.3.0 开始,Compose 编译器 Gradle 插件将生成这些轨迹的 ProGuard 映射。(Ifbcb5)
- 为工具添加了接口:
IdentifiableRecomposeScope(Idd5e0、b/434194620) - 防止在涉及
CompositionLocalContext的组合中发生不必要的失效(I3fa21、b/412750209)
bug 修复
- 在文档和工具中明确说明,传递给保留的键也会被保留。避免传递会导致内存泄漏的保留键。(Ib553b、b/177562901)
- 修复了以下问题:当在不同线程上调用已暂停的合成的
resume()时,如果主线程尝试为下一帧重新合成可暂停的合成,待处理通知的状态可能会变得混乱。(Ie5f17、b/442649894) - 记录在组合中捕获的异常。(I47d78、b/432799675、b/436878515、b/359623674、b/400436355)
版本 1.10.0-alpha02
2025 年 8 月 27 日
发布了 androidx.compose.runtime:runtime-*:1.10.0-alpha02。版本 1.10.0-alpha02 中包含这些提交内容。
API 变更
- 添加了
@DoNotRetain,可用于注释不应与retainAPI 一起使用的类型,可能是因为它们会泄漏资源。(Ie5435) - 使用 Kotlin 2.0 发布的项目需要使用 KGP 2.0.0 或更高版本。(Idb6b5)
bug 修复
- 修复了可移动内容,以便在内容修改合成的根节点时正确计算 Applier 的操作。在计算可移动内容的变化时,
up()调用可能会处于待处理状态,并且未调度到应用器,从而导致应用器状态在后续使用时定位不正确。(I7c583)、(I47b70) - 将
CheckResult标记为已废弃,因为它不应被使用。(I32934)
版本 1.10.0-alpha01
2025 年 8 月 13 日
发布了 androidx.compose.runtime:runtime-*:1.10.0-alpha01。版本 1.10.0-alpha01 中包含这些提交内容。
API 变更
- 引入了保留 API。与
rememberSaveable类似,retain 可以持久保存离开组合层次结构的记忆值。保留的值不会序列化,并且比保存的值具有更短的生命周期,其行为类似于 androidxViewModel。如需了解详情,请参阅相关文档。(Ia3105、b/177562901) - 添加了
awaitOrScheduleNextCompositionEnd()API,该 API 会在 Recomposer 完成当前帧的合成时发出回调。如果 Recomposer 当前未合成帧,此 API 会暂停,直到下一个帧的合成完成,并安排合成新帧。(Ib873c) - 添加了一个不返回 Unit 的组合本地提供程序 API(I22521、b/271871288)
- 添加了一个功能标志
isMovableContentUsageTrackingEnabled,用于跟踪可移动内容的使用情况,以避免在最初创建内容时产生一些开销。此功能标志目前默认处于停用状态。(Ia713d)
bug 修复
- 修复了可移动内容在子合成之间移动时发生的崩溃问题。(I3fa1e、b/436858107)
- 修复了以下 bug:当可组合函数位于多个嵌套的子组合函数内时,可组合函数堆栈轨迹的一部分会缺失。(I98c6f)
- 将默认 minSdk 从 API 21 移至 API 23(Ibdfca、b/380448311、b/435705964、b/435705223)
- 修复了从多个线程更新可暂停的组合的内部状态时出现的竞态条件。(I03895)
- 更新了组合注册观测器,使其在初始组合之前被调用。(I4adca、b/430600932)
- 修复了小 bug,使
AutoboxingStateValuePropertyDetector同时兼容 K1 和 K2。(Ie81c1)
外部贡献
- 使 runtime-rxjava2 制品成为多平台制品,并添加 JVM 作为受支持的目标平台。(I5409e)
- 使 runtime-rxjava3 制品成为多平台制品,并添加 JVM 作为受支持的目标平台。(I97e84)
版本 1.9
版本 1.9.4
2025 年 10 月 22 日
发布了 androidx.compose.runtime:runtime-*:1.9.4。版本 1.9.4 中包含这些提交内容。
版本 1.9.3
2025 年 10 月 8 日
发布了 androidx.compose.runtime:runtime-*:1.9.3。版本 1.9.3 中包含这些提交内容。
版本 1.9.2
2025 年 9 月 24 日
发布了 androidx.compose.runtime:runtime-*:1.9.2。版本 1.9.2 中包含这些提交内容。
版本 1.9.1
2025 年 9 月 10 日
发布了 androidx.compose.runtime:runtime-*:1.9.1。版本 1.9.1 中包含这些提交内容。
bug 修复
- 避免重新合成正在合成的合成内容。(Iacb01)
- 防止重组范围被暂停两次。(I060b2、b/431584881)
版本 1.9.0
2025 年 8 月 13 日
发布了 androidx.compose.runtime:runtime-*:1.9.0。版本 1.9.0 中包含这些提交内容。
自 1.8.0 以来的重要变更
- 随 Compose 提供的 Lint 检查现在要求 AGP 版本不低于 8.8.2。如果您无法升级 AGP,可以改为在 gradle.properties 中使用
android.experimental.lint.version=8.8.2(或更新的版本)单独升级 Lint。如需在 IDE 中运行 Compose lint 检查,您必须使用 Android Studio Ladybug 或更高版本。 - 已创建新的运行时注释库。此工件包含不依赖于 Compose 运行时的注释定义,因此可以从非 Compose 模块中使用。
@Stable、@Immutable和@StableMarker已移至 runtime-annotation,以允许注释非 Compose 模块- 已将
@FrequentlyChangingValue和@RememberInComposition添加到 runtime-annotation。@FrequentlyChangingValue标记可能会导致频繁重组的声明,@RememberInComposition标记在组合中应记住的声明。相应的 lint 检查会针对不正确的用法发出警告。
版本 1.9.0-rc01
2025 年 7 月 30 日
发布了 androidx.compose.runtime:runtime-*:1.9.0-rc01。版本 1.9.0-rc01 中包含这些提交内容。
bug 修复
- 更新了组合注册观测器,使其在初始组合之前被调用。(I4adca、b/430600932)
版本 1.9.0-beta03
2025 年 7 月 16 日
发布了 androidx.compose.runtime:runtime-*:1.9.0-beta03。版本 1.9.0-beta03 中包含这些提交内容。
版本 1.9.0-beta02
2025 年 7 月 2 日
发布了 androidx.compose.runtime:runtime-*:1.9.0-beta02。版本 1.9.0-beta02 中包含这些提交内容。
bug 修复
- 缩短了槽表中值在组合之间的引用生命周期。在某些情况下,slot 表中的引用可能会比必要的时长多持续一帧。(I49e74、b/418516940)
- 移除了热重载方法的 Kotlin 乱码。(Ic56a3、b/426871325)
版本 1.9.0-beta01
2025 年 6 月 18 日
发布了 androidx.compose.runtime:runtime-*:1.9.0-beta01。版本 1.9.0-beta01 中包含这些提交内容。
API 变更
- 添加了用于解析由 Compose 编译器添加的源代码信息的工具 API。(Iceaf9、b/408492167)
SnapshotStateSet现在在 Android 上实现了Parcelable,因此现在支持将其用作rememberSaveable { ... }的一部分。(I755dd、b/378623803)SnapshotStateList现在在 Android 上实现了Parcelable,因此现在支持将其用作rememberSaveable { ... }的一部分。(Id18be、b/378623803)movableContentOf()现在已标记@RememberInComposition注释,这可让 lint 捕获错误用法 (I2738d)- 更新了实验性组合观察器 API,以更全面地观察重新组合的原因 (I32b6a)
- 将
setDiagnosticStackTraceEnabled更改为实验性,以考虑此功能的未来发展。(I11db3) currentCompositeKeyHash现已被弃用。已改用currentCompositeKeyHashCode。替换 API 使用更多位对同一哈希进行编码,从而大幅降低了组成层次结构中两个随机无关的组具有相同哈希键的几率。(I4cb6a、b/177562901)- 使用 Kotlin 2.0 发布的项目需要使用 KGP 2.0.0 或更高版本才能使用 (Idb6b5)
@Stable、@Immutable和@StableMarker已以兼容的方式移至运行时注释。如果您想从不依赖于 Compose 的库中使用这些注释,现在可以依赖于 runtime-annotation。(I23a16)- 将接受
KSerializer的rememberSaveable重载重命名为rememberSerializable。此变更明确了其与kotlinx.serialization的预期用途。直接在rememberSaveable中支持一般kotlinx.Serializable类需要reified类型形参,这会破坏源代码兼容性,因为需要所有调用方在编译时提供具体化的类型信息。(Idb875、I38627、b/376028110)
bug 修复
- 已设置可暂停内容且已取消的组合必须进行处置。现在,组合会检查此情况,如果重复使用,则会抛出异常。(I2daa5、b/406792785)
- 修复了可暂停的组合,使其在可暂停的组合被处置时不再发送虚假的
onForgotten来记住观察者。已取消的可暂停的组合中的RememberObservers应仅发送 onAbandoned。(I26f54) - 修复了可移动内容问题,即在处理可移动内容的后期阶段到达的失效会添加到 Composer,但当内容移动时,这些失效不会更新,导致内容在错误的位置重新组合。(Icd2fa、b/409439507)
- 修复了可移动内容在被合成后但在移动之前失效的问题。(I99eac、b/229001114)
- 在调用
previous()之后,调用由SnapshotStateList生成的列表迭代器的remove()可能会从列表中移除错误的元素,并且与ArrayList对同一调用序列执行的操作不匹配。(I05ab7、b/417493222) - 修复了
onForgotton的调度顺序问题,该问题可能会导致一次性效应的onDispose以错误的顺序执行。(Ic1c91、b/417450712) - 修复了在可暂停的组合中重用状态处理的问题(Ife96e、b/404058957)
- 修复了以下问题:当组合暂停并重新启动时,如果之前暂停的某些状态需要重组,因为在组合暂停期间,它读取的某些状态发生了变化,则会重复使用状态。(I441d1、b/416209738)
- 完成了针对问题 b/404058957 的可暂停组合 remember 调度修复,之前的修复不完整。(I1afd4、b/404058957)
OffsetApplier现在可以正确替换apply()(随可暂停的组合引入)。如果没有此功能,可暂停的组合在更新虚拟节点时可能会抛出异常。(Idbf31、b/409291131)- 修复了以下死锁问题:当正在调度帧时,如果取消对
FrameClock.withFrameNanos的暂停调用,可能会影响 Molecule 用户。(I89cab、b/407027032) - Recomposer 可能会因可移动内容而进入空闲状态(Ie5416、b/409267170)
- 在可暂停的组合期间,
onReuse和onDeactivate可能反转的顺序。现在,它们保证按onDeactivate/onReuse的顺序发生。(I996e4、b/404058957) - 修复了在可暂停的组合中调度 remember 观察者的功能,以避免在同一应用中调度 remembered/forgotten(I570b2、b/404645679、b/407931790)
- 在 Compose Multiplatform 中切换到不安全模式
LifecycleRegistry,以停用MainThread检查并修复线程问题。如需了解详情,请参阅 CMP-8227。(Icee87)
外部贡献
- 修复了影响 Molecule 用户的 bug,该 bug 会导致使用
RecompositionMode.Immediate时出现重新组合遗漏。(I9f3a9、b/419527812) - 公开了
PausableCompositionisApplied和isCancelledgetter,用于检查PausableComposition的状态。(I994aa) - 向
FunctionKeyMeta注解添加了AnnotationTarget.FUNCTION。(I08021)
版本 1.9.0-alpha04
2025 年 6 月 4 日
发布了 androidx.compose.runtime:runtime-*:1.9.0-alpha04。版本 1.9.0-alpha04 中包含这些提交内容。
API 变更
SnapshotStateSet现在在 Android 上实现了 Parcelable,因此现在支持将其用作rememberSaveable { ... }的一部分。(I755dd、b/378623803)SnapshotStateList现在在 Android 上实现了 Parcelable,因此现在支持将其用作rememberSaveable { ... }的一部分。(Id18be、b/378623803)movableContentOf()现在已标记@RememberInComposition注释,这可让 lint 捕获错误用法 (I2738d)- 更新了实验性组合观察器 API,以更全面地观察重新组合的原因 (I32b6a)
bug 修复
- 修复了
onForgotton的调度顺序问题,该问题可能会导致一次性效应的onDispose以错误的顺序执行。(Ic1c91、b/417450712) - 修复了在可暂停的组合中重用状态处理的问题(Ife96e、b/404058957)
- 修复了小 bug,使可变集合检测同时兼容 K1 和 K2 (Ie4878)
- 修复了小 bug,使对被替换的属性访问器的注释查找同时兼容 K1 和 K2 (I9900d)
外部贡献
- 修复了影响 Molecule 用户的 bug,该 bug 会导致使用
RecompositionMode.Immediate时出现重新组合遗漏。(I9f3a9、b/419527812) - 公开了
PausableCompositionisApplied 和isCancelledgetter,用于检查PausableComposition的状态。(I994aa)
版本 1.9.0-alpha03
2025 年 5 月 20 日
发布了 androidx.compose.runtime:runtime-*:1.9.0-alpha03。版本 1.9.0-alpha03 中包含这些提交内容。
API 变更
- 将
setDiagnosticStackTraceEnabled更改为实验性,以考虑此功能的未来发展。(I11db3)
bug 修复
- 修复了以下问题:当组合暂停并重新启动时,如果之前暂停的某些状态需要重组,因为在组合暂停期间,它读取的某些状态发生了变化,则会重复使用状态。(I441d1、b/416209738)
- 完成了针对问题 b/404058957 的可暂停组合 remember 调度修复,之前的修复不完整。(I1afd4、b/404058957)
SaveableStateHolder.SaveableStateProvider现在通过组合为其内容提供LocalSavedStateRegistryOwner。(Ia2761、b/413108878)androidx.compose.runtime.saveable现在依赖于androidx.lifecycle.runtime.compose。(I53228、b/413108878)
版本 1.9.0-alpha02
2025 年 5 月 7 日
发布了 androidx.compose.runtime:runtime-*:1.9.0-alpha02。版本 1.9.0-alpha02 中包含这些提交内容。
API 变更
- 已弃用具有自定义“键”的
rememberSaveable。它会绕过位置范围界定,从而导致状态 bug 和不一致的行为(例如,意外的状态共享或丢失、嵌套LazyLayouts中的问题)。请移除“key”参数,以使用位置范围界定来获得一致的本地范围状态。如需了解详情,请参阅完整的提交消息。(I5e6ff、b/357685851)
bug 修复
OffsetApplier现在可以正确替换apply()(随可暂停的组合引入)。如果没有此功能,可暂停的组合在更新虚拟节点时可能会抛出异常。(Idbf31、b/409291131)- 修复了以下死锁问题:当正在调度帧时,如果取消对
FrameClock.withFrameNanos的暂停调用,可能会影响 Molecule 用户。(I89cab、b/407027032) - Recomposer 可能会处于空闲状态,但可移动的内容状态仍处于待舍弃状态。这种情况通常不会发生,因为可移动的内容状态会在 Recomposer 的主循环中被舍弃。不过,当可移动内容在
resume()期间被舍弃时,可暂停的组合中可能会出现这种情况(Ie5416、b/409267170) - 在可暂停的组合期间,
onReuse和onDeactivate可能反转的顺序。现在,它们保证会按onDeactivate/onReuse的顺序发生。(I996e4、b/404058957)
版本 1.9.0-alpha01
2025 年 4 月 23 日
发布了 androidx.compose.runtime:runtime-*:1.9.0-alpha01。版本 1.9.0-alpha01 包含这些提交内容。
行为变更
- 随 Compose 提供的 Lint 检查现在要求 AGP 版本不低于 8.8.2。如果您无法升级 AGP,可以改为在
gradle.properties中使用android.experimental.lint.version=8.8.2(或更新版本)单独升级 Lint。如需在 IDE 中运行 Compose lint 检查,您必须使用 Android Studio Ladybug 或更高版本。
API 变更
currentCompositeKeyHash现已被弃用。已改用currentCompositeKeyHashCode。替换 API 使用更多位对同一哈希进行编码,从而大幅降低了组成层次结构中两个随机无关的组具有相同哈希键的几率。(I4cb6a、b/177562901)- 使用 Kotlin 2.0 发布的项目需要使用 KGP 2.0.0 或更高版本才能使用 (Idb6b5)
@Stable、@Immutable和@StableMarker已以兼容的方式移至运行时注释。如果您想从不依赖于 Compose 的库中使用这些注释,现在可以依赖于 runtime-annotation。(I23a16)- 移除了
onCreating和onDisposing,因为它们已被废弃并重命名为onPreCreate和onPreDispose。此变更完成了重命名。(I97461) - 公开一个本地组合,用于根据组合中的 Compose 节点位置附加 Compose 堆栈轨迹。(Ie0bda、b/354163858)
- 基于存储在组合中的来源信息,引入诊断性 Compose 堆栈轨迹。(I3db9f、b/354163858)
- 弃用
runWithTimingDisabled,改用runWithMeasurementDisabled,后者更清楚地描述了行为 - 所有指标均已暂停。此外,公开MicrobenchmarkScope超类,因为无法重新声明runWithMeasurementDisabled函数来打开访问权限,因为它是内联的。(I9e23b、b/389149423、b/149979716) - 添加了
@FrequentlyChangingValue:一种可用于标记函数和属性 getter 的注释,用于指示不应在组合内直接调用它们,因为这可能会导致频繁的重组。例如,标记滚动位置值和动画值。警告由相应的 lint 检查提供。(I83630、b/234042500) - 添加了
@RememberInComposition:一种可用于标记构造函数、函数和属性 getter 的注释,用于指示它们不得在组合中直接调用,而必须先进行记忆。相应的 lint 检查会引发错误。此注释可用于标记返回有状态 / 可变对象、在组合中需要保持身份的对象,或实例化成本高昂且应在组合中缓存的对象。(Ie7db0) - 添加了新的
rememberSaveable重载,该重载支持使用 KotlinX Serialization 实现类型安全的KSerializer状态持久性。仍支持基于Saver的现有 API。(Iea4ab、b/376028110)
bug 修复
- 修复了在可暂停的组合中调度 remember 观察者的功能,以避免在同一应用中调度 remembered/forgotten(I570b2、b/404645679、b/407931790)
- 根据 API 准则,将
SnapshotObserver方法 onCreating 重命名为onPreCreate,并将onDisposing重命名为onPreDispose。之前的这些方法已被废弃,新方法默认会调用旧方法,因此此接口的现有实现会继续正常运行,直到这些方法被移除。我们会在后续 CL 中移除这些方法,该 CL 将很快跟进此 CL。在 1.8 稳定版发布之前,将从 1.8 Beta 版中移除这些 API。(I6d753) - 修复了以下问题:在重组出现在可移动组之后的省略组时,记忆的值可能会被错误地遗忘并重新计算(I62cab、b/383769314)
- 在
LaunchedEffect和rememberCoroutineScope中添加了对 Compose 堆栈轨迹的支持(I705c0、b/354163858) - Compose lint 检查现在要求从命令行运行的 AGP 版本至少为 8.8.2,并且 IDE 支持至少需要 Android Studio Ladybug。如果您使用的是旧版 AGP,可以在 gradle.properties 中设置
android.experimental.lint.version=8.8.2以升级 Lint 版本,而不会影响 AGP。(I6f2a8)
外部贡献
- 向
FunctionKeyMeta注解添加了AnnotationTarget.FUNCTION。(I08021)
版本 1.8
版本 1.8.3
2025 年 6 月 18 日
发布了 androidx.compose.runtime:runtime-*:1.8.3。版本 1.8.3 中包含这些提交内容。
1.8.2 版
2025 年 5 月 20 日
发布了 androidx.compose.runtime:runtime-*:1.8.2。版本 1.8.2 中包含这些提交内容。
版本 1.8.1
2025 年 5 月 7 日
发布了 androidx.compose.runtime:runtime-*:1.8.1。版本 1.8.1 中包含这些提交内容。
版本 1.8.0
2025 年 4 月 23 日
发布了 androidx.compose.runtime:runtime-*:1.8.0。版本 1.8.0 中包含这些提交内容。
版本 1.8.0-rc03
2025 年 4 月 9 日
发布了 androidx.compose.runtime:runtime-*:1.8.0-rc03。版本 1.8.0-rc03 中包含这些提交内容。
版本 1.8.0-rc02
2025 年 3 月 26 日
发布了 androidx.compose.runtime:runtime-*:1.8.0-rc02。版本 1.8.0-rc02 中包含这些提交内容。
版本 1.8.0-rc01
2025 年 3 月 12 日
发布了 androidx.compose.runtime:runtime-*:1.8.0-rc01。版本 1.8.0-rc01 中包含这些提交内容。
API 变更
- 根据 API 准则,将
SnapshotObserver方法 onCreating 重命名为onPreCreate,并将onDisposing重命名为onPreDispose。之前的这些方法已被废弃,新方法默认会调用旧方法,因此此接口的现有实现会继续正常运行,直到这些方法被移除。我们会在后续 CL 中移除这些方法,该 CL 将很快跟进此 CL。在 1.8 稳定版发布之前,将从 1.8 Beta 版中移除这些 API。(I6d753)
版本 1.8.0-beta03
2025 年 2 月 26 日
发布了 androidx.compose.runtime:runtime-*:1.8.0-beta03。版本 1.8.0-beta03 中包含这些提交内容。
版本 1.8.0-beta02
2025 年 2 月 12 日
发布了 androidx.compose.runtime:runtime-*:1.8.0-beta02。版本 1.8.0-beta02 中包含这些提交内容。
bug 修复
- 在可暂停的组合中重新抛出捕获的异常。(384486d)
版本 1.8.0-beta01
2025 年 1 月 29 日
发布了 androidx.compose.runtime:runtime-*:1.8.0-beta01。版本 1.8.0-beta01 中包含这些提交内容。
API 变更
- 修复了在组合期间引发的未从 Exception 扩展的可抛出对象可能会导致“Pending composition has not been applied”错误的问题。(I356be、b/382094412)
版本 1.8.0-alpha08
2025 年 1 月 15 日
发布了 androidx.compose.runtime:runtime-*:1.8.0-alpha08。版本 1.8.0-alpha08 包含这些提交内容。
版本 1.8.0-alpha07
2024 年 12 月 11 日
发布了 androidx.compose.runtime:runtime-*:1.8.0-alpha07。版本 1.8.0-alpha07 中包含这些提交内容。
API 变更
- 添加了有助于布局检查器将子组合与父组合相关联的工具 API,以处理节点未用于桥接组合的情况。(I4ce3d)
- 将
SnapshotId的算术和特殊常量设为内部而非公开。如有必要,可以通过使用toInt()或toLong()将SnasphotId转换为Int或Long,然后对转换后的值执行算术运算。(Ic3a57)
外部贡献
- 针对
movableContentOf参数优化了存储。(ed87177)
版本 1.8.0-alpha06
2024 年 11 月 13 日
发布了 androidx.compose.runtime:runtime-*:1.8.0-alpha06。版本 1.8.0-alpha06 中包含这些提交内容。
API 变更
- 对
PausableCompositionAPI 的更改。这些是相对于 1.8.0-alpha 之前版本(自 1.8.0-alpha02 起)的破坏性变更,但由于这些是 1.8.0 中的新 API,因此在 API 仍处于 Alpha 阶段时,不会保持向后兼容性。(I39819) - 添加了用于观察 Recomposer 中新组合创建情况的工具 API (Iaeb7e)
- 向
Snapshot添加了类型为Long的snapshotId,并弃用了id。将快照的 ID 从Int更改为Long,以避免在帧速率非常高且动画运行时间很长的系统上出现快照 ID 溢出。该类型已设为预期/实际类型,以便在没有原生Long类型的平台上,该类型可以是Int或其他类型。没有原生Long的平台(例如 JavaScript)应避免使用高帧速率(超过 1000 FPS),否则会导致Int大约每 24 天溢出一次。(I38ac3、b/374821679)
bug 修复
- 修复了单个
provides的providesDefault。(aosp/3318540 b/374263387) - 优化
ChangeList。(3318538)
版本 1.8.0-alpha05
2024 年 10 月 30 日
发布了 androidx.compose.runtime:runtime-*:1.8.0-alpha05。版本 1.8.0-alpha05 中包含这些提交内容。
bug 修复
- 通过向
SnapshotIdSet添加Int.MAX_VALUE修复了堆栈溢出问题。(b/370536104、Ic4179f6) - 运行时微优化 (I50c60)
- 允许 R8 移除调试 runtimeCheck 调用 (I8c44)
- 使
compoundKeyOf变为迭代式而非递归式 (I5817f)
外部贡献
- 实现包含集合列表的堆栈 (I7d47c)
版本 1.8.0-alpha04
2024 年 10 月 16 日
发布了 androidx.compose.runtime:runtime-*:1.8.0-alpha04。版本 1.8.0-alpha04 中包含这些提交内容。
性能改进
- 在构造函数中为状态记录提供快照 ID (85c00f)
- 重构了
SnapshotState***以避免类验证错误 (6ee4a6) - 修复了 R8 规则,以防止抛出内嵌异常 (5beb92)
- 对操作进行微优化 (d73c5c)
- 优化 JVM 上的
SynchronizedObject分配 (2b043f)
版本 1.8.0-alpha03
2024 年 10 月 2 日
发布了 androidx.compose.runtime:runtime-*:1.8.0-alpha03。版本 1.8.0-alpha03 中包含这些提交内容。
性能改进
- 为
rememberCoroutineScope延迟创建子上下文 (f61464)rememberCoroutineScope通常用于启动协程以响应合成后发生的事件。在某些情况下,这些事件可能永远不会发生,从而导致创建和取消作业的成本增加,但没有任何好处。- 使
rememberCoroutineScope返回的范围在被访问时延迟创建其coroutineContext,如果范围从未使用,则完全避免创建和取消作业。
版本 1.8.0-alpha02
2024 年 9 月 18 日
发布了 androidx.compose.runtime:runtime-*:1.8.0-alpha02。版本 1.8.0-alpha02 中包含这些提交内容。
新功能
- 添加了
PausableComposition,该函数允许创建可在组合期间暂停并异步应用于组合的子组合。暂停功能需要编译器支持,目前正在开发中。(I3394b)
版本 1.8.0-alpha01
2024 年 9 月 4 日
发布了 androidx.compose.runtime:runtime-*:1.8.0-alpha01。版本 1.8.0-alpha01 中包含这些提交内容。
版本 1.7
版本 1.7.8
2025 年 2 月 12 日
发布了 androidx.compose.runtime:runtime-*:1.7.8。版本 1.7.8 中包含这些提交内容。
版本 1.7.7
2025 年 1 月 29 日
发布了 androidx.compose.runtime:runtime-*:1.7.7。与 1.7.6 相比没有任何变化。
发布了 androidx.compose.runtime:runtime-*:1.7.6。版本 1.7.6 中包含这些提交内容。
版本 1.7.5
2024 年 10 月 30 日
发布了 androidx.compose.runtime:runtime-*:1.7.5。版本 1.7.5 中包含这些提交内容。
版本 1.7.4
2024 年 10 月 16 日
发布了 androidx.compose.runtime:runtime-*:1.7.4。版本 1.7.4 中包含这些提交内容。
版本 1.7.3
2024 年 10 月 2 日
发布了 androidx.compose.runtime:runtime-*:1.7.3。版本 1.7.3 中包含这些提交内容。
版本 1.7.2
2024 年 9 月 18 日
发布了 androidx.compose.runtime:runtime-*:1.7.2。版本 1.7.2 中包含这些提交内容。
版本 1.7.1
2024 年 9 月 10 日
- Android 制品没有任何变化。移除了
-desktop制品,并添加了-jvmStubs和-linuxx64Stubs制品。这些目标均不打算使用,它们只是占位符,用于帮助 Jetbrains Compose 开展工作。
版本 1.7.0
2024 年 9 月 4 日
发布了 androidx.compose.runtime:runtime-*:1.7.0。版本 1.7.0 中包含这些提交内容。
自 1.6.0 以来的重要变更
- 新增了以下功能:提供基于其他组合本地变量的值计算出的组合本地变量(默认情况下使用
compositionLocalWithComputedDefault()),或提供一个 lambda 来使用providesComputed(而非provides)计算该值。 - 可通过在计算值的 lambda 中访问的组合本地变量的
currentValue属性获取组合本地变量的值。此属性用于代替仅在@Composable函数中可访问的current。(Iadbc0) - 新创建的状态对象可立即从其他快照(包括全局快照)访问,并具有其初始状态。在应用创建对象的快照之前,任何后续修改均不可见。
mutableStateOf()(及其原始版本)的初始状态是作为参数传递给mutableStateOf()的值。mutableStateListOf()和mutableStateMapOf()的初始状态为空。- 添加了
Snapshot.isInSnapshot和Snapshot.PreexistingSnapshotId,用于使状态对象在创建后能够立即从全局快照中访问。 - 自定义状态对象可以支持立即访问,只需遵循对内置快照对象所做的更改模式即可。(I84a17)
- 为 Compose 库启用
nonSkippingGroupOptimization。这使得 androidx 中所有不可重启的可组合函数的生成代码更加高效。我们计划在未来默认启用此功能。I(acbc08) - 使同一帧中子组合中的可组合 lambda 失效。(98301c)
- 以与
onForgotten相同的顺序调用onRelease回调。(2cd790) - 启用强力跳过模式 (ed1766)
- 在更多情况下使
currentCompoundHashKey保持唯一性 (d4a872)
版本 1.7.0-rc01
2024 年 8 月 21 日
发布了 androidx.compose.runtime:runtime-*:1.7.0-rc01。版本 1.7.0-rc01 中包含这些提交内容。
版本 1.7.0-beta07
2024 年 8 月 7 日
发布了 androidx.compose.runtime:runtime-*:1.7.0-beta07。版本 1.7.0-beta07 中包含这些提交内容。
版本 1.7.0-beta06
2024 年 7 月 24 日
发布了 androidx.compose.runtime:runtime-*:1.7.0-beta06。版本 1.7.0-beta06 中包含这些提交内容。
版本 1.7.0-beta05
2024 年 7 月 10 日
发布了 androidx.compose.runtime:runtime-*:1.7.0-beta05。版本 1.7.0-beta05 中包含这些提交内容。
版本 1.7.0-beta04
2024 年 6 月 26 日
发布了 androidx.compose.runtime:runtime-*:1.7.0-beta04。版本 1.7.0-beta04 中包含这些提交内容。
版本 1.7.0-beta03
2024 年 6 月 12 日
发布了 androidx.compose.runtime:runtime-*:1.7.0-beta03。版本 1.7.0-beta03 中包含这些提交内容。
版本 1.7.0-beta02
2024 年 5 月 29 日
发布了 androidx.compose.runtime:runtime-*:1.7.0-beta02。版本 1.7.0-beta02 中包含这些提交内容。
版本 1.7.0-beta01
2024 年 5 月 14 日
发布了 androidx.compose.runtime:runtime-*:1.7.0-beta01。版本 1.7.0-beta01 中包含这些提交内容。
版本 1.7.0-alpha08
2024 年 5 月 1 日
发布了 androidx.compose.runtime:runtime-*:1.7.0-alpha08。版本 1.7.0-alpha08 包含这些提交内容。
版本 1.7.0-alpha07
2024 年 4 月 17 日
发布了 androidx.compose.runtime:runtime-*:1.7.0-alpha07。版本 1.7.0-alpha07 中包含这些提交内容。
新功能
- 新增了以下功能:提供基于其他组合本地变量的值计算出的组合本地变量(默认情况下使用
compositionLocalWithComputedDefault()),或提供一个 lambda 来使用providesComputed(而非provides)计算该值。 - 可通过在计算值的 lambda 中访问的组合本地变量的
currentValue属性获取组合本地变量的值。此属性用于代替仅在@Composable函数中可访问的current。(Iadbc0)
API 变更
- 新创建的状态对象可立即从其他快照(包括全局快照)访问,并具有其初始状态。在应用创建对象的快照之前,任何后续修改均不可见。
mutableStateOf()(及其原始版本)的初始状态是作为参数传递给mutableStateOf()的值。mutableStateListOf()和mutableStateMapOf()的初始状态为空。- 添加了
Snapshot.isInSnapshot和Snapshot.PreexistingSnapshotId,用于使状态对象在创建后能够立即从全局快照中访问。 - 自定义状态对象可以支持立即访问,只需遵循对内置快照对象所做的更改模式即可。(I84a17)
bug 修复
- 修复了嵌套快照中
readObserver的合并问题。这会导致在snapshotFlow内使用时,嵌套的派生状态失效不足。(Idf138)
版本 1.7.0-alpha06
2024 年 4 月 3 日
发布了 androidx.compose.runtime:runtime-*:1.7.0-alpha06。版本 1.7.0-alpha06 中包含这些提交内容。
bug 修复
版本 1.7.0-alpha05
2024 年 3 月 20 日
发布了 androidx.compose.runtime:runtime-*:1.7.0-alpha05。版本 1.7.0-alpha05 中包含这些提交内容。
bug 修复
- 清除了已停用的组合中的后期更改 (5950bc)
版本 1.7.0-alpha04
2024 年 3 月 6 日
发布了 androidx.compose.runtime:runtime-*:1.7.0-alpha04。版本 1.7.0-alpha04 中包含这些提交内容。
性能改进
- 每次派生状态评估调用
Snapshot.current一次 (ee7daf) - 在组合中,每次观测读取
currentRecord一次 (b882b2) - 移除了
snapshotFlow中的意外迭代器分配 (231e56) - 为 Compose 库启用
nonSkippingGroupOptimization。这使得 androidx 中所有不可重启的可组合函数的生成代码更加高效。我们计划在未来默认启用此功能。I(acbc08)
版本 1.7.0-alpha03
2024 年 2 月 21 日
发布了 androidx.compose.runtime:runtime-*:1.7.0-alpha03。版本 1.7.0-alpha03 中包含这些提交内容。
API 变更
- 引入替换组以改进更改检测 (0941b5)
性能改进
- 改进了检测到更改时的内存分配 (53e7fd)
- 修复了 Composer 中的内存泄漏问题 (0e097d)
- 使用
ScopeMap在重新组合时传递失效信息 (e19a7e) - 优化了失效映射,使其仅保留派生状态 (f11c44)
- 将
IdentityArraySet用法替换为ScatterSet(db572e) - 优化了
ScopeMap中的removeScope(bb0530)
版本 1.7.0-alpha02
2024 年 2 月 7 日
发布了 androidx.compose.runtime:runtime-*:1.7.0-alpha02。版本 1.7.0-alpha02 中包含这些提交内容。
bug 修复
- 使同一帧中子组合中的可组合 lambda 失效。(98301c)
- 以与
onForgotten相同的顺序调用onRelease回调。(2cd790) - 在
snapshotFlow中未观测到的过滤条件更改状态。(796b80)
性能改进
- 当快照观察器已透明时,就地修改它。(f60f30)
- 优化
SnapshotIdSet.lowest()。(7ae149) - 在
SnapshotIdSet中使用无分配fold()。(532b7d) - 移除迭代器分配 (83f96b)
版本 1.7.0-alpha01
2024 年 1 月 24 日
发布了 androidx.compose.runtime:runtime-*:1.7.0-alpha01。版本 1.7.0-alpha01 中包含这些提交内容。
性能优化
bug 修复
版本 1.6
版本 1.6.8
2024 年 6 月 12 日
发布了 androidx.compose.runtime:runtime-*:1.6.8。版本 1.6.8 中包含这些提交内容。
版本 1.6.7
2024 年 5 月 1 日
发布了 androidx.compose.runtime:runtime-*:1.6.7。版本 1.6.7 中包含这些提交内容。
版本 1.6.6
2024 年 4 月 17 日
发布了 androidx.compose.runtime:runtime-*:1.6.6。与上个版本相比没有任何变化。
版本 1.6.5
2024 年 4 月 3 日
发布了 androidx.compose.runtime:runtime-*:1.6.5。版本 1.6.5 中包含这些提交内容。
版本 1.6.4
2024 年 3 月 20 日
发布了 androidx.compose.runtime:runtime-*:1.6.4。版本 1.6.4 中包含这些提交内容。
版本 1.6.3
2024 年 3 月 6 日
发布了 androidx.compose.runtime:runtime-*:1.6.3。版本 1.6.3 中包含这些提交内容。
版本 1.6.2
2024 年 2 月 21 日
发布了 androidx.compose.runtime:runtime-*:1.6.2。版本 1.6.2 中包含这些提交内容。
版本 1.6.1
2024 年 2 月 7 日
发布了 androidx.compose.runtime:runtime-*:1.6.1。版本 1.6.1 中包含这些提交内容。
bug 修复
版本 1.6.0
2024 年 1 月 24 日
发布了 androidx.compose.runtime:runtime-*:1.6.0。版本 1.6.0 中包含这些提交内容。
自 1.5.0 以来的重要变更
新功能
- 重新抛出在重组循环期间被吞噬的异常 (4dff9a)
性能优化
- 优化了对快照状态的记录修改 (28c3fe)
- 优化
rememberSaveable(f01d79) - 推迟重新读取派生状态,直到记录更改为止 (f38099)
- 改进了提供组合本地值的方式 (a337ea)
bug 修复
- 修复了 slot 表内存泄漏问题 (73fcfe)
- 跳过将要移除的子组合的重新组合。(Ieeb99、b/254645321)
- 仅当
RememberObserver存储在 remember 计算中时才触发其生命周期。(f6b4dc) - 将
$dirty捕获限制为内联 lambda。(acfca0) - 修复了可移动内容有时会收到错误的合成本地变量的问题。(035cd6)
版本 1.6.0-rc01
2024 年 1 月 10 日
发布了 androidx.compose.runtime:runtime-*:1.6.0-rc01。版本 1.6.0-rc01 中包含以下提交内容。
版本 1.6.0-beta03
2023 年 12 月 13 日
发布了 androidx.compose.runtime:runtime-*:1.6.0-beta03。版本 1.6.0-beta03 中包含这些提交内容。
版本 1.6.0-beta02
2023 年 11 月 29 日
发布了 androidx.compose.runtime:runtime-*:1.6.0-beta02。版本 1.6.0-beta02 中包含这些提交内容。
版本 1.6.0-beta01
2023 年 11 月 15 日
发布了 androidx.compose.runtime:runtime-*:1.6.0-beta01。版本 1.6.0-beta01 中包含这些提交内容。
API 变更
- 在注释中传播某些稳定性值。(274a4c)
bug 修复
- 在上下文中,为组合本地范围状态使用引用政策。(83361c)
- 将 $dirty 捕获限制为内嵌 lambda。(acfca0)
- 修复了可移动内容有时会收到错误的合成本地变量的问题。(035cd6)
- 在
RecomposeScopeImpl中使用更快的非分配哈希映射。(d79494) - 在
DerivedState中使用ObjectIntMap。(21862e) - 在
DerivedState中,针对 intSnapshotThreadLocal使用IntRef。(04eaf4)
版本 1.6.0-alpha08
2023 年 10 月 18 日
发布了 androidx.compose.runtime:runtime-*:1.6.0-alpha08。版本 1.6.0-alpha08 中包含这些提交内容。
bug 修复
- 仅当
RememberObserver存储在 remember 计算中时才触发其生命周期。(f6b4dc) - 改进了失效列表排序中的分配。(954d63)
- 在
SnapshotStateObserver中使用新的非分配内存的映射。(4303ce) - 在组合停用时清除失效。(e001be)
版本 1.6.0-alpha07
2023 年 10 月 4 日
发布了 androidx.compose.runtime:runtime-*:1.6.0-alpha07。版本 1.6.0-alpha07 中包含这些提交内容。
API 变更
SnapshotStateList现在标记为RandomAccess,以启用列表辅助函数的直接索引版本。(I5210c、b/219554654)
版本 1.6.0-alpha06
2023 年 9 月 20 日
发布了 androidx.compose.runtime:runtime-*:1.6.0-alpha06。版本 1.6.0-alpha06 中包含这些提交内容。
版本 1.6.0-alpha05
2023 年 9 月 6 日
发布了 androidx.compose.runtime:runtime-*:1.6.0-alpha05。版本 1.6.0-alpha05 中包含这些提交内容。
版本 1.6.0-alpha04
2023 年 8 月 23 日
发布了 androidx.compose.runtime:runtime-*:1.6.0-alpha04。版本 1.6.0-alpha04 中包含这些提交内容。
新功能
- 重新抛出在重组循环期间被吞噬的异常 (4dff9a)
API 变更
- 添加了用于停用
ReusableComposition的方法,该方法会移除观测对象,但会保留节点。可通过调用setContent再次激活已停用的组合。(Ib7f31) - 添加了
ReusableComposition接口,用于管理子组合的生命周期和重复使用。(I812d1、b/252846775)
版本 1.6.0-alpha03
2023 年 8 月 9 日
发布了 androidx.compose.runtime:runtime-*:1.6.0-alpha03。版本 1.6.0-alpha03 中包含这些提交内容。
bug 修复
版本 1.6.0-alpha02
2023 年 7 月 26 日
发布了 androidx.compose.runtime:runtime-*:1.6.0-alpha02。版本 1.6.0-alpha02 中包含这些提交内容。
新功能和效果提升
- 优化
rememberSaveable(f01d79) - 推迟重新读取派生状态,直到记录更改为止 (f38099)
- 改进了提供组合本地值的方式 (a337ea)
SideEffect已标记为@ExplicitGroupsComposable,以避免生成群组。(I74815)- 避免在重用时比较本地组合映射 (782071)
API 变更
- 为
CompositionLocalProviders添加了一个特殊情况的重载,可避免用于更快地提供多个值的开销,但在提供单个值时会产生开销。(I6d640、b/288169379)
bug 修复
版本 1.6.0-alpha01
2023 年 6 月 21 日
发布了 androidx.compose.runtime:runtime-*:1.6.0-alpha01。版本 1.6.0-alpha01 中包含这些提交内容。
bug 修复
- 跳过将要移除的子组合的重新组合。(Ieeb99、b/254645321)
- 减少了应用快照时的分配。(I65c09)
- 如果未修改快照,则避免在
DerivedState中计算readableHash(68c565)
版本 1.5
版本 1.5.4
2023 年 10 月 18 日
发布了 androidx.compose.runtime:runtime-*:1.5.4。版本 1.5.4 中包含这些提交内容。
版本 1.5.3
2023 年 10 月 4 日
发布了 androidx.compose.runtime:runtime-*:1.5.3。版本 1.5.3 中包含这些提交内容。
版本 1.5.2
2023 年 9 月 27 日
发布了 androidx.compose.runtime:runtime-*:1.5.2。版本 1.5.2 中包含这些提交内容。
版本 1.5.1
2023 年 9 月 6 日
发布了 androidx.compose.runtime:runtime-*:1.5.1。版本 1.5.1 中包含这些提交内容。
版本 1.5.0
2023 年 8 月 9 日
发布了 androidx.compose.runtime:runtime-*:1.5.0。版本 1.5.0 中包含这些提交内容。
API 变更
- 移除了重组、颜色动画和
AndroidComposeView中的分配。(Ib2bfa) - 添加了
@StateFactoryMarker注解,用于标记创建状态且必须封装在remember调用中的函数。(I64550) - 添加了 State 和
MutableState的原初版本 (fb3d89) - 添加了
Snapshot.isApplyObserverNotificationPending(I672a5) - 添加了
StateAPI 的原始版本,允许在State对象中跟踪 Int、Long、Float 和 Double 值,而不会因自动装箱而受到性能损失。使用新的工厂方法mutableIntState(Int)、mutableFloatStateOf(Float)等才能使用这些方法。(I48e43)
bug 修复
- 跳过将要移除的子组合的重新组合。(Ieeb99、b/254645321)
- 不在
ComposerImpl中保留快照引用 (0206f7) - 不应用两次组合 (f5791b)
- 确保非初始化的派生状态值的失效 (aa2a92)
- 在组合处置期间调用
onEndChanges。(62cc8c) - 修复了将内容移入子组合的问题 (4beb41)
- 修复了潜在的死锁问题(c1a425 和 8edce0)
- 现在,为 Android 窗口创建的重组器在收到 ON_STOP 通知时,只会阻止对
withFrameNanos的调用,而不会阻止所有组合。这意味着,与已停止的 activity 关联的窗口将继续因数据更改而重新组合,但动画或withFrameNanos的任何其他调用方都会被阻塞。(Id9e7f、b/240975572) - 在处置效应之前,先为
LayoutNode执行停用回调 3784073 - 修复了重新启动的 lambda 的已更改标志 ea81df9
- 修复了具有节点的可组合项的实时编辑回归问题 73fd4d8
- ON_STOP 应暂停帧时钟广播,而不是组合 ae276f1
- 针对未更改的派生状态使
SnapshotStateObserver范围失效 84d9b1c - 修复了处理组合时可能出现的死锁问题 28761fc
- 修复了将内容移至子组合的问题 92d4156
- 修复了重新启动的 lambda 的已更改标志 (8a03e9)
- 在处置效应之前,针对
LayoutNode执行停用回调 (8b0fa4) - 修复了结束节点组时出现的
endToMarker()。(d71d980) - 使用当前
SlotWriter群组在停用时进行检查 (a0b518b) - 移除了
SlotTable.moveSlotGapTo()中的fill并将其移至关闭状态 (81f9935) - 修复了可移动内容移动时缺少失效的问题 (1d7c024)
- 修复了移动可移动内容后立即失效的问题 (8676618)
性能改进
- 如果未修改快照,则避免在
DerivedState中计算readableHash。(307102) - 减少了分配 (I65c09、d7ea77、727974 和 445808)
- 快速取消 Compose
CoroutineScopes(a55362 和 bd382f) - 使用无法访问的状态记录覆盖状态对象的记录 (c986960)
- 在实现群组时使用正确范围的 composer (9a5e5b6)
- 使用
IdentityArraySet存储快照失效信息 (7f60cca) - 减少了快照观测的分配 (5bc535f)
版本 1.5.0-rc01
2023 年 7 月 26 日
发布了 androidx.compose.runtime:runtime-*:1.5.0-rc01。版本 1.5.0-rc01 中包含这些提交内容。
bug 修复
推迟重新读取派生状态,直到记录更改为止 (f38099)
系统提供可选检查,以建议将
mutableStateOf()调用迁移到其对应的原始类型专用类型。其 lint ID 为AutoboxingStateCreation。之前,此检查默认针对所有项目启用。如需在 Android Studio 的编辑器和项目的 lint 输出中看到此警告,请在模块的 build.gradle 或 build.gradle.kts 配置中声明warning "AutoboxingStateCreation",将此警告的严重程度从信息性更改为警告(或更高级别),如 I34f7e 中所示:android { lint { warning "AutoboxingStateCreation" } ... }
版本 1.5.0-beta03
2023 年 6 月 28 日
发布了 androidx.compose.runtime:runtime-*:1.5.0-beta03。版本 1.5.0-beta03 中包含这些提交内容。
bug 修复
- 跳过将要移除的子组合的重新组合。(Ieeb99、b/254645321)
版本 1.5.0-beta02
2023 年 6 月 7 日
发布了 androidx.compose.runtime:runtime-*:1.5.0-beta02。版本 1.5.0-beta02 中包含这些提交内容。
性能改进
- 如果未修改快照,则避免在
DerivedState中计算readableHash。(307102)
版本 1.5.0-beta01
2023 年 5 月 24 日
发布了 androidx.compose.runtime:runtime-*:1.5.0-beta01。版本 1.5.0-beta01 中包含这些提交内容。
API 变更
- 移除了重组、颜色动画和
AndroidComposeView中的分配 (Ib2bfa) - 添加了
@StateFactoryMarker注解,用于标记创建状态且必须封装在remember调用中的函数。(I64550) - 添加了 State 和
MutableState的原初版本 (fb3d89) - 添加了
Snapshot.isApplyObserverNotificationPending(I672a5)
bug 修复
- 减少了分配 (I65c09、d7ea77、727974 和 445808)
- 不在
ComposerImpl中保留快照引用 (0206f7) - 快速取消 Compose
CoroutineScopes(a55362 和 bd382f) - 不应用两次组合 (f5791b)
- 确保非初始化的派生状态值的失效 (aa2a92)
- 在组合处置期间调用
onEndChanges。(62cc8c) - 修复了将内容移入子组合的问题 (4beb41)
- 修复了潜在的死锁问题 (c1a425
- ON_STOP 应暂停帧时钟广播,而不是合成 (f4a2d1)
- 修复了重新启动的 lambda 的已更改标志 (8a03e9)
- 在处置效应之前,针对
LayoutNode执行停用回调 (8b0fa4)
外部贡献
- 添加了
Snapshot.isApplyObserverNotificationPending(I672a5)
版本 1.5.0-alpha04
2023 年 5 月 10 日
发布了 androidx.compose.runtime:runtime-*:1.5.0-alpha04。版本 1.5.0-alpha04 中包含这些提交内容。
API 变更
- 添加了
StateAPI 的原始版本,允许在State对象中跟踪 Int、Long、Float 和 Double 值,而不会因自动装箱而受到性能损失。使用新的工厂方法mutableIntState(Int)、mutableFloatStateOf(Float)等才能使用这些方法。(I48e43)
bug 修复
在组合处置期间调用
onEndChanges。在Composition.dispose期间移除的焦点节点正在订阅onEndChanges以重置焦点。(03d4a47)确保使未初始化的派生状态值失效。每个派生状态都与
SnapshotStateObserver中的依赖项列表相关联,用于在依赖项发生更改时使与派生状态关联的作用域失效。依赖项更改是在快照推进时注册的,这可能会在派生状态读取(由于对Snapshot.notifyObjectsInitialized()的调用)之后发生。SnapshotStateObserver中之前的派生状态观测逻辑会清理旧依赖项,然后读取新值。这导致了竞态条件,其中失效发生在清理状态,而依赖项失效未注册。此更改会重新排序派生状态读取和依赖项清理,确保失效始终发生在有效状态下。(c472be6)
版本 1.5.0-alpha03
2023 年 4 月 19 日
发布了 androidx.compose.runtime:runtime-*:1.5.0-alpha03。版本 1.5.0-alpha03 中包含这些提交内容。
API 变更
- 现在,为 Android 窗口创建的重组器在收到 ON_STOP 通知时,只会阻止对
withFrameNanos的调用,而不会阻止所有组合。这意味着,与已停止的 activity 关联的窗口将继续因数据更改而重新组合,但动画或withFrameNanos的任何其他调用方都会被阻塞。(Id9e7f、b/240975572)
bug 修复
- 修复了快照列表和映射中的潜在死锁问题 5c1a425
- 在处置效应之前,先为
LayoutNode执行停用回调 3784073 - 修复了重新启动的 lambda 的已更改标志 ea81df9
- 修复了具有节点的可组合项的实时编辑回归问题 73fd4d8
- ON_STOP 应暂停帧时钟广播,而不是组合 ae276f1
- 针对未更改的派生状态使
SnapshotStateObserver范围失效 84d9b1c - 修复了处理组合时可能出现的死锁问题 28761fc
- 修复了将内容移至子组合的问题 92d4156
版本 1.5.0-alpha02
2023 年 4 月 5 日
发布了 androidx.compose.runtime:runtime-*:1.5.0-alpha02。版本 1.5.0-alpha02 中包含这些提交内容。
新功能
- Kotlin 的
getValue运算符现在可以组合了 (f174f6e)
问题修复、性能提升
- 使用无法访问的状态记录覆盖状态对象的记录 (c986960)
- 在实现群组时使用正确范围的 composer (9a5e5b6)
- 修复了结束节点组时出现的
endToMarker()。(d71d980) - 使用当前
SlotWriter群组在停用时进行检查 (a0b518b) - 使用
IdentityArraySet存储快照失效信息 (7f60cca) - 移除了
SlotTable.moveSlotGapTo()中的fill并将其移至关闭状态 (81f9935) - 修复了可移动内容移动时缺少失效的问题 (1d7c024)
- 修复了移动可移动内容后立即失效的问题 (8676618)
- 减少了快照观测的分配 (5bc535f)
版本 1.5.0-alpha01
2023 年 3 月 22 日
发布了 androidx.compose.runtime:runtime-*:1.5.0-alpha01。版本 1.5.0-alpha01 中包含这些提交内容。
新功能
- 添加了
Modifier.Node#coroutineScope,以允许Modifier.Nodes启动协程 (I76ef9) - 通过实现
CompositionLocalConsumerModifierNode接口,允许Modifier.Nodes读取CompositionLocals。(Ib44df)
版本 1.4
版本 1.4.3
2023 年 5 月 3 日
发布了 androidx.compose.runtime:runtime-*:1.4.3,该版本没有任何变化。
版本 1.4.2
2023 年 4 月 19 日
发布了 androidx.compose.runtime:runtime-*:1.4.2。版本 1.4.2 中包含这些提交内容。
bug 修复
修复了快照列表和地图中的潜在死锁问题 2eb6570
如果向
SnapshotStateList或SnapshotStateMap添加内容的操作与对状态记录的直接写入操作同时进行,可能会遇到死锁。由于 93fcae828b 引入了直接写入来释放未使用的记录,因此遇到此问题的可能性大大增加。现在,锁的顺序是,在持有映射或列表锁时,绝不会尝试获取快照锁。
版本 1.4.1
2023 年 4 月 5 日
发布了 androidx.compose.runtime:runtime-*:1.4.1。版本 1.4.1 中包含这些提交内容。
bug 修复
- 修复了结束节点组时的
endToMarker()。d71d980
版本 1.4.0
2023 年 3 月 22 日
发布了 androidx.compose.runtime:runtime-*:1.4.0。版本 1.4.0 中包含这些提交内容。
自 1.3.0 以来的重要变更
- 使用
LiveData中的初始值进行首次组合 3680e25 - 添加了
ComposeNodeLifecycleCallback以观察 Compose 节点的生命周期。8b6a258 - 向
ComposableMethod添加了parameterTypes属性 7b6c7ad
修复了多个问题,并提升了性能
- 清除
SnapshotStateObserver29f4a3e 中的两个范围索引 - 在不可跳过的 lambda 的正文中添加所需的组 7d06752
- 改进了快照状态的内存引用特性 93fcae8
- 移除组合本地查询中的方框 0875717
- 为不可重用的节点组使用正确的密钥 6388d8d
- 防止
SnapshotStateObserver被递归和并发应用 98cb6ba - 在
IdentityArraySet“get”方法中添加了检查索引边界的检查 35a77d3 - 更新了 Compose 模块,以使用
ViewTreeLifecycleOwner扩展程序 21c2122 - 在 Recomposer 完成帧后发送应用通知。98f2641
- 修复了取消 Recomposer 时出现的索引超出范围崩溃问题 8f8656f
- 如果组合的父提供程序已更改,则始终强制重组 9526fcc
- 针对已取消作业的 Recomposer 容忍度 a55f7ed
- 改进了对大量 Composer 的失效处理 9b7ed67
- 修复了为非本地返回生成关闭组的问题 b6f590c
版本 1.4.0-rc01
2023 年 3 月 8 日
发布了 androidx.compose.runtime:runtime-*:1.4.0-rc01。版本 1.4.0-rc01 中包含这些提交内容。
bug 修复
版本 1.4.0-beta02
2023 年 2 月 22 日
发布了 androidx.compose.runtime:runtime:1.4.0-beta02 和 androidx.compose.runtime:runtime-saveable:1.4.0-beta02。版本 1.4.0-beta02 中包含这些提交内容。
版本 1.4.0-beta01
2023 年 2 月 8 日
发布了 androidx.compose.runtime:runtime-*:1.4.0-beta01。版本 1.4.0-beta01 中包含这些提交内容。
API 变更
- 添加了
ComposeNodeLifecycleCallback,以便观察 Compose 节点的生命周期 (I3731b) - 向
Composer.disableSourceInformation()添加了@TestOnly,因为此函数只能在测试中安全调用。(I896c8)
bug 修复
版本 1.4.0-alpha05
2023 年 1 月 25 日
发布了 androidx.compose.runtime:runtime:1.4.0-alpha05 和 androidx.compose.runtime:runtime-saveable:1.4.0-alpha05。版本 1.4.0-alpha05 中包含这些提交内容。
API 变更
- 内嵌/已废弃的隐藏函数的更多类型/可为 null 性 (I24f91)
版本 1.4.0-alpha04
2023 年 1 月 11 日
发布了 androidx.compose.runtime:runtime-*:1.4.0-alpha04。版本 1.4.0-alpha04 中包含这些提交内容。
API 变更
TestMonotonicFrameClock现在使用正确的实验性注解。(I95c9e)
bug 修复
- 防止
SnapshotStateObserver被递归和并发应用 (d902fb)
版本 1.4.0-alpha03
2022 年 12 月 7 日
发布了 androidx.compose.runtime:runtime-*:1.4.0-alpha03。版本 1.4.0-alpha03 中包含这些提交内容。
API 变更
- 向
ComposableMethod类添加了类似于java.lang.reflect.Method#getParameterTypes()的新公共方法 (Iab0c3)
bug 修复
- 现在,系统会在
Recomposer应用更改完成后发送快照应用通知。(Iad6c0、b/222093277)
版本 1.4.0-alpha02
2022 年 11 月 9 日
发布了 androidx.compose.runtime:runtime-*:1.4.0-alpha02。版本 1.4.0-alpha02 中包含这些提交内容。
版本 1.4.0-alpha01
2022 年 10 月 24 日
发布了 androidx.compose.runtime:runtime-*:1.4.0-alpha01。版本 1.4.0-alpha01 中包含这些提交内容。
API 变更
SnapshotStateList和SnapshotStateMap现已充分显式实现toList()和toMap()。这些方法在返回用于存储其内容的内部不可变数据时,会返回其当前内容,而不执行复制。例如,此值可用于使用snapshotFlow生成值流,而无需复制数据。(Ica2bd)
版本 1.3
版本 1.3.3
2023 年 1 月 11 日
发布了 androidx.compose.runtime:runtime-*:1.3.3。版本 1.3.3 中包含这些提交内容。
- 自 1.3.2 以来没有任何变化。
版本 1.3.2
2022 年 12 月 7 日
发布了 androidx.compose.runtime:runtime-*:1.3.2。版本 1.3.2 中包含这些提交内容。
bug 修复
- 进行了更新,以支持 androidx.compose.ui 1.3.2
版本 1.3.1
2022 年 11 月 9 日
发布了 androidx.compose.runtime:runtime-*:1.3.1。版本 1.3.1 中包含这些提交内容。
版本 1.3.0
2022 年 10 月 24 日
发布了 androidx.compose.runtime:runtime-*:1.3.0。版本 1.3.0 中包含这些提交内容。
自 1.2.0 以来的重要变更
对异常处理/实时编辑的支持
- 为了更好地支持实时编辑,我们添加了一些 API,以便在组合过程中处理异常
- 针对热重载的组合错误处理
- 在保存/恢复时处理实时编辑错误
组合跟踪
- 添加了运行时跟踪 API,用于支持新的组合跟踪工具
- 生成可组合的跟踪事件开始/结束调用
- 重新添加了 ComposerKt.traceEventStart(Int, String)
可组合反射 API
- 添加了新的
ComposableMethodAPI,用于实现更可靠的基于反射的可组合 API 调用。 - 将 invokeComposable 移至 Compose Runtime
- 重新设计用于调用可组合方法的 API
运行时修复
快照系统
- 快照系统在内存管理、性能和正确性方面进行了很多项改进。
- 在 SnapshotStateObserver 中优化作用域移除
- 处理使用透明快照创建的嵌套快照
- 修复了从全局快照读取状态时的竞态条件问题
- 在 SnapshotStateObserver 中支持 DerivedState
- 防止在从其他作用域中读取派生状态时将其从组合中移除
- 在 DerivedState 中使用 IdentityArrayMap 代替 HashMap
- 更新派生状态观察者以使用可变矢量
- 更新 SnapshotStateObserver 状态清理
- 将 SnapshotStateObserver.invalidated 替换为 ArraySet
- 修复了从全局快照读取状态时的竞态条件问题
- 修复了在 DerivedState 哈希计算中使用过时记录的问题
- 修复了推进全局快照时的竞态条件问题
- 在 SnapshotStateObserver 中加快作用域观察清理的速度
版本 1.3.0-rc01
2022 年 10 月 5 日
发布了 androidx.compose.runtime:runtime-*:1.3.0-rc01。版本 1.3.0-rc01 中包含这些提交内容。
bug 修复
- 修复了来自槽表的
ArrayIndexOutOfBoundsException(b/249076084)
版本 1.3.0-beta03
2022 年 9 月 21 日
发布了 androidx.compose.runtime:runtime-*:1.3.0-beta03。版本 1.3.0-beta03 中包含这些提交内容。
行为破坏性变更
remember和rememberCoroutineScope的参数已更改为crossinline。这会针对提前返回报告错误,而不是允许提前返回,后者会导致系统稍后报告内部错误。- 这项变更可能会导致系统报告新的编译器错误,要求从传递给这些函数的 lambda 中移除非局部返回值。(Ibea62)
版本 1.3.0-beta02
2022 年 9 月 7 日
发布了 androidx.compose.runtime:runtime-*:1.3.0-beta02。版本 1.3.0-beta02 中包含这些提交内容。
bug 修复
- 更新了 API (I64ca0)
版本 1.3.0-beta01
2022 年 8 月 24 日
发布了 androidx.compose.runtime:runtime-*:1.3.0-beta01。版本 1.3.0-beta01 中包含这些提交内容。
API 变更
- 向
CompositionData添加了find方法,以允许使用此 API 的开发者工具通过其身份快速找到组合的子组。(I5794f)
版本 1.3.0-alpha03
2022 年 8 月 10 日
发布了 androidx.compose.runtime:runtime-*:1.3.0-alpha03。版本 1.3.0-alpha03 中包含这些提交内容。
版本 1.3.0-alpha02
2022 年 7 月 27 日
发布了 androidx.compose.runtime:runtime-*:1.3.0-alpha02。版本 1.3.0-alpha02 中包含这些提交内容。
API 变更
- 重新添加了
ComposerKt.traceEventStart(Int, String),以实现向后兼容性 (I6e6de)
版本 1.3.0-alpha01
2022 年 6 月 29 日
发布了 androidx.compose.runtime:runtime-*:1.3.0-alpha01。版本 1.3.0-alpha01 中包含这些提交内容。
API 变更
- 将实用函数移至运行时 (I4f729)
版本 1.2
版本 1.2.1
2022 年 8 月 10 日
发布了 androidx.compose.runtime:runtime-*:1.2.1。版本 1.2.1 中包含这些提交内容。
bug 修复
- 修复了内存泄漏的问题:处置通过透明快照创建的嵌套快照(b/239603305)
版本 1.2.0
2022 年 7 月 27 日
发布了 androidx.compose.runtime:runtime-*:1.2.0。版本 1.2.0 中包含这些提交内容。
自 1.1.0 以来的重要变更
Compose Runtime 包含 1.2.0 中引入的一些功能,以及诸多用于进行稳定处理的 bug 修复。其中最重要的一项新功能是引入了
movableContentOfAPI,该 API 可用于实现复杂的用户体验,例如共享元素过渡。movableContentOfAPI 用于将可组合 lambda 转换为另一种 lambda,后者会将其状态以及相应的节点移至其被调用的任何新位置。当上一个调用退出组合时,相应状态会暂时保留,如果对 lambda 的新调用进入组合,状态和关联的节点会移至新调用的位置。如果没有新调用加入,系统会永久移除相应状态;请注意,观察器会收到通知。如果在同一个组合中多次调用
movableContentOflambda,系统会为每个调用创建新的状态和节点,随着调用退出组合和新调用进入组合,系统会按调用顺序将相应状态从第一个退出的调用移至后续进入的调用。新调用未声明的所有状态都会永久移除。除了这项功能和一些其他新功能之外,我们还花费了大量时间来让运行时和快照状态系统保持稳定。移除了各种内存泄漏并优化了代码路径。
下面总结了这些更改:
1.2 的新功能
- 添加了实验性快照 unsafeEnter/Leave
- 添加了 Snapshot.asContextElement 实验性 API
- 引入了 Snapshot.withoutReadObservation
- 允许状态在组合内移动
- 在 Compose 中跟踪重组
1.2 的性能
1.2 中的 bug 修复
- 从版本重组作用域中移除了跟踪信息
- 防止在从其他作用域中读取派生状态时将其从组合中移除
- 在 SnapshotStateObserver 中使用更高效的 removeScope()
- 清理了组合中的派生状态依赖项
- 修复了在可移动内容内进行内部重组后 currentCompositeKeyHash 发生变化的问题
- 在处理过程中清理无效的组合
- 修复了在重组过程中读取的派生状态问题
- 修复了观察派生状态对象时的内存泄漏问题
- 修复了 movableContent 复合哈希键,使其保持一致
- 修复了极端情况下合成器会崩溃的问题
- 确保使某个组强制失效会强制执行重组
- 修复了以错误顺序恢复带有输入的 rememberSaveable 时的 bug
版本 1.2.0-rc03
2022 年 6 月 29 日
发布了 androidx.compose.runtime:runtime-*:1.2.0-rc03。版本 1.2.0-rc03 中包含这些提交内容。
bug 修复
- 派生的状态观察之前已被无条件地从重组作用域和组合中移除,这会破坏可能仍在观察派生状态的其他作用域。只有其他作用域不再观察派生状态实例时,此更改才会移除此类实例。(b/236618362)
版本 1.2.0-rc02
2022 年 6 月 22 日
发布了 androidx.compose.runtime:runtime-*:1.2.0-rc02。版本 1.2.0-rc02 中包含这些提交内容。
版本 1.2.0-rc01
2022 年 6 月 15 日
发布了 androidx.compose.runtime:runtime-*:1.2.0-rc01。版本 1.2.0-rc01 中包含这些提交内容。
API 变更
- Compose 库中的接口现在使用 jdk8 默认接口方法构建 (I5bcf1)
版本 1.2.0-beta03
2022 年 6 月 1 日
发布了 androidx.compose.runtime:runtime-*:1.2.0-beta03。版本 1.2.0-beta03 中包含这些提交内容。
版本 1.2.0-beta02
2022 年 5 月 18 日
发布了 androidx.compose.runtime:runtime-*:1.2.0-beta02。版本 1.2.0-beta02 中包含这些提交内容。
版本 1.2.0-beta01
2022 年 5 月 11 日
发布了 androidx.compose.runtime:runtime-*:1.2.0-beta01。版本 1.2.0-beta01 中包含这些提交内容。
新功能
- 这是 1.2 的第一个 Beta 版!
API 变更
- 添加了实验性
Snapshot.unsafeEnter/unsafeLeave(I108f3) - 添加了实验性
Snapshot.asContextElement()API (Iff072) - 现在可以使用
@file前缀在文件范围内使用@ComposableTarget注解和标有@ComposableTargetMarker的注解。在文件范围内使用目标注解将使编译器假定文件中的所有可组合函数都要以关联的 Applier 为目标。例如,使用@file:UiComposable即会声明所有@Composable函数均以 Compose 界面 Applier 为目标。如果某个函数需要以其他 Applier 为目标,则必须为所需 Applier 明确提供目标标记注解。(I40804)
版本 1.2.0-alpha08
2022 年 4 月 20 日
发布了 androidx.compose.runtime:runtime-*:1.2.0-alpha08。版本 1.2.0-alpha08 中包含这些提交内容。
API 变更
- 向
CompositionTracer接口添加了TracingInProgress。(Ic6f12) - 向 Composer 添加了
recomposeScopeIdentity(I0c873) - 限制了对
OptIn(InternalComposeTracingApi)的跟踪 API (Composer.setTracer)。(I9187f) - 添加了
ResuableContentHost,对于为可重用内容创建的状态的生命周期,可以进行更好的控制。例如,如果子组合暂时未使用,则内容可能会被停用,从而导致组合中的所有记住的状态都被忘记触发,例如所有可处理效应。(I2c0f2、b/220322704)
版本 1.2.0-alpha07
2022 年 4 月 6 日
发布了 androidx.compose.runtime:runtime-*:1.2.0-alpha07。版本 1.2.0-alpha07 中包含这些提交内容。
API 变更
- 添加了新函数
Snapshot.withoutReadObservation { ... }。用户可以通过该函数运行所传递的 lambda,而无需订阅在此块中读取的状态值的更改。如果您既想从基于快照的线程安全写入/读取中受益,又希望能够在不造成非必要重组或重新测量的情况下读取值,这会对您很有帮助。(I9f365、b/214054486)
版本 1.2.0-alpha06
2022 年 3 月 23 日
发布了 androidx.compose.runtime:runtime-*:1.2.0-alpha06。版本 1.2.0-alpha06 中包含这些提交内容。
版本 1.2.0-alpha05
2022 年 3 月 9 日
发布了 androidx.compose.runtime:runtime-*:1.2.0-alpha05。版本 1.2.0-alpha05 中包含这些提交内容。
外部贡献
- 已更新为使用 Kotlinx 协程 1.6.0 (I3366d)
版本 1.2.0-alpha04
2022 年 2 月 23 日
发布了 androidx.compose.runtime:runtime-*:1.2.0-alpha04。版本 1.2.0-alpha04 中包含这些提交内容。
API 变更
添加了
ComposableTarget、ComposableTargetMarker和ComposableOpenTarget,以便系统在编译时报告何时以预期使用范围外的 Applier 为目标而调用了某个可组合函数。在大多数情况下,注解可以由 Compose 编译器插件推断出来,因此直接使用这些注解的情况应该很少。无法推断的情况包括创建和使用自定义 applier、抽象可组合函数(例如接口方法)、可组合 lambda 性质的字段或全局变量(推断出局部变量和参数),或者使用
ComposeNode或相关可组合函数的情况。对于自定义 Applier,调用
ComposeNode或ReusableComposeNode的可组合函数需要为该函数和任何可组合 lambda 的参数类型添加CompoableTarget注解。不过,建议您创建一个带有ComposableTargetMarker的注解,然后使用带标记的注解,而不是直接使用ComposableTarget。标有ComposableTargetMarker的可组合注解等同于用属性类的完全限定名称作为 applier 参数的ComposbleTarget。如需查看ComposableTargetMarker使用示例,请参阅anroidx.compose.ui.UiComposable。(I38f11)
版本 1.2.0-alpha03
2022 年 2 月 9 日
发布了 androidx.compose.runtime:runtime-*:1.2.0-alpha03。版本 1.2.0-alpha03 中包含这些提交内容。
API 变更
添加了
movableContentOf,用于将可组合的 lambda 转换另一种 lambda,它会将其状态及相应节点移至其被调用的任何新位置。当上一个调用退出组合时,相应状态会暂时保留,如果对 lambda 的新调用进入组合,状态和关联的节点会移至新调用的位置。如果没有新调用加入,系统会永久移除相应状态;请注意,观察器会收到通知。如果在同一个组合中多次调用
movableContentOflambda,系统会为每个调用创建新的状态和节点,随着调用退出组合和新调用进入组合,系统会按调用顺序将相应状态从第一个退出的调用移至后续进入的调用。新调用未声明的所有状态都会永久移除。(Ib4850)为组合添加了跟踪 API,以便工具能够提供更详细的可组合函数跟踪记录。现在,编译器会生成对包含来源信息的跟踪 API 的调用。(Ib0eb5)
如需从发布 build 中移除这些调用以及关联的来源信息,请添加以下 Proguard 规则:
-assumenosideeffects public class androidx.compose.runtime.ComposerKt { boolean isTraceInProgress(); void traceEventStart(int,java.lang.String); void traceEventEnd(); }添加了
InternalComposeScope,以便工具能够在重组期间识别可组合项。(I07a3f)
版本 1.2.0-alpha02
2022 年 1 月 26 日
发布了 androidx.compose.runtime:runtime-*:1.2.0-alpha02。版本 1.2.0-alpha02 中包含这些提交内容。
版本 1.2.0-alpha01
2022 年 1 月 12 日
发布了 androidx.compose.runtime:runtime-*:1.2.0-alpha01。版本 1.2.0-alpha01 中包含这些提交内容。
API 变更
- 在
CompositionData中添加了identity字段,用于在布局检查器中生成不可变的 ID。(Ic116e)
依赖项更新
- 现在依赖于 Kotlin
1.6.10。
版本 1.1
版本 1.1.1
2022 年 2 月 23 日
发布了 androidx.compose.runtime:runtime-*:1.1.1。版本 1.1.1 中包含这些提交内容。
bug 修复
- 修复了
androidx.compose.ui.platform.RenderNodeLayer.updateDisplayList中的NullPointerException(aosp/1947059、b/206677462) - 修复了在 Android 上从剪贴板读取内容时剪贴板内容导致的崩溃问题。(I06020、b/197769306)
- 修复了
LazyVerticalGrid中的 RTL(aosp/1931080、b/207510535)
版本 1.1.0
2022 年 2 月 9 日
发布了 androidx.compose.runtime:runtime-*:1.1.0。版本 1.1.0 中包含这些提交内容。
自 1.0.0 以来的重要变更
- 对 Android 12 滚动效果提供稳定支持
- 改进了触摸目标大小调整
- 请注意,对于 Compose 1.0,Material 组件将扩展其布局空间,以符合 Material 无障碍功能指南对触摸目标尺寸的要求。例如,按钮触摸目标将扩展为至少
48x48dp的尺寸,即使您将按钮尺寸设为更小也不影响。这会使 Compose Material 与 Material Design 组件的行为保持一致,以便在混合使用 View 和 Compose 时提供一致的行为。此变更还可确保在您使用 Compose Material 组件创建界面时,能够满足触摸目标无障碍功能的最低要求。 - 对导航栏提供稳定支持
- 将之前的一些实验性 API 升级到了稳定版
- 支持更高版本的 Kotlin
版本 1.1.0-rc03
2022 年 1 月 26 日
发布了 androidx.compose.runtime:runtime-*:1.1.0-rc03。版本 1.1.0-rc03 中包含这些提交内容。
bug 修复
- 已更新为支持 Compose Material
1.1.0-rc03
版本 1.1.0-rc01
2021 年 12 月 15 日
发布了 androidx.compose.runtime:runtime-*:1.1.0-rc01。版本 1.1.0-rc01 中包含这些提交内容。
版本 1.1.0-beta04
2021 年 12 月 1 日
发布了 androidx.compose.runtime:runtime-*:1.1.0-beta04。版本 1.1.0-beta04 中包含这些提交内容。
新功能
- 完成更新,现与 Kotlin
1.6.0兼容
版本 1.1.0-beta03
2021 年 11 月 17 日
发布了 androidx.compose.runtime:runtime-*:1.1.0-beta03。版本 1.1.0-beta03 中包含这些提交内容。
版本 1.1.0-beta02
2021 年 11 月 3 日
发布了 androidx.compose.runtime:runtime-*:1.1.0-beta02。版本 1.1.0-beta02 中包含这些提交内容。
API 变更
- 快照代码会被拆分到多个文件中,但所有文件仍在同一个 JVM 类中。(Ic6c98)
版本 1.1.0-beta01
2021 年 10 月 27 日
发布了 androidx.compose.runtime:runtime-*:1.1.0-beta01。版本 1.1.0-beta01 中包含这些提交内容。
版本 1.1.0-alpha06
2021 年 10 月 13 日
发布了 androidx.compose.runtime:runtime-*:1.1.0-alpha06。版本 1.1.0-alpha06 中包含这些提交内容。
API 变更
- 从需要跨模块调用的 Composer 方法中移除了
InternalCompilerApi(I1aa0b) - 废弃了
Recomposer.state,取而代之的是Recomposer.currentState,以将其类型更改为 StateFlow(Ic2ab3、b/197773820)
版本 1.1.0-alpha05
2021 年 9 月 29 日
发布了 androidx.compose.runtime:runtime-*:1.1.0-alpha05。版本 1.1.0-alpha05 中包含这些提交内容。
版本 1.1.0-alpha04
2021 年 9 月 15 日
发布了 androidx.compose.runtime:runtime-*:1.1.0-alpha04。版本 1.1.0-alpha04 中包含这些提交内容。
版本 1.1.0-alpha03
2021 年 9 月 1 日
发布了 androidx.compose.runtime:runtime-*:1.1.0-alpha03。版本 1.1.0-alpha03 中包含这些提交内容。
新功能
- Compose Compiler 现在支持较低版本的 Compose Runtime (1.0)。在此变更之前,Compose Compiler 仅与相同版本或更高版本的 Compose Runtime 兼容。此变更生效后,Compose Compiler 可与较低版本的 Compose Runtime (1.0) 兼容。(aosp/1796968)
- 更新了 Compose
1.1.0-alpha03,使其依赖于 Kotlin1.5.30。(I74545)
版本 1.1.0-alpha02
2021 年 8 月 18 日
发布了 androidx.compose.runtime:runtime-*:1.1.0-alpha02。版本 1.1.0-alpha02 中包含这些提交内容。
版本 1.1.0-alpha01
2021 年 8 月 4 日
发布了 androidx.compose.runtime:runtime-*:1.1.0-alpha01。版本 1.1.0-alpha01 中包含这些提交内容。
1.0 版
版本 1.0.5
2021 年 11 月 3 日
发布了 androidx.compose.runtime:runtime-*:1.0.5。版本 1.0.5 中包含这些提交内容。
bug 修复
- 修复了跟踪 derivedStateOf 实例时出现的崩溃问题。(aosp/1792247)
版本 1.0.4
2021 年 10 月 13 日
发布了 androidx.compose.runtime:runtime-*:1.0.4。版本 1.0.4 中包含这些提交内容。
依赖项更新
- 已更新为依赖于 Kotlin
1.5.31
版本 1.0.3
2021 年 9 月 29 日
发布了 androidx.compose.runtime:runtime-*:1.0.3。版本 1.0.3 中包含这些提交内容。
依赖项更新
- 已更新为依赖于 Kotlin
1.5.30
版本 1.0.2
2021 年 9 月 1 日
发布了 androidx.compose.runtime:runtime-*:1.0.2。版本 1.0.2 中包含这些提交内容。
已更新,可支持 Compose 1.0.2 版本。Compose 1.0.2 仍与 Kotlin 1.5.21 兼容。
版本 1.0.1
2021 年 8 月 4 日
发布了 androidx.compose.runtime:runtime-*:1.0.1。版本 1.0.1 中包含这些提交内容。
依赖项更新
- 已更新为依赖于 Kotlin
1.5.21。
版本 1.0.0
2021 年 7 月 28 日
发布了 androidx.compose.runtime:runtime-*:1.0.0。版本 1.0.0 中包含这些提交内容。
1.0.0 的主要功能
这是 Compose 的第一个稳定版本。如需了解详情,请参阅官方 Compose 版本发布博客!
已知问题
如果您使用的是 Android Studio Bumblebee Canary 4 或 AGP
7.1.0-alpha04/7.1.0-alpha05,可能会遇到以下崩溃问题:java.lang.AbstractMethodError: abstract method "void androidx.lifecycle.DefaultLifecycleObserver.onCreate(androidx.lifecycle.LifecycleOwner)"如需修复此崩溃问题,请暂时将
build.gradle文件中的 minSdkVersion 提高到 24 及以上。此问题将在下一个版本的 Android Studio Bumblebee 和 AGP7.1中修复。(b/194289155)
版本 1.0.0-rc02
2021 年 7 月 14 日
发布了 androidx.compose.runtime:runtime-*:1.0.0-rc02。版本 1.0.0-rc02 中包含这些提交内容。
- 修复了 SnapshotStateObserver 中的竞态条件导致系统偶尔抛出 NullPointerException 的问题。(aosp/1763445、aosp/1758105、b/192677711)
- 修复了运行时快照导致
java.lang.IllegalStateException: Reading a state that was created after the snapshot was taken or in a snapshot that has not yet been applied崩溃的问题。(b/193006595、b/192570897)
版本 1.0.0-rc01
2021 年 7 月 1 日
发布了 androidx.compose.runtime:runtime-*:1.0.0-rc01。版本 1.0.0-rc01 中包含这些提交内容。
版本 1.0.0-beta09
2021 年 6 月 16 日
发布了 androidx.compose.runtime:runtime-*:1.0.0-beta09。版本 1.0.0-beta09 中包含这些提交内容。
添加了配置文件规则
此版本向以下 Compose 模块添加了配置文件规则 (I14ed6):
- androidx.compose.animation
- androidx.compose.animation-core
- androidx.compose.foundation
- androidx.compose.foundation-layout
- androidx.compose.material
- androidx.compose.material-ripple
- androidx.compose.runtime
- androidx.compose.ui
- androidx.compose.ui.geometry
- androidx.compose.ui.graphics
- androidx.compose.ui.text
- androidx.compose.ui.text
- androidx.compose.ui.unit
- androidx.compose.ui.util
什么是配置文件规则?
库的配置文件规则是在位于
src/main或等效目录内的文本文件baseline-prof.txt中指定的。该文件会每行指定一个规则,在此情况下,规则是指用于与库中的方法或类匹配的格式。这些规则的语法是使用adb shell profman --dump-classes-and-methods ...时所用的便于用户看懂的 ART 配置文件格式的超集。这些规则采用两种形式,一种用于方法,一种用于类。方法规则采用以下格式:
<FLAGS><CLASS_DESCRIPTOR>-><METHOD_SIGNATURE>类规则采用以下格式:
<CLASS_DESCRIPTOR>其中,
<FLAGS>是H、S和P中的一个或多个字符,用于指示相应方法应标记为“Hot”“Startup”还是“Post Startup”。<CLASS_DESCRIPTOR>是目标方法所属类的描述符。例如,类androidx.compose.runtime.SlotTable的描述符为Landroidx/compose/runtime/SlotTable;。<METHOD_SIGNATURE>是方法的签名,其中包含方法的名称、参数类型和返回值类型。例如,LayoutNode中的fun isPlaced(): Boolean方法具有签名isPlaced()Z。这些格式可以包含通配符(
**、*和?),以便让单个规则能够涵盖多个方法或类。
规则的作用是什么?
如果某个方法具有
H标志,则表示该方法为“hot”方法,应提前进行编译。如果某个方法具有
S标志,则表示系统会在启动时调用该方法,应提前进行编译,以避免在启动时耗费资源进行编译以及解析该方法。如果某个方法具有
P标志,则表示系统会在启动后调用该方法。如果某个类出现在此文件中,则表示系统会在启动过程中使用该类,应在堆中预先分配该类,以避免耗费资源来加载它。
运作方式
- 库可以定义要打包到 AAR 制品中的那些规则。如果事后构建了某个应用,并且其中包含这些制品,系统会将这些规则合并在一起,并使用合并后的规则来构建特定于该应用的紧凑二进制 ART 配置文件。然后,当设备安装该应用后,ART 就可以利用此配置文件来预先编译应用的特定部分,从而提升应用性能,特别是首次运行时的性能。请注意,这对可调试应用没有任何影响。
版本 1.0.0-beta08
2021 年 6 月 2 日
发布了 androidx.compose.runtime:runtime-*:1.0.0-beta08。版本 1.0.0-beta08 中包含这些提交内容。
API 变更
State<T>现已更改为State<out T>(I69049)ControlledCompositionAPI 已更改为在一次性重组中支持重组更改。(Iaafd1、b/184173932)
版本 1.0.0-beta07
2021 年 5 月 18 日
发布了 androidx.compose.runtime:runtime-*:1.0.0-beta07。版本 1.0.0-beta07 中包含这些提交内容。
API 变更
- 添加了新的 Compose 编译器 API,这些 API 允许在缩减源代码大小的过程中移除由编译器生成的源代码信息。(Ia34e6)
引入了
ReusableContent,它会尝试重复使用其内容中的节点,而不是在键发生更改后替换节点。键发生更改后,内容的槽表中先前的值将被忽略,但生成的节点和用于更新节点的值除外。引入了
ReusableComposeNode,它会重复使用已发出的节点,而不是像对ComposeNode那样替换该节点。(I1dd86)@ComposeCompilerApi不再@RequiresOptIn(Iab690)
bug 修复
- LazyColumn/Row 现在最多会使 2 个之前可见的项保持活跃状态(不予处置),即使它们已滚动出边界也是如此。这样一来,当我们需要合成新项时,该组件便可重复使用活跃的子组合,从而改善滚动性能。(Ie5555)
版本 1.0.0-beta06
2021 年 5 月 5 日
发布了 androidx.compose.runtime:runtime-*:1.0.0-beta06。版本 1.0.0-beta06 中包含这些提交内容。
API 变更
@ComposeCompilerApi不再@RequiresOptIn(Iab690)
版本 1.0.0-beta05
2021 年 4 月 21 日
发布了 androidx.compose.runtime:runtime-*:1.0.0-beta05。版本 1.0.0-beta05 中包含这些提交内容。
API 变更
- 移除了用于记录快照读写的
@InternalComposeApi(Id134d)
bug 修复
- ui-test-manifest 和 ui-tooling-data 中的 AndroidManifest 文件现在与 Android 12 兼容(I6f9de、b/184718994)
版本 1.0.0-beta04
2021 年 4 月 7 日
发布了 androidx.compose.runtime:runtime-*:1.0.0-beta04。版本 1.0.0-beta04 中包含这些提交内容。
bug 修复
在此变更之前,本地可组合函数可根据其参数而跳过。此更改生效后,系统不会再跳过任何本地可组合函数。之所以会有这项变更,是因为在通常情况下,本地函数会从父函数获取参数,而跳过本地函数是出现 bug 的常见原因。
总之,请参考以下示例:
@Composable fun Counter(count: Int, onCountChange: (Int) -> Unit) { @Composable fun ShowCount() { Text("Count: $count") } ShowCount() Button(onClick={ onCountChange(count + 1) }) { Text("Increment") } }在此变更之前,系统总是跳过
ShowCount可组合函数,即使更新count参数,也是如此。这种情况不会再发生了。(I5648a)修复了
rememberSaveable()存在输入参数时会恢复原值的问题(I1b110、b/182403380)
版本 1.0.0-beta03
2021 年 3 月 24 日
发布了 androidx.compose.runtime:runtime-*:1.0.0-beta03。版本 1.0.0-beta03 中包含这些提交内容。
API 变更
- 废弃了
DefaultMonotonicFrameClock。现在,如果在不提供MonotonicFrameClock的情况下调用withFrameNanos或Recomposer.runRecomposeAndApplyChanges,将抛出IllegalStateException。(I4eb0d)
版本 1.0.0-beta02
2021 年 3 月 10 日
发布了 androidx.compose.runtime:runtime-*:1.0.0-beta02。版本 1.0.0-beta02 中包含这些提交内容。
bug 修复
- 对实验性 API 的公开使用施加限制(I6aa29、b/174531520)
- 修复了
rememberSaveable { mutableStateOf(0) }在 navigation-compose 的目标内使用时损坏的问题。(I1312b、b/180042685、b/180701630)
版本 1.0.0-beta01
2021 年 2 月 24 日
发布了 androidx.compose.runtime:runtime-*:1.0.0-beta01。版本 1.0.0-beta01 中包含这些提交内容。
这是 Compose 1.0.0 Beta 版的第一个版本。
API 变更
- 添加了
Recomposer.runRecomposeConcurrentlyAndApplyChanges实验性 API,用于重组主框架循环外的无效组合。(I342d0) - 所有标有 @ReadOnlyComposable 的可组合项现在均已通过编译时验证,以确保它们仅会调用其他 @ReadOnlyComposables (I58961)
compositionLocalOf和staticCompositionLocalOf的defaultFactory现在是必需项,而非可选项。这项变更消除了不可为 null 的类型(不提供默认出厂设置)可能存在的类型错误。之前,此操作会为不可为 null 的类型提供 null 引用值。
对于可为 null 的类型,请考虑提供
{ null }作为默认出厂设置。除非可提供合理的默认设置,否则我们不建议使用具有不可为 null 的类型的本地设置。如果不存在合理的默认设置,则
defaultFactorylambda 应抛出异常。不过,抛出异常意味着本地设置的使用者将隐式依赖于相关设置是以类型系统不强制执行该设置为前提的。(Ifbd2a)从 Comepose 运行时中移除了已废弃的符号 (I3252c)
移除了已废弃的
emptyContent()。已改用{}。(Idb33f、b/179432510)已将 Provider 重命名为 CompositionLocalProvider
- Composition 构造函数不再接受键参数,并已废弃。
- currentCompositeKeyHash 已变为可组合的顶级属性,而不是可组合的顶级函数。
- CompositionData 和 CompositionGroup 已移至 androidx.compose.runtime.tooling 命名空间
- ComposableLambda 已成为接口,而不再是具体的类,也不再包含类型参数。
- ComposableLambdaN 已成为接口,而不再是具体的类,也不再包含类型参数。
- snapshotFlow 函数已移至 androidx.compose.runtime 命名空间
- SnapshotMutationPolicy 的合并方法不再是实验性方法
- 移除了 @TestOnly 顶级 clearRoots 函数。不再需要此函数。
- 移除了 keySourceInfoOf 和 resetSourceInfo 函数。不再需要这些方法。
- 移除了 Composer.collectKeySourceInformation。不再需要此函数。
- 移除了 isJoinedKey、joinedKeyLeft 和 joinedKeyRight 方法。不再需要这些方法。
- 各种顶级 API 均已移至不同的文件中并进行了重新整理。由于 Kotlin 的文件类语义,这会破坏二进制文件兼容性,但不会破坏源代码兼容性,因此对大多数用户来说这不会成为一个问题。
- (I99b7d、b/177245490)
SnapshotStateObserver 不再处于实验阶段 (Id2e6a)
删除了一些先前已废弃的 API(Ice5da、b/178633932)
进行了以下 Material API 方面的更改:
- 向 Top/BottomAppBar 添加了 contentPadding 参数,以允许自定义默认内边距。
- 对 BackdropScaffold 中的参数进行了重新排序,以便遵循 API 指南中关于将必需参数排在可选参数前面的要求。
- 将 BottomNavigationItem 中的
icon参数移到了selected和onClick后面。 - 将 BottomNavigationItem 中的
alwaysShowLabels参数重命名为了alwaysShowLabel。 - 将几个组件中的
bodyContent参数重命名为了content。 - 对
ButtonDefaults.buttonColors()中的参数进行了重新排序。请注意,由于参数的类型并未更改,因此这不会导致您的代码出现错误。请确保您使用的是命名参数或手动更新相关排序,否则您的代码将无法像以前一样运行。 - 向
darkColors()添加了secondaryVariant参数。此颜色通常与深色主题中的secondary相同,添加此参数是为了保持一致性和便于进行进一步的自定义。 - 从公共 API Surface 中移除了 ElevationDefaults 和 animateElevation(),因为它们不常用/不实用。
- 将
Slider中的onValueChangeEnd重命名为了onValueChangeFinished,并使其可为 null。 - 将
Snackbar中的text参数重命名为了content以确保一致性。 - 向
DropdownMenuItem添加了contentPadding参数,以允许自定义默认内边距,并将content设为了RowScope上的扩展。 - 将
ModalDrawerLayout重命名为了ModalDrawer。 - 将
BottomDrawerLayout重命名为了BottomDrawer。 - (I1cc66)
版本 1.0.0-alpha12
2021 年 2 月 10 日
发布了 androidx.compose.runtime:runtime-*:1.0.0-alpha12。版本 1.0.0-alpha12 中包含这些提交内容。
API 变更
- 从 UiApplier 移除了对 ViewGroup 的支持。移除了废弃的 emitView 可组合项。(Ifb214)
- CompositionReference 已重命名为 CompositionContext (I53fcb)
- ComponentActivity.setContent 已移至 androidx.activity:activity-compose 模块中的 androidx.activity.compose.setContent。(Icf416)
- 更新了 Snapshot API 以使其更加符合 API 指南,并在公共 API 中隐藏了内部实现类。(Id9e32)
- 已重命名 Ambient,以与 Ambient 重命名为 CompositionLocal 匹配。Ambient 过去被命名为 AmbientFoo,现在 CompositionLocal 被命名为 LocalFoo。(I2d55d)
- 将 Ambient 重命名为 CompositionLocal,并分别将 ambientOf / staticAmbientOf 重命名为 compositionLocalOf / staticCompositionLocalOf。这一变更有助于使 CompositionLocal 的目的更加明确:即用作一种用于提供/检索组合本地值的机制。CompositionLocal 实例应带有前缀
Local,例如 val LocalFoo = compositionLocalOf { Foo() }。(Ia55b6) - takeMutableSnapshot 和 takeSnapshot 已移至 Snapshot 的配套方法。(I91f19)
已废弃
@ComposableContract,改为使用三个更具体的注解。@ComposableContract(restartable = false)已变为@NonRestartableComposable,@ComposableContract(readonly = true)已变为@ReadOnlyComposable,@ComposableContract(preventCapture = true)已变为@DisallowComposableCalls,@ComposableContract(tracked = true)已被移除。(I60a9d)已废弃 emptyContent() 和 (@Composable () -> Unit).orEmpty(),因为它们不再具有任何积极的性能影响或价值 (I0484d)
snapshotFlow和withMutableSnapshot不再是实验性方法 (I6a45f)现在可以关闭 Recomposer。关闭的 Recomposer 会继续重组,直至组合子协程完成。Recomposer.shutDown 已重命名为 cancel,与 close 形成对比。(Ib6d76)
compose:runtime-dispatch制品现已废弃。现在,MonotonicFrameClock 位于 compose:runtime 中,AndroidUiDispatcher 位于 compose:ui 中。(Ib5c36)已重构 Compose 编译器插件面向的 API,旨在使用接口而不是具体类。接口也不再使用类型参数。
这种内部更改不会影响源代码兼容性,但这是一项重大的二进制文件更改。(I3b922、b/169406779)
引入了 SnapshotMutableState (Icfd03)
DisposableEffectDisposable 已重命名为 DisposaleEffectResult (Ica7c6)
移除了 Recomposer.current()。[Abstract]ComposeView 现在默认设置为延迟创建的、作用域为窗口的 Recomposer(由窗口的 ViewTreeLifecycleOwner 驱动)。在主机生命周期结束时,系统会暂停重组和基于 withFrameNanos 的动画 tick 操作。(I38e11)
Recomposer.runningRecomposers 现在提供只读 RecomposerInfo 的一个全局 StateFlow,用于观察进程中正在进行的组合状态。请首选此 API 而不是 Recomposer.current(),后者现在已废弃。(If8ebe)
DisposableEffectDisposable 已重命名为 DisposaleEffectResult (I3ea68)
版本 1.0.0-alpha11
2021 年 1 月 28 日
发布了 androidx.compose.runtime:runtime-*:1.0.0-alpha11。版本 1.0.0-alpha11 中包含这些提交内容。
API 变更
- onCommit、onDispose 和 onActive 已废弃,取而代之的是 SideEffect API 和 DisposableEffect API (If760e)
- emit() API 和所有重载均已废弃并重命名为 ComposeNode。这些 API 是一样的,只不过为了遵循 Compose 的命名惯例而采用了不同的名称 (I4137b)
- invalidate 和 compositionReference() 现已废弃,取而代之的分别是 currentRecomposeScope 和 rememberCompositionReference。(I583a8)
CompositionLifecycleObserver 现已废弃,取而代之的是 RememberObserver。
RememberObserver已替代CompositionLifecycleObserver,且语义和方法名称也已改变。始终推荐的做法是,对那些只记住一次的对象,可以机械地更改为新的 API。不过,如果引用在组合中被记住不止一次,那么对于只调用onRemembered一次的每个引用,都会调用onEnter。如果将onEnter用于WithConstraints和Scaffold等子组合,则会多次调用该对象,从而打破单次调用onEnter的保证,而对于RememberObserver已将该对象移除。RememberObserver添加了在以下情况下会被调用的onAbandoned:如果从传递到remember的回调中返回RememberObserver实例,但该实例在组合状态下不被记住,并因此永远不会调用onRemembered。当异常导致组合在完成前终止,或者组合因以下两种原因而遭到舍弃时就会发生上述情况:组合因不再是最新的而处于正在生成状态或者组合不再被需要。如果遵循上述单一引用建议的RememberObserver实例跟踪的是外部资源,那么onForgotten和onAbandoned都会表示不再需要该资源。如果该对象跟踪的是onRemembered中已开始的工作或已分配的资源,则可以忽略onAbandoned,因为如果调用onRemembered,就不会调用 onAbandoned。(I02c36)不将
collectAsState()函数标记为内嵌函数 (Ia73e4)
bug 修复
- 已将 WithConstraints 重新设计为 BoxWithConstraints 并移至 foundation.layout。(I9420b、b/173387208)
- 在测试中使用 TestCoroutineDispatcher (I532b6)
版本 1.0.0-alpha10
2021 年 1 月 13 日
发布了 androidx.compose.runtime:runtime-*:1.0.0-alpha10。版本 1.0.0-alpha10 中包含这些提交内容。
重大变更
重构内部编译器 API 时,允许在所有
@Composable函数均已完成后,对因为进入“应用更改”组合阶段而生成的节点进行批量更改。这是一项可能会影响应用代码的重大行为变更,因为在应用完更改之前,无法再通过内部 API 和实验性 API 提供节点。通常可如下解决此问题:将具有此类依赖项的代码封装在
SideEffect可组合项中,从而将代码的执行推迟到节点创建和初始化之后。(I018da)
API 变更
- 添加了在 Recomposer 已应用更改的情况下进行跟踪的方式。(I1b3e2)
扩展了 [Abstract]ComposeView API 以允许回收基于 Compose 的视图,处理其组合以便日后重新创建。添加了用于安装和发现作用域为窗口的 Recomposer 的 API 和用于创建子组合的 CompositionReference。
添加了 ViewCompositionStrategy,用于配置 [Abstract]ComposeView 的组合处理策略;默认行为是在窗口分离时进行处理。(I860ab)
bug 修复
- Recomposer 现在提供其当前状态的 Flow,因此可监控其 activity 和相关效果的 activity。(Ifb2b9)
- 现在可通过 keyEvent.nativeKeyEvent 访问原生 keyEvent(I87c57、b/173086397)
版本 1.0.0-alpha09
2020 年 12 月 16 日
发布了 androidx.compose.runtime:runtime-*:1.0.0-alpha09。版本 1.0.0-alpha09 中包含这些提交内容。
API 变更
从公共 API 中移除了 SlotTable、SlotReader 和 SlotWriter。这些 API 以前被标记为 InternalComposeAPI,现已变成 Compose 模块的内部 API。
添加了 CompositionData 和 CompositionGroup,用于替代 ui-tooling API 来提取组合信息。CompositionData 和 CompositionGroup 是公开的,但不能在 ui-tooling API 之外使用,因为它们会提供 ui-tooling API 解译的原生信息 (I31a9c)
不再将 Applier 类视为实验性 API (Id85b0)
更改了
Applier接口,简化了将树的构建方式从自上而下改为自下而上的过程。insert()方法已重命名为insertTopDown()。添加了新方法
insertBottomUp()。applier 可以使用
insertTopDown()或insertBottomUp()向正修改的树中插入节点,具体取决于哪个方法的效果更好。在构建某些树(例如
LayoutNode和View)时,自下而上构建会比自上而下构建效率更高。在做出此变更之前,若想实现自下而上构建,要进行很多插入操作,并需将插入内容复制到需借助自下而上的构建方式来提高性能的每个 applier。通过此变更,Applier替换insertBottomUp()即可实现自下而上构建树,替换insertTopDown()即可实现自上而下构建树。(Icbdc2)Compose 支持可进行可组合调用的属性 getter。系统不会停止支持此类 getter,但将某个属性 getter 声明为 @Composable 的语法会不断变化。
要采用现已废弃的语法进行此声明,需对属性本身进行注解:
@Composable val someProperty: Int get() = ...若要采用目前正确的语法进行此声明,需对属性的 getter 进行注解:
val someProperty: Int @Composable get() = ...在一段时间内,这两种语法都能使用,但前者(即现已废弃的语法)最终将导致编译错误。(Id9197)
bug 修复
- 将 AndroidOwner 变为内部函数(Ibcad0、b/170296980)
- 将 subcomposeInto(LayoutNode) 变为了内部函数 (Id724a)
版本 1.0.0-alpha08
2020 年 12 月 2 日
发布了 androidx.compose.runtime:runtime-*:1.0.0-alpha08。版本 1.0.0-alpha08 中包含这些提交内容。
API 变更
- 添加了针对可组合 lambda 参数命名和位置的 lint 检查,旨在检查其命名和位置是否符合 Compose 准则。此外,根据 lint 检查结果和指南,还将一些尾随 lambda 名为
children的 API 迁移到了content。(Iec48e) - Recomposer 不再接受 EmbeddingContext;系统会从 effectCoroutineContext 中获取所需的调度依赖项。废弃了 FrameManager;平台在进行集成时应初始化其自己的全局快照处理操作。(I02369)
- RestorableStateHolder.withRestorableState 函数已重命名为 RestorableStateProvider (I66640)
bug 修复
- 废弃了名称后缀为
Ambient的 Ambient 属性,将它们替换成了以 Ambient 为前缀的新属性(以与其他 Ambient 属性保持一致并遵循 Compose API 准则)。(I33440) - 移除了旧的 ui-test 模块及其桩 (I3a7cb)
版本 1.0.0-alpha07
2020 年 11 月 11 日
发布了 androidx.compose.runtime:runtime-*:1.0.0-alpha07。版本 1.0.0-alpha07 中包含这些提交内容。
新功能
API 变更
- 废弃了
@UnionType注解 (I57cde) - 添加了 provideDefault,用作提供上下文环境的替代方案,可用于指定只会在尚未提供上下文环境值时设置的上下文环境值。(Id6635、b/171024925)
- LaunchedTask 已重命名为 LaunchedEffect,以与 SideEffect 和 DisposableEffect API 保持一致。为了鼓励采用最佳实践,不允许使用不含主题参数的 LaunchedEffect。(Ifd3d4)
- Applier 现在包含 onBeginChanges/onEndChanges 回调,可在 Composer 开始/结束将更改应用到树时调用。您可根据需要将这些回调用于资源的批量管理。(Icf476)
- 现在,Recomposer 在构造时需要使用 CoroutineContext (Ic4610)
- 对不应影响公共 API 的内部 SlotTable 实现进行了更改。(If9828)
- 移除了不使用初始值的已废弃 rxjava2 适配器 (Idb72f)
bug 修复
- 废弃了 foundation.Text,取而代之的是 material.Text。如需了解不使用来自主题的值的“非预设立场型”基本文本 API,请参阅 androidx.compose.foundation.BasicText。(If64cb)
- 废弃了 BaseTextField,请改用 BasicTextField。(I896eb)
- 已将几个与布局相关的符号从 androidx.compose.ui 移至 androidx.compose.layout.ui。(I0fa98、b/170475424)
外部贡献
- 添加了用于 Compose 的
runtime-rxjava3模块。类似于runtime-rxjava2(I02cbf)
版本 1.0.0-alpha06
2020 年 10 月 28 日
发布了 androidx.compose.runtime:runtime-*:1.0.0-alpha06。版本 1.0.0-alpha06 中包含这些提交内容。
API 变更
- Recomposer 现在既是一个 CompositionReference,又是一个有效的组合父项。现在,需要使用显式 Recomposer 的情况比以前少。(I4036f)
- 添加了与 SideEffect 对应的 DisposableEffect API,用于填充 onCommit-with-params 角色,但需要一个必需的 onDispose。
- 添加了 rememberUpdatedState API,以将数据从重组发布到持续进行或长期存在的进程(例如 DisposableEffect 或 LaunchedTask)。
- (Id50b9)
- MutableVector 现已实现 RandomAccess(I85d73、b/170461551)
- 添加了 SideEffect 可组合项,用于将组合的附带效应应用到其管理的对象。SideEffect 旨在取代 onCommit 可组合项。(Ia77c2)
- 新增了实验性 API RestorableStateHolder。通过该 API,可先为子树保存定义为 [savedInstanceState] 和 [rememberSavedInstanceState] 的状态,然后再对其进行处理,以便下次利用恢复后的状态将其重新组合起来。(I66884、b/166586419)
bug 修复
- 在 ComposeTestRule 中启用了过渡;从 ComposeTestRule 中移除了用于启用闪烁光标的选项。(If0de3)
版本 1.0.0-alpha05
2020 年 10 月 14 日
发布了 androidx.compose.runtime:runtime-*:1.0.0-alpha05。版本 1.0.0-alpha05 中包含这些提交内容。
API 变更
- 实验性 Modifier.pointerInput 挂起输入修饰符 (Ia77d2)
- 通过减少每次滚动时 subcomposition 中的工作量,改善了 LazyColumn/Row 的滚动性能。为 Composition 类添加了新的 hasInvalidations() 方法。将 Recomposer 中的 hasPendingChanges() 方法重命名为 hasInvalidations()(Ib2f32、b/168293643、b/167972292、b/165028371)
- 添加了 produceState API,用于从组合项启动可随时间的推移更新单个
State<T>值的协程 (Id4a57) - 将 launchInComposition 重命名为 LaunchedTask,以符合 Compose API 准则 (I99a8e)
- 自定义布局中 place() 调用的顺序现在可定义子级的绘制顺序 (Ibc9f6)
版本 1.0.0-alpha04
2020 年 10 月 1 日
发布了 androidx.compose.runtime:runtime-*:1.0.0-alpha04。版本 1.0.0-alpha04 中包含这些提交内容。
API 变更
- 添加了 OwnerScope,以允许收集失效的布局和绘制观察范围。(Ic4cf8)
- 添加了 derivedStateOf API,可根据计算结果创建可以读取(和派生于)其他 State 对象的 State 对象 (If758b)
- 为 SnapshotStateObserver 添加了 TestOnly API (I6e2a9)
bug 修复
- 废弃了 foundation.Box。请改用 foundation.layout.Box。(Ie5950、b/167680279)
版本 1.0.0-alpha03
2020 年 9 月 16 日
发布了 androidx.compose.runtime:runtime-*:1.0.0-alpha03。版本 1.0.0-alpha03 中包含这些提交内容。
API 变更
CompositionCoroutineScope不再实现MonotonicFrameClock。withFrameNanos的调用方应明确导入顶层函数。(Icb642、b/166778123)
bug 修复
- 全局测试函数(例如
onNode或waitForIdle)现已废弃,请改用根据 ComposeTestRule 定义的新函数 (I7f45a) launchInComposition不再启动未分派的协程(Ief6af、b/166486000)
版本 1.0.0-alpha02
2020 年 9 月 2 日
发布了 androidx.compose.runtime:runtime-*:1.0.0-alpha02。版本 1.0.0-alpha02 中包含这些提交内容。
API 变更
- 添加了
snapshotFlow和withMutableSnapshotAPI,分别用于使用和生成快照数据更改。(I3e722) 可组合函数的调用规范发生了变化。这是一项重大的二进制文件更改。所有库都必须重新编译才能使用此版本的 Compose 编译器插件。
这项更改不会在源代码级别产生重大变化,因为只有已更改的 API 属于明确选择启用的编译器 API。(I7afd2、b/158123185)
从 EmbeddingContext 中移除了调度方法 (I7b9be)
废弃了 onPreCommit;onCommit 的功用现在与 onPreCommit 相同。
现在,onCommit 和 onActive 在已提交的组成部分变更的同一 Choreographer 帧中运行,而不是在下一个 Choreographer 帧开始处运行。(I70403)
版本 1.0.0-alpha01
2020 年 8 月 26 日
发布了 androidx.compose.runtime:runtime-*:1.0.0-alpha01。版本 1.0.0-alpha01 中包含这些提交内容。
版本 0.1.0-dev
版本 0.1.0-dev17
2020 年 8 月 19 日
发布了 androidx.compose.runtime:runtime-*:0.1.0-dev17。版本 0.1.0-dev17 中包含这些提交内容。
API 变更
- 自定义 emit 现在可以做如下声明:可以跳过它的一个或多个 setter,并且可以独立于 emit 对 setter 进行重新组合。(Ibbd13)
移除了已废弃的 FrameManager 调用。
更改了内部 Compose API,从而降低了跟踪状态对象(如
mutableStateof())所需的开销 (I80ba6)为清楚起见,现已废弃
state { ... }可组合项,取而代之的是对remember { mutableStateOf(...) }的显式调用。这样可减少管理状态所需的整体 API Surface 及概念数量,且与类属性委托的by mutableStateOf()模式相一致。(Ia5727)Flow.collectAsState 现在根据组合本身来确定默认调度程序,而非默认使用 Dispatchers.Main。(I9c1d9)
解决了在 for 循环内使用某些用于保存状态的方法时出现崩溃的问题。现已支持在 savedInstanceState() 中使用同一键,并已根据此新要求对 UiSavedStateRegistry 的 API 做出调整(I4ab76、b/160042650、b/156853976、b/159026663、b/154920561)
bug 修复
- 废弃了
emitView。请在可行的情况下改用AndroidView在 Compose 中发出 View。请注意,今后将不再支持直接对 View 和 ViewGroup 进行组合,除非二者是组合树的分支(在这种情况下,可通过 AndroidView 进行组合)。(I29b1e、b/163871221)
版本 0.1.0-dev16
2020 年 8 月 5 日
发布了 androidx.compose.runtime:runtime-*:0.1.0-dev16。版本 0.1.0-dev16 中包含这些提交内容。
API 变更
mutableStateOf()、ambientOf()和savedInstanceStateOf()的默认突变政策已更改为structuralEqualityPolicy()(而非referentialEqualityPolicy())。现在默认使用使用
==(而非===)来确定是否将新值分配给mutableStateOf()实例。请参阅 https://kotlinlang.org/docs/reference/equality.html
ambientOf()和savedInstanceStateOf()在其实现中使用mutableStateOf(),因此,已对二者进行更改以与mutableStateOf()保持一致。结构相等的使用现在更符合开发者的预期。
例如,
val state = mutableStateOf(1f)后跟
state.value = 1f不再被视为对
state的更改,且在组合过程中使用state时不再需要重新组合。这是一项重大变更,但在大多数情况下(例如,使用不会替换
equals()的类时)不会对应用产生明显影响。会替换
equals()的类(例如data类)可能会出现性能下降,因为现在系统默认会在将其equals()方法分配给mutableStateOf()时调用这些方法。如需恢复之前的行为,请在对
mutableStateOf()、ambientOf()和savedInstanceStateOf()的调用中添加政策参数policy = referentialEqualityPolicy()。(Ic21a7)Row和Column现在属于内联函数,其使用开销将显著降低。(I75c10)
bug 修复
- 废弃了 setViewContent,请改用 setContent。(I7e497、b/160335130)
添加了 MonotonicFrameAnimationClock,您可将 MonotonicFrameClock 用作 AnimationClockObservable,以消除基于协程的新时钟与仍使用基于旧回调的时钟的 API 之间的差异。
现在,ManualAnimationClock 的 MonotonicFrameClock 等效项是 ManualFrameClock。(I111c7、b/161247083)
我们对 Modifier.stateDraggable 进行了彻底的重新设计,并将其重命名为 Modifier.swipeable。引入了一个新 SwipeableState 类,并对 DrawerState 和 BottomDrawerState 进行了重构,使其可从该类继承数据。[Modal/Bottom]DrawerLayout 不再使用 onStateChange 参数。(I72332、b/148023068)
已废弃 Modifier.plus,现在改用 Modifier.then。“Then”能够更明确地指出先后执行顺序,同时还禁止输入会破坏链且降低可读性的
Modifier.padding().background() + anotherModifier(Iedd58、b/161529964)添加了 SubcomposeLayout。这是一个低级别基元,如果我们想要使用仅在衡量子树组合期间后期可用的一些值,就可以利用此基元在衡量期间组合子项。例如,WithConstraints 并非通过 SubcomposeLayout 实现。(I25cc8)
Material FilledTextField 已重命名为 TextField,且基础 TextField 已重命名为 BaseTextField,您可轻松寻找并使用所需的最简单的 API(Ia6242、b/155482676)
Modifier.drawBackground 已重命名为 Modifier.background (I13677)
版本 0.1.0-dev15
2020 年 7 月 22 日
发布了 androidx.compose.runtime:runtime-*:0.1.0-dev15。版本 0.1.0-dev15 中包含这些提交内容。
依赖项更新
- 如需使用 Compose 的
0.1.0-dev15版本,您需要根据上面的声明依赖项部分给出的新代码段来更新依赖项。
API 变更
现已废弃了
@Model注解。请使用 state 和 mutableStateOf 作为替代方案。经仔细讨论之后,我们做出了这一废弃决定。理由
理由包括但不限于:
- 减少 API Surface 区域和我们需要传授的概念
- 更为贴近其他类似工具包(Swift UI、React、Flutter)
- 这是一项可撤消的决定。我们以后可以随时恢复
@Model。 - 解决了极端情况下的使用难题,轻松回答了有关将
@Model配置为我们需要处理的内容的问题 @Model数据类、等号、哈希代码等。- 如何让部分属性“被观测”,而其他属性不被观测?
- 如何指定要在观测中使用的结构性与指示性等式?
- 减少系统中的“魔力”。这会降低有人误认为系统比实际上要更智能(即知道如何区分列表)的可能性
- 使观测的粒度更为直观。
- 改进了类中从变量到属性的可重构性
- 可能使您可以手动进行针对特定状态的优化
- 与生态系统的其他部分更加贴近,并减少了在不可变性或我们“接受可变状态”方面的不确定性
迁移注意事项
@Model的几乎所有现有用例都可通过两种方式进行转换。以下示例具有一个@Model类,该类有两个属性(仅作示例),用在一个组合项中。@Model class Position( var x: Int, var y: Int ) @Composable fun Example() { var p = remember { Position(0, 0) } PositionChanger( position=p, onXChange={ p.x = it } onYChange={ p.y = it } ) }替代方案 1:使用
State<OriginalClass>并创建副本。使用 Kotlin 的数据类可以更轻松地实现此方法。从本质上讲,请将之前的所有
var属性设为数据类的val属性,然后使用state而不是remember,并将状态值分配给使用数据类copy(...)便捷方法的原始版本的克隆副本。请注意,只有当该类的唯一转变发生在创建
State实例的同一范围内时,此方法才有效。如果类在使用范围之外发生内部变化,并且您依赖于对该范围的观察,则您需要使用下一种方法。data class Position( val x: Int, val y: Int ) @Composable fun Example() { var p by state { Position(0, 0) } PositionChanger( position=p, onXChange={ p = p.copy(x=it) } onYChange={ p = p.copy(y=it) } ) }替代方案 2:使用 mutableStateOf 和属性委托
使用 Kotlin 的属性委托和
mutableStateOfAPI 可以更轻松地实现此方法,使您可以在组合之外创建 MutableState 实例。实际上,请将原始类的所有var属性替换为以mutableStateOf作为属性委托的var属性。这样做的好处是,类的使用情况完全不会改变,变化的只是其内部实现。不过,这种行为与原始示例并不完全相同,因为每个属性现在都是单独观察/订阅的,因此您在重构后看到的重新组合可能会变窄(这是好事)。class Position(x: Int, y: Int) { var x by mutableStateOf(x) var y by mutableStateOf(y) } // source of Example is identical to original @Composable fun Example() { var p = remember { Position(0, 0) } PositionChanger( position=p, onXChange={ p.x = it } onYChange={ p.y = it } ) }(I409e8、b/152050010、b/146362815、b/146342522、b/143413369、b/135715219、b/143263925、b/139653744)
更改了 Compose 的编译器的代码生成策略。在更改之前,Compose 编译器会转换对可组合函数的调用。进行此更改后,现在我们可以转换可组合函数的正文,并使调用位置保持不变(大多数情况下)。
这意味着与 Compose 运行时进行通信的大多数逻辑发生在函数正文的开头,而不是在调用位置。
这应该是针对所有 Compose 操作的源兼容性更改。大多数 Compose 用户都不需要在更改后更新任何代码。
为了支持这项更改,所有可组合函数的 JVM 签名均已更改。将接受单个参数的可组合函数转换为接受 3 个参数的函数,其他参数为合成器,即“键”整数,一个用于通过调用传播元数据的位掩码整数。
Compose 现在还会将默认参数转换为可组合函数。这项操作不会引入函数本身的额外合成默认过载,因此此更改会导致定义的函数变少。
已知的有意行为更改是由于以下原因造成的:
- 有些调用会跳过之前不会跳过的位置
- 默认参数表达式中的可组合项表达式现已正确订阅并处理
这项工作包括一些优化: 1. 参数的比较结果通过调用图传播到其他可组合项函数。这将导致运行时比较数减少,槽表大小减小,并更多地跳过之前不跳过的可组合项函数 2. 在编译时被确定为“静态”的参数将不再进行比较或存储在运行时中。这样可以减少比较数并减小槽表大小。 3. 函数正文的控制流结构用于最大限度减少生成的组数量。这样可以减小槽表大小,并减少运行时工作量 4. 如果未在函数正文内部使用调度和接收器参数,则在确定函数的可跳过性时不包含未使用的这些参数。
大多数破坏性更改都面向编译器直接针对的 API,并且通常不会影响 Compose: 1. 移除了 Composer::startExpr 2. 移除了 Composer::endExpr 3. 废弃了 Composer::call 4. 移除了
key的非可变参数过载。今后将使用vararg版本。 5. 废弃了 Pivotal 注解。使用key作为替代方案。6. ScopeUpdateScope::updateScope 更改为 Function3 而非 Function1 7. 更新了 restartableFunction 和 restartableFunctionN,以包含其他编译时参数(I60756、b/143464846)向 MutableVector 添加了 sortWith 和 removeRange (Icccf7)
为 CompositionLifecycleObserver 添加了默认方法实现 (I24289)
Applier 现在需要一个 clear() 方法来处理组合 (Ibe697)
向 MutableVector 添加了 asMutableList(),以使其能够传递到公共 API,而不必复制整个列表。(I298df)
添加了 rememberCoroutineScope() 以获取组合中托管的 CoroutineScope,以便启动任务来响应事件。(I0e264)
MutableVector 是一个新的集合,不实现任何标准 Collection 接口。此集合提供了高于其他要求的速度,并且仅适用于内部实现。(I8ebd6)
暂时移除了
StableMutableList和StableMutableMap,以避免 Compose 所需的 Kotlin 版本出现问题。一旦 Compose 更新到不存在问题的 Kotlin 版本,就会重新引入这些接口。SnapshotStateList和SnapshotStateMap现已公开,但恢复StableMutableList和StableMutableMap后就会将其废弃。(Ia7769)添加了顶级 onFrameNanos 函数用于动画定时 (Ie34c5)
已废弃 @Untracked 注解,替换为 @ComposableContract(tracked=false) (Id211e)
RestartableFunction 和关联的 API 已重命名为 ComposableLambda 等。因为只有编译器定位到这些 API,所以此变更在正常情况下应该不会影响源代码级别的兼容性。重命名的主要目的是,当这个类出现在堆栈轨迹中时,用户能够更清晰地了解这个类 (I7eb25)
@Composable 注解对类不再有效 (Ia5f02)
Ambient<T>现在带有 @Stable 注解而不是 @Immutable 注解 (I0b4bb)在此变更之前,如果存在 @Composable 函数,Compose 编译器插件会以非常复杂的方式拦截对该函数内构造函数的调用(I5205a、b/158123804)
Recompose 可组合项已不再属于有效抽象。大多数重新组合都应由 MutableState 分配促成。在此之外,建议您使用
invalidate函数来触发对当前范围的重新组合。(Ifc992)Observe 已不再属于有效抽象函数。如需对其进行复制,只需创建一个执行可组合 lambda 参数的可组合函数即可复制其实现。例如,
@Composable fun Observe(body: @Composable () -> Unit) = body()(I40d37)废弃了 @Direct,取而代之的是 @ComposableContract(restartable=false) (If4708)
为最近引入的 StateFlow 添加了一个适配器,可用于预先填充初始值,使返回的 State 不可为 null(I61dd8、b/156233789)
为 Flow 添加了一个适配器。用法示例:val value by flow.collectAsState()(If2198、b/153375923)
[Mutable]State 属性委托运算符移到了扩展,以支持 Kotlin 1.4 属性委托优化。调用方必须添加 import 才能继续使用
by state { ... }或by mutableStateOf(...)。(I5312c)androidx.compose.ViewComposer 移到了 androidx.ui.node.UiComposer。移除了 androidx.compose.Emittable,它与 ComponentNode 重复。移除了 androidx.compose.ViewAdapters,它们不再是受支持的用例。已废弃 Compose.composeInto,请改为使用
setContent或setViewContent。已废弃 Compose.disposeComposition,改用setContent返回的Composition的dispose方法。androidx.compose.Compose.subcomposeInto 已移到 androidx.ui.core.subcomposeInto。ComponentNode#emitInsertAt 已重命名为 ComponentNode#insertAt。ComponentNode#emitRemoveAt 已重命名为 ComponentNode#removeAt。ComponentNode#emitMode 已重命名为 ComponentNode#move (Idef00)已将
ComposeFlags.COMPOSER_PARAM标记更新为true,这将改变 Compose 插件的代码生成策略。大体而言,这会导致 @Composable 函数通过其他合成参数生成,该参数会传递到后续 @Composable 调用,以便运行时正确管理执行。这是一项重大的二进制文件更改,但应当在所有获得许可的 Compose 使用情况中保留源代码级别的兼容性。(I7971c)Ambient API 重大更改。如需了解详情,请参阅日志和
Ambient<T>文档(I4c7ee、b/143769776)添加了 ui-livedata - 带适用于 LiveData 的适配器的新制品。用法示例:val value by liveData.observeAsState()(Ie9e8c、b/150465596)
已废弃没有明确的初始值的 Rx 适配器。使用 null 作为默认值并不一定是最佳选择,以 List 为例,最好是以 emptyList() 开头(I00025、b/161348384)
添加了 ui-rxjava2 - 带适用于 RxJava2 的适配器的新制品。用法示例:val value by observable.subscribeAsState()(Ifab4b、b/153369097)
savedInstanceState()现在可以与可为 null 的类型一起使用(I6847f、b/153532190)新增了 listSaver() 和 mapSaver(),可让您更轻松地编写自定义 Saver 对象(I8cf68、b/152331508)
新函数:savedInstanceState() 和 rememberSavedInstanceState()。它们与 state() 和 remember() 类似,但包含已保存实例状态支持构建(If1987、b/152025209)
bug 修复
runOnIdleCompose已重命名为runOnIdle(I83607)- 将 LayoutNode 变成了实验性 API (I4f2e9)
- 废弃了 androidx.ui.foundation.TextFieldValue 和 androidx.ui.input.EditorValue。还废弃了使用该类型的 TextField、FilledTextField 和 CoreTextField 可组合项。请改为使用 androidx.ui.input.TextFieldValue(I4066d、b/155211005)
- 移除了已废弃的 DrawBackground API,改为在修饰符上使用 drawBackground 扩展 API。重构了颜色、笔刷和涂料 drawBackground 实现,以减少代码路径,并且不再要求在组合过程中创建修饰符。(I0343a)
- 更新了公开画布的更高级别的 Compose API,改为公开 CanvasScope。这样一来,用户便无需再维护自己的渲染对象。对于仍需要访问画布的使用方,可以使用 drawCanvas 扩展程序方法,该方法提供回调以向底层画布发出绘制命令。(I80afd)
- withConstraints 尾随 lambda API 已更改。现在,它不是使用两个参数而是使用一个接收器作用域,除了 constraints 和 layoutDirection 之外,还以 Dp 为单位提供 minWidth、maxWidth、minHeight 和 maxHeight 属性(I91b9a、b/149979702)
- 新增了对称内边距修饰符。(I39840)
- 更新了 wrapContentWidth 和 wrapContentHeight,预计会显示垂直或水平 Alignment,而不是任意 Alignment。Gravity 修饰符已更新为接受垂直或水平 Alignment。更新了 Row、Column 和 Stack,以支持自定义的连续 Alignment。(Ib0728)
- ui-text 模块已重命名为 ui-text-core (I57dec)
- 改进了 DrawModifier API:
- 确定了 draw() ContentDrawScope 的接收器范围
- 移除了 draw() 上的所有参数
- DrawScope 的接口与之前的 CanvasScope 接口相同
- ContentDrawScope 具有 drawContent() 方法(Ibaced、b/152919067)
- 已废弃 ColoredRect,请改用
Box(Modifier.preferredSize(width, height).drawBackground(color))。(I499fa、b/152753731) - 将修饰符以及运算符替换成了出厂扩展函数 (I225e4)
- 现在可以在 Row 和 Column 之外访问 RowScope 和 ColumnScope 成员。(I3a641)
- LayoutFlexible 已重命名为 LayoutWeight。“tight”参数已重命名为“fill”。(If4738)
- WithConstraints 获取了 LayoutDirection 参数 (I6d6f7)
- 已将 background 重命名为 DrawBackground 并设置为默认记住 (Ia0bd3)
- 将 ButtonStyle 替换成了不同的函数,并移除了文本(字符串)重载。如需了解使用信息,请参阅更新后的示例。(If63ab、b/146478620、b/146482131)
runOnIdleCompose和runOnUiThread现在是全局函数,而不是 ComposeTestRule 上的方法。(Icbe8f)
外部贡献
- 从 Compose 运行时移植层移除了 Looper 和 Handler 等不需要的 API (I6847d)
- 废弃了没有初始值的
Flow<T>.collectAsState(),改为使用StateFlow<T>或传递明确的初始值。(I63f98、b/157674865)