Compose 运行时

Compose 编程模型和状态管理的基本构建块,以及 Compose 编译器插件的核心运行时。
最新更新 稳定版发布 发布候选版 Beta 发布 Alpha 发布
2025 年 6 月 4 日 1.8.2 - - 1.9.0-alpha04

结构

Compose 是 androidx 中 7 个 Maven Group ID 的组合。每个组都包含目标功能子集,并各自拥有自己的发布说明。

此表解释了各个组以及指向每组发布说明的链接。

说明
compose.animation在其 Jetpack Compose 应用中构建动画,以丰富用户体验。
compose.compiler使用 Kotlin 编译器插件转换 @Composable 函数并启用优化。
compose.foundation使用现成的构建块编写 Jetpack Compose 应用,并扩展基础以构建您自己的设计系统组件。
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 视觉样式和系统 UI 保持一致。
compose.runtimeCompose 编程模型和状态管理的基本构建块,以及 Compose 编译器插件的核心运行时。
compose.uiCompose UI 的基本组件,用于与设备交互,包括布局、绘制和输入。

声明依赖项

要添加对 Compose 的依赖项,您必须将 Google Maven 仓库添加到您的项目。请阅读Google Maven 仓库了解更多信息。

将您所需的构件依赖项添加到应用或模块的 build.gradle 文件中

Groovy

dependencies {
    implementation "androidx.compose.runtime:runtime:1.8.2"
    implementation "androidx.compose.runtime:runtime-livedata:1.8.2"
    implementation "androidx.compose.runtime:runtime-rxjava2:1.8.2"
}

android {
    buildFeatures {
        compose true
    }

    composeOptions {
        kotlinCompilerExtensionVersion = "1.5.15"
    }

    kotlinOptions {
        jvmTarget = "1.8"
    }
}

Kotlin

dependencies {
    implementation("androidx.compose.runtime:runtime:1.8.2")
    implementation("androidx.compose.runtime:runtime-livedata:1.8.2")
    implementation("androidx.compose.runtime:runtime-rxjava2:1.8.2")
}

android {
    buildFeatures {
        compose = true
    }

    composeOptions {
        kotlinCompilerExtensionVersion = "1.5.15"
    }

    kotlinOptions {
        jvmTarget = "1.8"
    }
}

有关依赖项的更多信息,请参阅添加构建依赖项

反馈

您的反馈有助于改进 Jetpack。如果您发现新问题或有改进此库的建议,请告诉我们。在创建新问题之前,请先查看此库中的现有问题。您可以通过点击星形按钮为现有问题投票。

创建新问题

有关更多信息,请参阅问题跟踪器文档

运行时跟踪版本 1.7

版本 1.7.0-rc01

2024 年 9 月 18 日

androidx.compose.runtime:runtime-tracing:1.7.0-rc01 已发布。版本 1.7.0-rc01 包含这些提交

运行时跟踪版本 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-runtimetracing-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 包含这些提交。

新功能

  • 兼容最新版 BenchmarkTracing Perfetto,支持在应用启动时(冷启动)进行 Composition 跟踪,例如在 AndroidX BenchmarkAndroid Studio 中(从 Hedgehog Beta 2 开始)。

API 变更

  • androidx.tracing.perfetto.Trace 重命名为 androidx.tracing.perfetto.PerfettoSdkTrace。(I44af8
  • 使 Tracing Perfetto SDK APIandroid.os.Trace 保持一致。(I73ba0b/282199917
  • 应用启动时跟踪的先决条件。(Iad890
  • 合并了实验性和公共 API 文件(I0f2e1b/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.9

版本 1.9.0-alpha04

2025 年 6 月 4 日

androidx.compose.runtime:runtime-*:1.9.0-alpha04 已发布。版本 1.9.0-alpha04 包含这些提交

API 变更

  • SnapshotStateSet 现在在 Android 上实现了 Parcelable,它现在支持作为 rememberSaveable { ... } 的一部分使用。(I755ddb/378623803
  • SnapshotStateList 现在在 Android 上实现了 Parcelable,它现在支持作为 rememberSaveable { ... } 的一部分使用。(Id18beb/378623803
  • movableContentOf() 现在带有 @RememberInComposition 注解,这允许 lint 捕获不正确的用法(I2738d
  • 更新了实验性组合观察器 API,以允许更全面地观察重新组合的原因(I32b6a

Bug 修复

  • 修复了 onForgotton 调度中的顺序问题,例如,这可能会导致一次性效果的 onDispose 以错误的顺序执行。(Ic1c91b/417450712
  • 修复了可暂停组合中状态处理的重用问题(Ife96eb/404058957
  • 一个小的错误修复,使可变集合检测兼容 K1K2Ie4878
  • 一个小的错误修复,使重写属性访问器上的注解查找兼容 K1K2I9900d

外部贡献

  • 修复了影响 Molecule 用户的一个错误,即使用 RecompositionMode.Immediate 可能会导致重新组合丢失。(I9f3a9b/419527812
  • 公开了 PausableCompositionisAppliedisCancelled getter,允许检查 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 修复

  • 修复了当组合暂停并重新启动时,但一些之前暂停的状态需要重新组合(因为其读取的一些状态在组合暂停期间发生了变化)时的状态重用问题。(I441d1b/416209738
  • 完成了可暂停组合 remember 调度修复(针对问题 b/404058957,之前的修复不完整)。(I1afd4b/404058957
  • SaveableStateHolder.SaveableStateProvider 现在通过组合向其内容提供了 LocalSavedStateRegistryOwner。(Ia2761b/413108878
  • androidx.compose.runtime.saveable 现在依赖于 androidx.lifecycle.runtime.compose。(I53228b/413108878

版本 1.9.0-alpha02

2025 年 5 月 7 日

androidx.compose.runtime:runtime-*:1.9.0-alpha02 已发布。版本 1.9.0-alpha02 包含这些提交

API 变更

  • 已弃用带有自定义 'key' 的 rememberSaveable。它绕过了位置作用域,导致状态错误和不一致的行为(例如,意外的状态共享或丢失,嵌套 LazyLayouts 中的问题)。请删除 'key' 参数以使用位置作用域,从而实现一致的局部作用域状态。有关更多详细信息,请参阅完整的提交消息。(I5e6ffb/357685851

Bug 修复

  • OffsetApplier 现在正确覆盖了随可暂停组合引入的 apply() 方法。缺少此方法可能导致可暂停组合在更新虚拟节点时抛出异常。(Idbf31b/409291131
  • 修复了可能影响 Molecule 用户的死锁问题,即当 FrameClock.withFrameNanos 的挂起调用在帧被调度时被取消时。(I89cabb/407027032
  • 当可移动内容状态仍待丢弃时,Recomposer 可能会进入空闲状态。这通常不会发生,因为可移动内容状态在 Recomposer 的主循环中被丢弃。但是,在可暂停组合中,当可移动内容在 resume() 期间被丢弃时,可能会发生这种情况。(Ie5416b/409267170
  • 在可暂停组合期间,onReuseonDeactivate 的顺序可能会颠倒。现在保证它们按照 onDeactivate/onReuse 的顺序发生。(I996e4b/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 使用更多位编码相同的哈希,这指数级地降低了组合层次结构中两个随机不相关组具有相同哈希键的几率。(I4cb6ab/177562901
  • 使用 Kotlin 2.0 发布的项目需要使用 KGP 2.0.0 或更高版本(Idb6b5
  • @Stable@Immutable@StableMarker 已移动到 runtime-annotation(以兼容方式)。如果您想从不依赖 Compose 的库中使用这些注解,现在可以依赖 runtime-annotation。(I23a16
  • 删除了 onCreatingonDisposing,因为它们已被弃用并重命名为 onPreCreateonPreDispose。此更改完成了重命名。(I97461
  • 公开一个组合局部变量,允许根据组合中 Compose 节点的位置附加 Compose 堆栈跟踪。(Ie0bdab/354163858
  • 引入基于组合中存储的源信息的诊断性 Compose 堆栈跟踪。(I3db9fb/354163858
  • 弃用 runWithTimingDisabled,转而使用 runWithMeasurementDisabled,后者更清晰地描述了行为 - 所有指标均暂停。此外,公开 MicrobenchmarkScope 超类,因为重新声明 runWithMeasurementDisabled 函数以开放访问是不可能的,因为它是一个内联函数。(I9e23bb/389149423b/149979716
  • 添加了 @FrequentlyChangingValue:一个可标记函数和属性 getter 的注解,用于指示它们不应在组合内部直接调用,因为这可能导致频繁的重新组合。例如,用于标记滚动位置值和动画值。相应的 lint 检查会提供警告。(I83630b/234042500
  • 添加了 @RememberInComposition:一个可标记构造函数、函数和属性 getter 的注解,用于指示它们不得在组合内部直接调用,除非它们已被记住。相应的 lint 检查将引发错误。此注解可用于标记返回有状态/可变对象、其身份在组合中保持重要性的对象,或实例化成本高昂且应在组合中缓存的对象。(Ie7db0
  • 添加了一个新的 rememberSaveable 重载,支持使用 KotlinX Serialization 进行类型安全状态持久化的 KSerializer。现有的基于 SaverAPI 仍然受支持。(Iea4abb/376028110

Bug 修复

  • 修复了可暂停组合中 remember 观察器的调度,以避免在同一 apply 中调度已记住/已忘记的。(I570b2b/404645679b/407931790
  • SnapshotObserver 方法 onCreating 重命名为 onPreCreate,将 onDisposing 重命名为 onPreDispose,以符合 API 指南。之前的方法已弃用,新方法默认调用旧方法,因此此接口的现有实现将继续工作,直到方法被删除。这些方法将在 1.9.0 alpha 版本中随后的一个 CL 中删除。它们将在 1.8 稳定版之前从 1.8 beta 版中删除。(I6d753
  • 修复了一个问题,即当重新组合出现在可移动组之后的省略组时,记住的值可能会被错误地遗忘并重新计算。(I62cabb/383769314
  • LaunchedEffectrememberCoroutineScope 中添加了对 Compose 堆栈跟踪的支持(I705c0b/354163858
  • Compose lint 检查现在需要命令行中 AGP 的最低版本为 8.8.2,以及 IDE 支持至少为 Android Studio Ladybug。如果您使用的是旧版 AGP,则可以在 gradle.properties 中设置 android.experimental.lint.version=8.8.2 以升级 Lint 版本,而不会影响 AGP。(I6f2a8

外部贡献

  • AnnotationTarget.FUNCTION 添加到 FunctionKeyMeta 注解中。(I08021

版本 1.8

版本 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 变更

  • SnapshotObserver 方法 onCreating 重命名为 onPreCreate,将 onDisposing 重命名为 onPreDispose,以符合 API 指南。之前的方法已弃用,新方法默认调用旧方法,因此此接口的现有实现将继续工作,直到方法被删除。这些方法将在 1.9.0 alpha 版本中随后的一个 CL 中删除。它们将在 1.8 稳定版之前从 1.8 beta 版中删除。(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 的可抛出对象可能导致“待处理组合未应用”错误的问题。(I356beb/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 转换为 IntLong 来对其执行算术运算。没有原生 Long 类型的平台(例如 JavaScript)应避免高帧率(超过 1000 FPS),否则大约每 24 天会导致 Int 溢出。(Ic3a57

外部贡献

  • 优化 movableContentOf 参数的存储。(ed87177

版本 1.8.0-alpha06

2024 年 11 月 13 日

androidx.compose.runtime:runtime-*:1.8.0-alpha06 已发布。版本 1.8.0-alpha06 包含这些提交

API 变更

  • PausableComposition API 的变更。这些是相对于 1.8.0-alpha 之前版本(自 1.8.0-alpha02 起)的重大变更,但由于这些是 1.8.0 中的新 API,因此未维护向后兼容性,因为这些 API 仍处于 alpha 阶段。(I39819
  • 添加了工具 API,用于观察 Recomposer 中新组合的创建(Iaeb7e
  • Long 类型的 snapshotId 添加到 Snapshot 并弃用 id。快照 IDInt 更改为 Long,以避免在具有非常高帧率和长时间运行动画的系统上快照 ID 溢出。该类型被设置为 expect/actual,以允许在没有原生 Long 类型的平台上此类型可以是 Int 或其他类型。(I38ac3b/374821679

Bug 修复

版本 1.8.0-alpha05

2024 年 10 月 30 日

androidx.compose.runtime:runtime-*:1.8.0-alpha05 已发布。版本 1.8.0-alpha05 包含这些提交

Bug 修复

  • 修复了将 Int.MAX_VALUE 添加到 SnapshotIdSet 时的堆栈溢出问题。(b/370536104Ic4179f6
  • 运行时微优化(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 包含这些提交

性能改进

  • 在构造函数中为状态记录提供快照 ID85c00f
  • 重构 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 通常用于响应组合后发生的事件启动协程。在某些情况下,这些事件可能永远不会发生,导致增加 Job 创建和取消的成本而没有任何好处。
    • 使 rememberCoroutineScope 返回的作用域在访问时惰性创建其 coroutineContext,如果从未用到该作用域,则完全避免 Job 创建和取消。

版本 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 来计算值。
  • 可以通过使用组合局部变量的 currentValue 属性(在计算值的 lambda 内部可访问)来获取组合局部变量的值。这取代了只能在 @Composable 函数中访问的 current。(Iadbc0
  • 新创建的状态对象及其初始状态可立即从其他快照(包括全局快照)中访问。任何后续修改在创建该对象的快照应用之前不可见。
  • mutableStateOf() 及其原始版本的初始状态是作为参数传递给 mutableStateOf() 的值。mutableStateListOf()mutableStateMapOf() 的初始状态为空。
  • 添加了 Snapshot.isInSnapshotSnapshot.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 来计算值。
  • 可以通过使用组合局部变量的 currentValue 属性(在计算值的 lambda 内部可访问)来获取组合局部变量的值。这取代了只能在 @Composable 函数中访问的 current。(Iadbc0

API 变更

  • 新创建的状态对象及其初始状态可立即从其他快照(包括全局快照)中访问。任何后续修改在创建该对象的快照应用之前不可见。
  • mutableStateOf() 及其原始版本的初始状态是作为参数传递给 mutableStateOf() 的值。mutableStateListOf()mutableStateMapOf() 的初始状态为空。
  • 添加了 Snapshot.isInSnapshotSnapshot.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 修复

  • 修复了 providesDefault 处理单个值的问题(538f45
  • 避免 Recomposer 访问帧时钟时出现死锁(07e5c6

版本 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
  • 修复组合器中的内存泄漏(0e097d
  • 重新组合时使用 ScopeMap 传递失效(e19a7e
  • 优化失效映射以仅保留派生状态(f11c44
  • IdentityArraySet 用法替换为 ScatterSetdb572e
  • 优化 ScopeMap 中的 removeScopebb0530

版本 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 包含这些提交。

性能优化

  • 添加在添加子组后创建槽位的功能(b5960c
  • 优化快照状态修改的记录(28c3fe
  • 启用强跳过模式(ed1766

Bug 修复

  • 在内部 remember 中考虑默认参数元数据(096665
  • 在更多情况下使 currentCompoundHashKey 唯一(d4a872
  • 退出内联函数调用时实现组(2a90fc

版本 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 修复

  • 按照与 onForgotten 相同的顺序调用 onRelease 回调。(2cd790
  • 过滤 snapshotFlow 中未观察到的已更改状态。(796b80

版本 1.6.0

2024 年 1 月 24 日

androidx.compose.runtime:runtime-*:1.6.0 已发布。版本 1.6.0 包含这些提交。

自 1.5.0 以来的重要变更

新功能

  • 重新抛出在重新组合循环中被吞噬的异常(4dff9a

性能优化

  • 优化快照状态修改的记录(28c3fe
  • 优化 rememberSaveablef01d79
  • 将派生状态的重新读取推迟到更改记录后(f38099
  • 改进提供组合局部变量值的方式(a337ea

Bug 修复

  • 修复槽位表内存泄漏(73fcfe
  • 跳过将要删除的子组合的重新组合。(Ieeb99b/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 变更

Bug 修复

  • 在上下文中对组合局部作用域状态使用引用策略。(83361c)
  • $dirty 捕获限制为内联 lambda(acfca0)
  • 修复可移动内容有时接收到错误组合局部变量的问题。(035cd6)
  • RecomposeScopeImpl 中使用更快的无分配哈希映射。(d79494)
  • DerivedState 中使用 ObjectIntMap(21862e)
  • DerivedState 中对 int SnapshotThreadLocal 使用 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,以允许使用列表助手的直接索引版本。(I5210cb/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 接口,用于管理子组合的生命周期和重用。(I812d1b/252846775

版本 1.6.0-alpha03

2023 年 8 月 9 日

androidx.compose.runtime:runtime-*:1.6.0-alpha03 已发布。版本 1.6.0-alpha03 包含这些提交。

Bug 修复

  • 修复新的 CompositionLocalProvider 优化(3118e88
  • 纠正可移动内容节点的拆解方式。(5e3d59b

版本 1.6.0-alpha02

2023 年 7 月 26 日

androidx.compose.runtime:runtime-*:1.6.0-alpha02 已发布。版本 1.6.0-alpha02 包含这些提交。

新功能和性能增强

  • 优化 rememberSaveablef01d79
  • 将派生状态的重新读取推迟到更改记录后(f38099
  • 改进提供组合局部变量值的方式(a337ea
  • SideEffect 被标记为 @ExplicitGroupsComposable,以避免生成组。(I74815
  • 在重用时避免比较组合局部映射(782071

API 变更

  • CompositionLocalProviders 添加了一个特殊情况的重载,该重载避免了用于加快提供多个值的开销,但在提供单个值时会产生开销。(I6d640b/288169379

Bug 修复

  • 修复槽位表内存泄漏(73fcfe
  • 修复当 stateSaver 返回 nullrememberSaveable 的恢复方式(90748c

版本 1.6.0-alpha01

2023 年 6 月 21 日

androidx.compose.runtime:runtime-*:1.6.0-alpha01 已发布。版本 1.6.0-alpha01 包含这些提交。

Bug 修复

  • 跳过将要删除的子组合的重新组合。(Ieeb99b/254645321
  • 减少了应用快照时的分配。(I65c09
  • 如果快照未修改,则避免在 DerivedState 中计算 readableHash68c565

版本 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
  • 添加 StateMutableState 的原始版本(fb3d89
  • 添加了 Snapshot.isApplyObserverNotificationPendingI672a5
  • 添加了 State API 的原始版本,允许在 State 对象中跟踪 IntLongFloatDouble 值,而不会因自动装箱而产生性能损失。请使用新的工厂方法 mutableIntState(Int)mutableFloatStateOf(Float) 等来使用这些功能。(I48e43

Bug 修复

  • 跳过将要删除的子组合的重新组合。(Ieeb99b/254645321
  • 不在 ComposerImpl 中保留快照引用(0206f7
  • 不要两次应用组合(f5791b
  • 确保未初始化的派生状态值失效(aa2a92
  • 在组合处理期间调用 onEndChanges。(62cc8c
  • 修复将内容移动到子组合的问题(4beb41
  • 修复潜在死锁(c1a4258edce0
  • 为 Android 窗口创建的重新组合器现在只会在收到 ON_STOP 通知时阻止对 withFrameNanos 的调用,而不是阻止所有组合。这意味着与已停止活动关联的窗口将继续对数据更改进行重新组合,但动画或 withFrameNanos 的任何其他调用者将被阻止。(Id9e7fb/240975572
  • 在处理效果之前为 LayoutNode 执行停用回调 3784073
  • 修复重新启动的 lambda 的更改标志 ea81df9
  • 修复带有节点的 Composable 的实时编辑回归问题 73fd4d8
  • ON_STOP 应暂停帧时钟广播而不是组合 ae276f1
  • 使 SnapshotStateObserver 作用域对未更改的派生状态失效 84d9b1c
  • 修复处理组合时潜在的死锁 28761fc
  • 修复将内容移动到子组合的问题 92d4156
  • 修复重新启动的 lambda 的更改标志(8a03e9
  • 在处理效果之前为 LayoutNode 执行停用回调(8b0fa4
  • 修复结束节点组时 endToMarker() 的问题。(d71d980
  • 停用时使用当前 SlotWriter 组进行检查(a0b518b
  • 移除 SlotTable.moveSlotGapTo() 中的填充并将其移到关闭处(81f9935
  • 修复可移动内容移动时缺失的失效问题(1d7c024
  • 修复移动的可移动内容的即时失效问题(8676618

性能改进

  • 如果快照未修改,则避免在 DerivedState 中计算 readableHash。(307102
  • 减少了分配(I65c09d7ea77727974445808
  • 快速取消 Compose CoroutineScopesa55362bd382f
  • 使用不可访问的状态记录覆盖状态对象的记录(c986960
  • 实现组时使用正确作用域的组合器(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 IDAutoboxingStateCreation。以前,此检查默认对所有项目启用。要在 Android Studio 编辑器和项目 lint 输出中看到此警告,请通过在模块的 build.gradlebuild.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 修复

版本 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
  • 添加 StateMutableState 的原始版本(fb3d89
  • 添加了 Snapshot.isApplyObserverNotificationPendingI672a5

Bug 修复

  • 减少了分配(I65c09d7ea77727974445808
  • 不在 ComposerImpl 中保留快照引用(0206f7
  • 快速取消 Compose CoroutineScopesa55362bd382f
  • 不要两次应用组合(f5791b
  • 确保未初始化的派生状态值失效(aa2a92
  • 在组合处理期间调用 onEndChanges。(62cc8c
  • 修复将内容移动到子组合的问题(4beb41
  • 修复潜在的死锁 (c1a425)
  • ON_STOP 应暂停帧时钟广播而不是组合 (f4a2d1)
  • 修复重新启动的 lambda 的更改标志(8a03e9
  • 在处理效果之前为 LayoutNode 执行停用回调(8b0fa4

外部贡献

  • 添加了 Snapshot.isApplyObserverNotificationPendingI672a5

版本 1.5.0-alpha04

2023 年 5 月 10 日

androidx.compose.runtime:runtime-*:1.5.0-alpha04 发布。版本 1.5.0-alpha04 包含以下提交。

API 变更

  • 添加了 State API 的原始版本,允许在 State 对象中跟踪 IntLongFloatDouble 值,而不会因自动装箱而产生性能损失。请使用新的工厂方法 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 的调用,而不是阻止所有组合。这意味着与已停止活动关联的窗口将继续对数据更改进行重新组合,但动画或 withFrameNanos 的任何其他调用者将被阻止。(Id9e7fb/240975572

Bug 修复

  • 修复快照列表和映射中潜在的死锁 5c1a425
  • 在处理效果之前为 LayoutNode 执行停用回调 3784073
  • 修复重新启动的 lambda 的更改标志 ea81df9
  • 修复带有节点的 Composable 的实时编辑回归问题 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
  • 实现组时使用正确作用域的组合器(9a5e5b6
  • 修复结束节点组时 endToMarker() 的问题。(d71d980
  • 停用时使用当前 SlotWriter 组进行检查(a0b518b
  • 使用 IdentityArraySet 存储快照失效(7f60cca
  • 移除 SlotTable.moveSlotGapTo() 中的填充并将其移到关闭处(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)
  • 允许 Modifier.Nodes 通过实现 CompositionLocalConsumerModifierNode 接口来读取 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

  • 如果对状态记录进行并发直接写入,将内容添加到 SnapshotStateListSnapshotStateMap 可能会遇到死锁。由于 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 以观察组合节点的生命周期。8b6a258
  • 添加 parameterTypes 属性到 ComposableMethod 7b6c7ad

错误修复和性能改进

  • 清除 SnapshotStateObserver 中的两个作用域索引 29f4a3e
  • 在不可跳过 Lambda 的主体中添加所需的组 7d06752
  • 改进快照状态的内存引用特性 93fcae8
  • 在组合局部查找中移除装箱 0875717
  • 为不可重用节点组使用正确的键 6388d8d
  • 保护 SnapshotStateObserver 免受递归和并发应用的影响 98cb6ba
  • IdentityArraySet "get" 方法中添加了检查索引边界的检查 35a77d3
  • 更新 Compose 模块以使用 ViewTreeLifecycleOwner 扩展 21c2122
  • 在 Recomposer 完成帧后发送应用通知。98f2641
  • 修复取消 Recomposer 时索引越界崩溃的问题 8f8656f
  • 如果 Composition 的父级提供者已更改,始终强制重新组合 9526fcc
  • Recomposer 对已取消 Job 的容忍度 a55f7ed
  • 改进对大量组合器的失效处理 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-beta02androidx.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 修复

  • 移除组合局部查找中的装箱 (62f66a)
  • 改进快照状态的内存引用特性 (dfb451)

版本 1.4.0-alpha05

2023 年 1 月 25 日

androidx.compose.runtime:runtime:1.4.0-alpha05androidx.compose.runtime:runtime-saveable:1.4.0-alpha05 发布。版本 1.4.0-alpha05 包含以下提交。

API 变更

  • 内联/已弃用-隐藏函数的更多类型/可空性 (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 变更

  • SnapshotStateListSnapshotStateMap 现在分别具有 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

运行时修复

快照系统

版本 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 包含以下提交。

行为破坏性更改

  • rememberrememberCoroutineScope 的参数已更改为 crossinline。这将报告早期返回的错误,而不是允许早期返回导致稍后的内部错误。
  • 此更改可能会导致报告新的编译器错误,要求从传递给这些函数的 lambda 中移除非局部返回。( Ibea62)

版本 1.3.0-beta02

2022 年 9 月 7 日

androidx.compose.runtime:runtime-*:1.3.0-beta02 发布。版本 1.3.0-beta02 包含以下提交。

Bug 修复

版本 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 修复

  • 修复了 androidx.compose.ui.platform.RenderNodeLayer.updateDisplayList 中的内存泄漏:处置由透明快照创建的嵌套快照 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 中引入了一些功能,并有许多稳定的错误修复。最重要的新功能是引入了 movableContentOf API,可用于启用共享元素转换等复杂 UX。movableContentOf API 将可组合 lambda 转换为一个 lambda,该 lambda 会将其状态和相应的节点移动到它被调用的任何新位置。当之前的调用离开组合时,状态会暂时保留,如果对 lambda 的新调用进入组合,则状态和相关节点将移动到新调用的位置。如果没有添加新的调用,状态将被永久移除,并通知 remember 观察器。

  • 如果 movableContentOf lambda 在同一组合中被多次调用,则为每个调用创建新的状态和节点,并且随着调用离开组合和新调用进入,状态将按照调用顺序从第一个离开的调用移动到进入的调用。所有未被新调用声明的状态都将被永久移除。

  • 除了这些和其他一些新功能外,还花费了大量时间来稳定运行时和快照状态系统。移除了各种内存泄漏并优化了代码路径。

  • 以下是更改摘要列表

1.2 中的新功能

1.2 中的性能

1.2 中的错误修复

版本 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)
  • @ComposableTarget 注解和由 @ComposableTargetMarker 标记的注解现在可以使用 @file 前缀在文件范围内使用。在文件范围内使用目标注解将使编译器假定文件中的所有可组合函数都旨在定位关联的应用程序。例如,使用 @file:UiComposable 声明所有 @Composable 函数都定位 Compose UI 应用程序。需要定位另一个应用程序的函数必须显式提供所需应用程序的目标标记注解。( I40804)

版本 1.2.0-alpha08

2022 年 4 月 20 日

androidx.compose.runtime:runtime-*:1.2.0-alpha08 发布。版本 1.2.0-alpha08 包含以下提交。

API 变更

  • 添加 TracingInProgressCompositionTracer 接口。( Ic6f12)
  • 向 Composer 添加 recomposeScopeIdentity (I0c873)
  • 将追踪 API (Composer.setTracer) 限制为 OptIn(InternalComposeTracingApi)。( 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 coroutines 1.6.0 (I3366d)

版本 1.2.0-alpha04

2022 年 2 月 23 日

androidx.compose.runtime:runtime-*:1.2.0-alpha04 发布。版本 1.2.0-alpha04 包含以下提交。

API 变更

  • 添加了 ComposableTargetComposableTargetMarkerComposableOpenTarget,允许在编译时报告可组合函数被调用以定位非其设计使用的应用程序的情况。

    在大多数情况下,注解可以由 Compose 编译器插件推断,因此直接使用这些注解应该很少见。无法推断的情况包括创建和使用自定义应用程序、抽象可组合函数(例如接口方法)、作为可组合 lambda 的字段或全局变量(局部变量和参数被推断)、或使用 ComposeNode 或相关的可组合函数时。

    对于自定义应用程序,调用 ComposeNodeReusableComposeNode 的可组合函数需要为函数和任何可组合 lambda 参数类型添加 CompoableTarget 注解。但是,建议创建使用 ComposableTargetMarker 注解的注解,然后使用标记的注解而不是直接使用 ComposableTarget。使用 ComposableTargetMarker 标记的可组合注解等效于 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 会将其状态和相应的节点移动到它被调用的任何新位置。当之前的调用离开组合时,状态会暂时保留,如果对 lambda 的新调用进入组合,则状态和相关节点将移动到新调用的位置。如果没有添加新的调用,状态将被永久移除,并通知 remember 观察器。

    如果 movableContentOf lambda 在同一组合中被多次调用,则为每个调用创建新的状态和节点,并且随着调用离开组合和新调用进入,状态将按照调用顺序从第一个离开的调用移动到进入的调用。所有未被新调用声明的状态都将被永久移除。( Ib4850)

  • 添加了组合追踪 API,使工具能够提供更详细的可组合函数追踪。编译器现在生成对追踪 API 的调用,其中包含源信息。( Ib0eb5)

    要从发布版本中移除这些调用和相关的源信息,请添加以下 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 修复

版本 1.1.0

2022 年 2 月 9 日

androidx.compose.runtime:runtime-*:1.1.0 发布。版本 1.1.0 包含以下提交。

自 1.0.0 以来重要更改

  • 稳定支持 Android 12 Overscroll 效果
  • 改进触摸目标大小
  • 请注意,相对于 Compose 1.0,Material 组件将扩展其布局空间以满足 Material 无障碍指南中关于触摸目标大小的要求。例如,Button 的触摸目标将扩展到至少 48x48dp 的最小尺寸,即使您将 Button 的尺寸设置得更小。这使 Compose Material 与 Material Design 组件的行为保持一致,如果您混合使用 View 和 Compose,则提供一致的行为。此更改还确保当您使用 Compose Material 组件创建 UI 时,将满足触摸目标可访问性的最低要求。
  • 稳定支持 Navigation Rail
  • 将许多以前的实验性 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 编译器现在支持旧版本的 Compose Runtime (1.0)。在此更改之前,Compose 编译器仅兼容相同版本或更高版本的 Compose Runtime。此更改之后,Compose 编译器兼容旧版本的 Compose Runtime (1.0)。(aosp/1796968)
  • 更新 Compose 1.1.0-alpha03 以依赖 Kotlin 1.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 和 AGP 7.1 中修复。( b/194289155)

版本 1.0.0-rc02

2021 年 7 月 14 日

androidx.compose.runtime:runtime-*:1.0.0-rc02 发布。版本 1.0.0-rc02 包含以下提交。

  • 修复了 SnapshotStateObserver 中的竞争条件,该条件导致零星的 NullPointerExceptions。( 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 中指定。该文件每行指定一条规则,其中规则是用于匹配库中的方法或类的模式。这些规则的语法是人类可读的 ART 配置文件格式的超集,该格式在使用 adb shell profman --dump-classes-and-methods ... 时使用。这些规则有两种形式,分别用于定位方法或类。

  • 方法规则将具有以下模式

    <FLAGS><CLASS_DESCRIPTOR>-><METHOD_SIGNATURE>
    
  • 类规则将具有以下模式

    <CLASS_DESCRIPTOR>
    
  • 其中 <FLAGS> 是字符 HSP 中的一个或多个,用于指示此方法是否应标记为“热”(Hot)、“启动”(Startup)或“启动后”(Post Startup)。

  • <CLASS_DESCRIPTOR> 是目标方法所属类的描述符。例如,类 androidx.compose.runtime.SlotTable 的描述符将为 Landroidx/compose/runtime/SlotTable;

  • <METHOD_SIGNATURE> 是方法的签名,包括方法的名称、参数类型和返回类型。例如,LayoutNode 上的方法 fun isPlaced(): Boolean 的签名为 isPlaced()Z

  • 这些模式可以包含通配符(***?),以便单个规则可以涵盖多个方法或类。

这些规则有什么作用?

  • 带有标志 H 的方法表示此方法是“热”方法,应提前编译。

  • 带有标志 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)
  • ControlledComposition API 更改,以实现在一次重新组合中重新组合更改。( 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,允许在源代码最小化期间删除编译器生成的源信息。( 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 修复

  • 在此更改之前,局部可组合函数是根据其参数可跳过的。在此更改之后,没有局部可组合函数会跳过。此更改是因为局部函数通常和预期会从父级捕获参数,并且它们跳过是常见的错误源。

    总而言之,考虑以下示例

    @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 的情况下调用 withFrameNanosRecomposer.runRecomposeAndApplyChanges 将抛出 IllegalStateException。( I4eb0d)

版本 1.0.0-beta02

2021 年 3 月 10 日

androidx.compose.runtime:runtime-*:1.0.0-beta02 发布。版本 1.0.0-beta02 包含以下提交。

Bug 修复

版本 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)
  • compositionLocalOfstaticCompositionLocalOfdefaultFactory 现在是必需的,而不是可选的。

    此更改消除了在未提供默认工厂时非空类型可能出现的潜在类型错误。以前,这会为非空类型提供空引用。

    对于可空类型,请考虑提供 { null } 作为默认工厂。

    我们不建议使用非空类型的局部变量,除非可以提供合理的默认值。如果不存在合理的默认值,则 defaultFactory lambda 应抛出异常。然而,抛出异常意味着局部变量的消费者将隐式依赖于它的提供,而这不被类型系统强制执行。( Ifbd2a)

  • 已从 Compose 运行时中移除已弃用的符号 (I3252c)

  • 已移除已弃用的 emptyContent()。请改用 {}。( Idb33f, b/179432510)

  • Providers 已重命名为 CompositionLocalProvider

    • Composition 构造函数不再接受键参数,并且已弃用。
    • currentCompositeKeyHash 已转换为可组合的顶级属性,而不是可组合的顶级函数。
    • CompositionData 和 CompositionGroup 已移至 androidx.compose.runtime.tooling 命名空间
    • ComposableLambda 已成为接口而非具体类,并且不再具有类型参数。
    • ComposableLambdaN 已成为接口而非具体类,并且不再具有类型参数。
    • snapshotFlow 函数已移至 androidx.compose.runtime 命名空间
    • SnapshotMutationPolicy 的 merge 方法不再是实验性功能
    • 已移除 @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 参数移到 selectedonClick 之后。
    • 将 BottomNavigationItem 中的 alwaysShowLabels 参数重命名为 alwaysShowLabel
    • 将一些组件中的 bodyContent 参数重命名为 content
    • 重新排序了 ButtonDefaults.buttonColors() 中的参数。请注意,由于参数的类型未更改,这不会导致您的代码出错 — 请确保您使用命名参数或手动更新顺序,否则您的代码将无法像以前一样工作。
    • 已向 darkColors() 添加 secondaryVariant 参数。在深色主题中,此颜色通常与 secondary 相同,但为了保持一致性和进一步自定义而添加。
    • 已将 ElevationDefaults 和 animateElevation() 从公共 API 表面移除,因为它们不常用/不实用。
    • 已将 Slider 中的 onValueChangeEnd 重命名为 onValueChangeFinished 并使其可为空。
    • 已将 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 变更

  • 对 ViewGroups 的支持已从 UiApplier 中移除。已移除弃用的 emitView 可组合项。( Ifb214 )
  • CompositionReference 重命名为 CompositionContext ( I53fcb )
  • ComponentActivity.setContent 已移至 androidx.activity:activity-compose 模块中的 androidx.activity.compose.setContent。( Icf416 )
  • Snapshot API 已更新,以更符合 API 指南,并从公共 API 中隐藏了内部实现类。( Id9e32 )
  • 已重命名 Ambients 以匹配 Ambient -> CompositionLocal 的重命名。Ambients 以前被命名为 AmbientFoo,现在 CompositionLocals 被命名为 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 )

  • snapshotFlowwithMutableSnapshot 不再是实验性功能。( 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 的动画计时会暂停。( I38e11 )

  • Recomposer.runningRecomposers 现在提供了一个全局 StateFlow,包含只读 RecomposerInfo,用于观察进程中正在进行的组合状态。优先使用此 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 和 DisposableEffect API ( If760e )
  • emit() API 及所有重载已弃用并重命名为 ComposeNode。这些 API 是相同的,只是名称不同,以遵循 Compose 的命名约定。( I4137b )
  • invalidate 和 compositionReference() 现已弃用,取而代之的分别是 currentRecomposeScope 和 rememberCompositionReference。( I583a8 )
  • RememberObserver 替代了 CompositionLifecycleObserver,CompositionLifecycleObserver 现已弃用。

    RememberObserverCompositionLifecycleObserver 的替代品,具有修改后的语义和重命名的方法。对于仅被记住一次的对象(这是且仍然是推荐的做法),可以机械地更改为新的 API。然而,如果一个引用在一个组合中被记住多次,那么 onRemembered 会为每个引用调用,而 onEnter 只会被调用一次。如果对象在子组合中使用(例如 WithConstraintsScaffold),onEnter 会被多次调用,这使得单个 onEnter 调用的保证不可靠,因此在 RememberObserver 中已将其移除。

    RememberObserver 添加了 onAbandoned,如果 RememberObserver 实例从传递给 remember 的回调中返回,但未在组合状态中被记住,因此永远不会调用 onRemembered,则会调用此方法。这可能发生在以下情况:异常在完成之前终止组合,或者组合被丢弃,因为其正在为其生成组合的状态不再是当前状态或不再需要。如果遵循上述单引用建议的 RememberObserver 实例正在跟踪外部资源,则 onForgottenonAbandoned 都表明该资源不再需要。如果对象正在跟踪 onRemembered 中启动的工作或分配的资源,则可以忽略 onAbandoned,因为它在 onRemembered 被调用时不会被调用。( 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 获得。这通常可以通过将包含此类依赖的代码封装在 SideEffect 可组合项中来解决,以将代码的执行推迟到节点创建和初始化之后。( I018da )

API 变更

  • 添加了一种跟踪 recomposer 是否已应用更改的方法。( I1b3e2 )
  • 扩展 [Abstract]ComposeView API,允许回收基于 Compose 的视图,处置其组合以便稍后重新创建。添加用于安装和发现窗口范围 Recomposers 和 CompositionReferences 的 API,以创建子组合。

    添加 ViewCompositionStrategy 以配置 [Abstract]ComposeViews 的组合处置策略;默认行为是在窗口分离时处置。( I860ab )

Bug 修复

  • Recomposer 现在公开其当前状态的 Flow,允许监视其活动和相关效果的活动。( Ifb2b9 )
  • 原生 keyEvent 现在可以通过 keyEvent.nativeKeyEvent 访问。( 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。这些以前被标记为 InternalComposeAPI。现在它们是 compose 模块的内部组件。

    CompositionData 和 CompositionGroup 已添加,作为 ui-tooling API 的替代品,用于提取组合信息。这些是公共的,但不打算在 ui-tooling API 之外使用,因为它们提供了 ui-tooling API 解释的原始信息。( I31a9c )

  • Applier 类不再被认为是 ( Id85b0 )

  • Applier 接口已更改,以简化自下而上而非自上而下构建树。

    insert() 方法已重命名为 insertTopDown()

    添加了一个新方法 insertBottomUp()

    applier 会根据性能选择使用 insertTopDown()insertBottomUp() 将节点插入其正在编辑的树中。

    某些树(如 LayoutNodeView)自下而上构建比自上而下构建效率更高。在此更改之前,需要插入堆栈来实现自下而上的构建,并且为了性能,需要将堆栈复制到每个需要自下而上构建的 applier。通过此更改,Applier 将覆盖 insertBottomUp() 以自下而上地构建树,并覆盖 insertTopDown() 以自上而下地构建树。( Icbdc2 )

  • Compose 支持可以进行可组合调用的属性获取器。对这方面的支持不会取消,但声明属性获取器为 @Composable 的语法正在改变。

    现在弃用的语法是直接注解属性本身

        @Composable val someProperty: Int get() = ...
    

    现在正确的语法是注解属性的获取器

       val someProperty: Int @Composable get() = ...
    

    两种语法都将在一段时间内有效,但前一个弃用的语法最终将成为编译错误。( Id9197 )

Bug 修复

版本 1.0.0-alpha08

2020 年 12 月 2 日

androidx.compose.runtime:runtime-*:1.0.0-alpha08 已发布。版本 1.0.0-alpha08 包含以下提交。

API 变更

  • 添加了可组合 lambda 参数命名和位置的 lint 检查,以检查与 Compose 准则的一致性。此外,根据 lint 检查和指南,一些使用 children 作为尾随 lambda 名称的 API 已迁移到 content。( Iec48e )
  • Recomposer 不再接受 EmbeddingContext;所需的调度依赖项从 effectCoroutineContext 中获取。FrameManager 已弃用;平台集成应初始化其自己的全局快照处理。( I02369 )
  • RestorableStateHolder.withRestorableState 函数已重命名为 RestorableStateProvider ( I66640 )

Bug 修复

  • 已弃用以 Ambient 为后缀命名的 Ambients,并根据其他 Ambients 和 Compose API 指南,将其替换为以 Ambient 为前缀的新属性。( 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 作为 provide 的替代方案,用于提供 ambients,并且它可以用于指定仅在没有 ambient 值已提供的情况下才设置的 ambient 值。( Id6635, b/171024925 )
  • LaunchedTask 已重命名为 LaunchedEffect,以与 SideEffect 和 DisposableEffect API 保持一致。不允许使用无主体参数的 LaunchedEffect,以鼓励最佳实践。( Ifd3d4 )
  • Applier 现在有 onBeginChanges/onEndChanges 回调,这些回调在 Composer 开始/完成向树应用更改时调用。这些可用于批量资源管理(如果需要)。( Icf476 )
  • Recomposer 现在在构造时需要一个 CoroutineContext ( Ic4610 )
  • 对内部 SlotTable 实现的更改,不应影响公共 API。( 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 )
  • 添加了 DisposableEffect 对应 API 到 SideEffect,扮演带有参数的 onCommit 的角色,但需要一个 onDispose。
    • 添加了 rememberUpdatedState API,用于将数据从重组发布到正在进行或长期存在的进程,例如 DisposableEffects 或 LaunchedTasks。
    • ( Id50b9 )
  • MutableVector 现在实现 RandomAccess ( I85d73, b/170461551 )
  • 添加了 SideEffect 可组合项,用于将组合的副作用应用于由组合管理的对象。SideEffect 旨在替代 onCommit 可组合项。( Ia77c2 )
  • 新的实验性 API RestorableStateHolder。它允许在处置子树之前保存使用 [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 )
  • 通过在每次滚动时减少子组合中的工作量,提高了 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 不再实现 MonotonicFrameClockwithFrameNanos 的调用者应显式导入顶级函数。( 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 变更

  • 添加 snapshotFlowwithMutableSnapshot API,用于消费和生成 Snapshot 数据更改。( I3e722 )
  • 可组合函数的调用约定已更改。这是一项二进制破坏性更改。所有库都必须重新编译才能与此版本的 compose 编译器插件一起使用。

    此更改不会造成源代码级别的破坏性更改,因为唯一更改的 API 是需要显式选择加入的编译器 API。( I7afd2, b/158123185 )

  • 从 EmbeddingContext 中移除了调度方法 ( I7b9be )

  • onPreCommit 已弃用;onCommit 现在具有 onPreCommit 的行为。

    onCommit 和 onActive 现在在提交组合更改的相同渲染帧中运行,而不是在下一个渲染帧开始时运行。( 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 变更

  • 自定义 emits 现在可以声明其一个或多个 setter 可以跳过并独立于 emit 进行重组。( Ibbd13 )
  • 已移除弃用的 FrameManager 调用。

    内部 Compose API 已更改,以减少跟踪 mutableStateOf() 等状态对象的开销。( I80ba6 )

  • 为了清晰起见,state { ... } 可组合项现已弃用,请改为显式调用 remember { mutableStateOf(...) }。这减少了整体 API 表面和状态管理的概念数量,并与类属性委托的 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。请注意,将来将不再支持直接组合 Views 和 ViewGroups,除非它们是组合树中的叶子,在这种情况下可以使用 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() 的类(例如数据类)可能会出现性能下降,因为它们的 equals() 方法现在默认在赋值给 mutableStateOf() 时被调用。

    通过向 mutableStateOf()ambientOf()savedInstanceStateOf() 的调用添加策略参数 policy = referentialEqualityPolicy(),可以恢复以前的行为。( Ic21a7 )

  • RowColumn 现在是内联函数,大大减少了使用它们的开销。( 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 表面区域和我们需要教授的概念
    • 更接近其他可比的工具包(Swift UI、React、Flutter)
    • 可逆的决定。我们以后总可以重新引入 @Model
    • 移除了需要处理的 @Model 配置中的边缘用例和难以回答的问题
    • @Model 数据类、equals、hashcode 等。
    • 如何让某些属性“被观察”而另一些不被观察?
    • 如何指定观察中使用的结构相等性与引用相等性?
    • 减少系统中的“魔法”。这将降低人们假设系统比实际更智能的可能性(例如,它知道如何比较列表)
    • 使观察的粒度更直观。
    • 提高了从变量到类属性的重构能力
    • 潜在地开启了手动定制特定于状态的优化的可能性
    • 与生态系统的其余部分更紧密对齐,并减少了对不可变或我们“接受可变状态”的歧义

    迁移说明

    几乎所有 @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 的属性委托和 mutableStateOf API 使这种方法更容易,它允许您在组合之外创建 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 个参数的函数,附加参数是 Composer、一个“键”整数和用于通过调用传播元数据的位掩码整数。

    Compose 现在还会将默认参数转换为可组合函数。它这样做时不会引入函数本身的额外合成默认重载,因此此更改将导致定义的函数更少。

    由此产生的已知有意行为更改

    1. 某些调用会跳过,而以前不会。
    2. 默认参数表达式中的可组合表达式现在已正确订阅和处理

    这项工作包含一些优化:1. 参数比较的结果通过调用图传播到其他可组合函数。这将导致运行时比较次数减少,插槽表大小减小,以及跳过更多以前未跳过的可组合函数。2. 在编译时确定为“静态”的参数不再在运行时进行比较或存储。这减少了比较次数并减小了插槽表大小。3. 函数体内的控制流结构用于最小化生成的组的数量。这减小了插槽表大小并减少了运行时的开销。4. 如果函数中未使用的调度和接收器参数未在函数体内部使用,则不将其包含在确定函数可跳过性中。

    大多数破坏性更改针对的是编译器直接目标的 API,Compose 的典型使用不会受到影响:1. Composer::startExpr 已移除 2. Composer::endExpr 已移除 3. Composer::call 已弃用 4. key 的非变长参数重载已移除。今后请使用变长参数版本。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 )

  • 暂时移除了 StableMutableListStableMutableMap,以避免 Compose 所需的 Kotlin 版本中的问题。一旦 Compose 更新到没有该问题的 Kotlin 版本,这些接口将重新引入。

    SnapshotStateListSnapshotStateMap 现已公开,但一旦 StableMutableListStableMutableMap 恢复,它们将被弃用。( Ia7769 )

  • 添加顶级 withFrameNanos 函数用于动画计时 ( Ie34c5 )

  • @Untracked 注解已弃用。请替换为 @ComposableContract(tracked=false) ( Id211e )

  • RestartableFunction 和相关 API 已重命名为 ComposableLambda 等。这些 API 仅由编译器针对,因此通常不应影响源代码级别的兼容性。重命名主要是为了在堆栈跟踪中更好地传达此类的用途。( I7eb25 )

  • @Composable 注解不再对类有效。( Ia5f02 )

  • Ambient<T> 现在是 @Stable 而不是 @Immutable ( I0b4bb )

  • 在此更改之前,如果存在,Compose 编译器插件会非平凡地拦截 @Composable 函数内部对构造函数的调用。( I5205a, b/158123804 )

  • Recompose 可组合项不再是一个有用的抽象。大多数重组应由 MutableState 赋值引起。除此之外,建议使用 invalidate 函数触发当前范围的重组。( Ifc992 )

  • Observe 不再是一个有用的抽象。如果您需要复制它,可以通过简单地创建一个执行可组合 lambda 参数的可组合函数来复制其实现。例如,@Composable fun Observe(body: @Composable () -> Unit) = body() ( I40d37 )

  • @Direct 已弃用,取而代之的是 @ComposableContract(restartable=false) ( If4708 )

  • 为最近引入的 StateFlow 添加了一个适配器,它允许我们预填充初始值,以便返回的 State 为非空。( I61dd8, b/156233789 )

  • 为 Flow 添加了一个适配器。用法示例:val value by flow.collectAsState() ( If2198, b/153375923 )

  • [Mutable]State 属性委托运算符已移至扩展,以支持 Kotlin 1.4 属性委托优化。调用者必须添加导入才能继续使用 by state { ... }by mutableStateOf(...)。( I5312c )

  • androidx.compose.ViewComposer 已移至 androidx.ui.node.UiComposer。androidx.compose.Emittable 已移除。它与 ComponentNode 重复。androidx.compose.ViewAdapters 已移除。它们不再是受支持的用例。Compose.composeInto 已弃用。请改用 setContentsetViewContent。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 并非总是最佳默认值,例如,当您有一个列表时,最好从 emptyList() 或任何其他合理的默认值开始。( I00025, b/161348384 )

  • 添加了 ui-rxjava2 - 带有 RxJava2 适配器的新工件。用法示例:val value by observable.subscribeAsState() ( Ifab4b, b/153369097 )

  • savedInstanceState() 现在可以与可空类型一起使用 ( 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,转而使用 Modifier 上的 drawBackground 扩展 API。重构了颜色、画刷和绘制背景的实现,以减少代码路径并消除将 Modifier 作为组合一部分创建的要求。( I0343a )
  • 更新了暴露 Canvas 的更高级 Compose API,转而暴露 CanvasScope。这消除了消费者维护自己 Paint 对象的需要。对于仍需要访问 Canvas 的消费者,他们可以使用 drawCanvas 扩展方法,该方法提供回调以使用底层 Canvas 发出绘图命令。( I80afd )
  • WithConstraints 尾随 lambda API 已更改。现在它不再有两个参数,而是有一个接收器范围,除了约束和布局方向外,还以 Dp 单位提供 minWidth、maxWidth、minHeight 和 maxHeight 属性。( I91b9a, b/149979702 )
  • 添加了对称内边距修饰符。( I39840 )
  • 更新了 wrapContentWidth 和 wrapContentHeight,以期望垂直或水平对齐,而不是任何对齐方式。gravity 修饰符已更新为接受垂直或水平对齐。Row、Column 和 Stack 已更新为支持自定义连续对齐。( 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 )
  • 将 Modifier 加号运算符替换为工厂扩展函数 ( I225e4 )
  • RowScope 和 ColumnScope 成员现在可以在 Row 和 Column 之外访问。( I3a641 )
  • LayoutFlexible 重命名为 LayoutWeight。tight 参数重命名为 fill。( If4738 )
  • WithConstraints 获得了 LayoutDirection 参数 ( I6d6f7 )
  • 将 background 重命名为 DrawBackground 并使其默认可记忆。( Ia0bd3 )
  • 将 ButtonStyle 替换为不同的函数,并移除了 text(字符串)重载。有关用法信息,请参阅更新后的示例。( If63ab, b/146478620, b/146482131 )
  • runOnIdleComposerunOnUiThread 现在是全局函数,而不是 ComposeTestRule 上的方法。( Icbe8f )

外部贡献

  • 从 Compose 运行时移植层中移除不必要的 API,例如 Looper 和 Handler ( I6847d )
  • 弃用没有初始值的 Flow<T>.collectAsState()。请改用 StateFlow<T> 或传递显式初始值。( I63f98, b/157674865 )