Compose Runtime

Compose 编程模型和状态管理的基本构建块,以及 Compose 编译器插件的目标核心运行时。
最近更新时间 稳定版 候选版 Beta 版 Alpha 版
2024 年 3 月 6 日 1.6.3 - - 1.7.0-alpha04

结构

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.runtimeCompose 编程模型和状态管理的基本构建块,以及 Compose 编译器插件的目标核心运行时。
compose.ui与设备互动所需的 Compose UI 的基本组件,包括布局、绘图和输入。

声明依赖项

如需添加 Compose 的依赖项,您必须将 Google Maven 制品库添加到项目中。如需了解详情,请参阅 Google 的 Maven 制品库

在应用或模块的 build.gradle 文件中添加所需工件的依赖项:

Groovy

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

android {
    buildFeatures {
        compose true
    }

    composeOptions {
        kotlinCompilerExtensionVersion = "1.5.10"
    }

    kotlinOptions {
        jvmTarget = "1.8"
    }
}

Kotlin

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

android {
    buildFeatures {
        compose = true
    }

    composeOptions {
        kotlinCompilerExtensionVersion = "1.5.10"
    }

    kotlinOptions {
        jvmTarget = "1.8"
    }
}

如需详细了解依赖项,请参阅添加 build 依赖项

反馈

您的反馈将帮助我们改进 Jetpack。如果您发现了新问题,或对此库有任何改进建议,请告诉我们。创建新问题前,请先查看此库中的现有问题。您可以点击星标按钮,为现有问题投票。

创建新问题

如需了解详情,请参阅问题跟踪器文档

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 和 tracking-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 中包含这些提交内容

新功能

  • 与最新版本的 Benchmark 和 Tracing Perfetto 兼容,从而在应用启动(冷启动)时(例如在 AndroidX Benchmark 和 Android Studio 中,从 Hedgehog Beta 2 开始)支持组合跟踪。

API 变更

  • androidx.tracing.perfetto.Trace 已重命名为 androidx.tracing.perfetto.PerfettoSdkTrace。(I44af8
  • 使 Tracing Perfetto SDK API 与 android.os.Trace 保持一致。(I73ba0b/282199917
  • 在应用启动时进行跟踪的前提条件。(Iad890
  • 合并了实验性 API 和公共 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.7

版本 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 用法替换为 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 中包含这些提交内容

效果优化

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

bug 修复

  • 考虑固有记忆 (096665) 中的默认参数元
  • 使 currentCompoundHashKey 在更多情况下具有唯一性 (d4a872)
  • 退出内嵌函数调用时实现组 (2a90fc)

版本 1.6

版本 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)
  • 优化 rememberSaveable (f01d79)
  • 推迟重新读取派生状态,直到记录了更改 (f38099)
  • 改进了提供组合本地值的方式 (a337ea)

bug 修复

  • 修复了槽表内存泄漏 (73fcfe)
  • 跳过对要移除的子组合的重组。(Ieeb99b/254645321
  • 仅当 RememberObserver 存储在 remember 计算中时触发生命周期。(f6b4dc)
  • $dirty 捕获限制为内嵌 lambda。(acfca0)
  • 修复了可移动内容有时会收到错误 CompositionLocal 的问题。(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)
  • 修复了可移动内容有时会收到错误 CompositionLocal 的问题。(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 中包含这些提交内容

新功能和性能增强

  • 优化 rememberSaveable (f01d79)
  • 推迟重新读取派生状态,直到记录了更改 (f38099)
  • 改进了提供组合本地值的方式 (a337ea)
  • SideEffect 被标记为 @ExplicitGroupsComposable 以避免生成组。(I74815
  • 避免比较重复使用的本地合成地图 (782071)

API 变更

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

bug 修复

  • 修复了槽表内存泄漏 (73fcfe)
  • 修复了在 stateSaver 返回 null 时恢复 rememberSaveable 的方式 (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 中计算 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)
  • 添加了 State API 的基本版本,允许在 State 对象中跟踪 Int、Long、Float 和 Double 值,而不会因自动装箱问题而受到影响。若要使用这些新工厂方法,请使用新的工厂方法 mutableIntState(Int)mutableFloatStateOf(Float) 等。(I48e43

bug 修复

  • 跳过对要移除的子组合的重组。(Ieeb99b/254645321
  • 不在 ComposerImpl 中保留快照引用 (0206f7)
  • 请勿应用两次组合 (f5791b)
  • 确保未初始化的派生状态值失效 (aa2a92)
  • 在组合处理期间调用 onEndChanges。(62cc8c)
  • 修复了将内容移至子组合的问题 (4beb41)
  • 修复了潜在的死锁问题(c1a4258edce0
  • 现在,在收到 ON_STOP 通知时,为 Android 窗口创建的 Recomposer 只会屏蔽对 withFrameNanos 的调用,而非所有组合。这意味着,与已停止的 activity 相关联的窗口将继续因数据更改而重组,但动画或 withFrameNanos 的任何其他调用方将阻塞。(Id9e7fb/240975572
  • 在处置效果之前对 LayoutNode 执行停用回调 3784073
  • 修复了重启的 lambda 中已更改的标志 ea81df9
  • 修复了包含节点 73fd4d8 的可组合项的实时编辑回归问题
  • ON_STOP 应暂停帧时钟广播,而不是组合 ae276f1
  • 让未更改的派生状态 84d9b1cSnapshotStateObserver 范围失效
  • 修复了处理组合时潜在的死锁问题 28761fc
  • 修复了将内容移入子组合的问题 92d4156
  • 修复了重启 lambda 中已更改的标志 (8a03e9)
  • 在处理效果之前,对 LayoutNode 执行停用回调 (8b0fa4)
  • 修复了结束节点组时的 endToMarker() 问题。(d71d980)
  • 使用当前的 SlotWriter 组检查停用状态 (a0b518b)
  • 移除 SlotTable.moveSlotGapTo() 中的 fill,并将其移动以关闭 (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 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 修复

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

  • 减少了分配(I65c09d7ea77727974445808
  • 不在 ComposerImpl 中保留快照引用 (0206f7)
  • 快速取消 Compose CoroutineScopesa55362bd382f
  • 请勿应用两次组合 (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 变更

  • 添加了 State API 的基本版本,允许在 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 变更

  • 现在,在收到 ON_STOP 通知时,为 Android 窗口创建的 Recomposer 只会屏蔽对 withFrameNanos 的调用,而非所有组合。这意味着,与已停止的 activity 相关联的窗口将继续因数据更改而重组,但动画或 withFrameNanos 的任何其他调用方将阻塞。(Id9e7fb/240975572

bug 修复

  • 修复了快照列表和映射中潜在的死锁问题 5c1a425
  • 在处置效果之前对 LayoutNode 执行停用回调 3784073
  • 修复了重启的 lambda 中已更改的标志 ea81df9
  • 修复了包含节点 73fd4d8 的可组合项的实时编辑回归问题
  • ON_STOP 应暂停帧时钟广播,而不是组合 ae276f1
  • 让未更改的派生状态 84d9b1cSnapshotStateObserver 范围失效
  • 修复了处理组合时潜在的死锁问题 28761fc
  • 修复了将内容移入子组合的问题 92d4156

版本 1.5.0-alpha02

2023 年 4 月 5 日

发布了 androidx.compose.runtime:runtime-*:1.5.0-alpha02版本 1.5.0-alpha02 中包含这些提交内容

新功能

  • Kotlin 的 getValue 运算符现在可以组合使用 (f174f6e)

bug 修复、性能提升

  • 覆盖具有无法访问的状态记录的状态对象的记录 (c986960)
  • 实现组时使用正确范围的编辑器 (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

  • 如果修改与直接写入状态记录是并发的,则向 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 以观察 Compose 节点的生命周期。8b6a258
  • ComposableMethod 7b6c7ad 添加了 parameterTypes 属性

修复了一些问题并提升了性能

  • 清除 SnapshotStateObserver 29f4a3e 中的两个范围索引
  • 在不可跳过的 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-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 变更

  • 内嵌/已废弃的隐藏函数的更多类型/可为 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 应用更改完成后发送快照应用通知。(Iad6c0b/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 修复

  • 修复了内存泄漏的问题:处置通过透明快照创建的嵌套快照(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 修复。其中最重要的一项新功能是引入了 movableContentOf API,该 API 可用于实现复杂的用户体验,例如共享元素过渡。movableContentOf API 用于将可组合 lambda 转换为另一种 lambda,后者会将其状态以及相应的节点移至其被调用的任何新位置。当上一个调用退出组合时,相应状态会暂时保留,如果对 lambda 的新调用进入组合,状态和关联的节点会移至新调用的位置。如果没有新调用加入,系统会永久移除相应状态;请注意,观察器会收到通知。

  • 如果在同一个组合中多次调用 movableContentOf lambda,系统会为每个调用创建新的状态和节点,随着调用退出组合和新调用进入组合,系统会按调用顺序将相应状态从第一个退出的调用移至后续进入的调用。新调用未声明的所有状态都会永久移除。

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

  • 下面总结了这些更改:

1.2 的新功能

1.2 的性能

1.2 中的 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,对于为可重用内容创建的状态的生命周期,可以进行更好的控制。例如,如果子组合暂时未使用,则内容可能会被停用,从而导致组合中的所有记住的状态都被忘记触发,例如所有可处理效应。(I2c0f2b/220322704

版本 1.2.0-alpha07

2022 年 4 月 6 日

发布了 androidx.compose.runtime:runtime-*:1.2.0-alpha07版本 1.2.0-alpha07 中包含这些提交内容

API 变更

  • 添加了新函数 Snapshot.withoutReadObservation { ... }。用户可以通过该函数运行所传递的 lambda,而无需订阅在此块中读取的状态值的更改。如果您既想从基于快照的线程安全写入/读取中受益,又希望能够在不造成非必要重组或重新测量的情况下读取值,这会对您很有帮助。(I9f365b/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 变更

  • 添加了 ComposableTargetComposableTargetMarkerComposableOpenTarget,以便系统在编译时报告何时以预期使用范围外的 Applier 为目标而调用了某个可组合函数。

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

    对于自定义 Applier,调用 ComposeNodeReusableComposeNode 的可组合函数需要为该函数和任何可组合 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 的新调用进入组合,状态和关联的节点会移至新调用的位置。如果没有新调用加入,系统会永久移除相应状态;请注意,观察器会收到通知。

    如果在同一个组合中多次调用 movableContentOf lambda,系统会为每个调用创建新的状态和节点,随着调用退出组合和新调用进入组合,系统会按调用顺序将相应状态从第一个退出的调用移至后续进入的调用。新调用未声明的所有状态都会永久移除。(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 中的 NullPointerExceptionaosp/1947059b/206677462
  • 修复了在 Android 上从剪贴板读取内容时剪贴板内容导致的崩溃问题。(I06020b/197769306
  • 修复了 LazyVerticalGrid 中的 RTL(aosp/1931080b/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(Ic2ab3b/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,使其依赖于 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 中的竞态条件导致系统偶尔抛出 NullPointerException 的问题。(aosp/1763445aosp/1758105b/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/193006595b/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>HSP 中的一个或多个字符,用于指示相应方法应标记为“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)
  • ControlledComposition API 已更改为在一次性重组中支持重组更改。(Iaafd1b/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 兼容(I6f9deb/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() 存在输入参数时会恢复原值的问题(I1b110b/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 的类型(不提供默认出厂设置)可能存在的类型错误。之前,此操作会为不可为 null 的类型提供 null 引用值。

    对于可为 null 的类型,请考虑提供 { null } 作为默认出厂设置。

    除非可提供合理的默认设置,否则我们不建议使用具有不可为 null 的类型的本地设置。如果不存在合理的默认设置,则 defaultFactory lambda 应抛出异常。不过,抛出异常意味着本地设置的使用者将隐式依赖于相关设置是以类型系统不强制执行该设置为前提的。(Ifbd2a)

  • 从 Comepose 运行时中移除了已废弃的符号 (I3252c)

  • 移除了已废弃的 emptyContent()。已改用 {}。(Idb33fb/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 的文件类语义,这会破坏二进制文件兼容性,但不会破坏源代码兼容性,因此对大多数用户来说这不会成为一个问题。
    • I99b7db/177245490
  • SnapshotStateObserver 不再处于实验阶段 (Id2e6a)

  • 删除了一些先前已废弃的 API(Ice5dab/178633932

  • 进行了以下 Material API 方面的更改:

    • 向 Top/BottomAppBar 添加了 contentPadding 参数,以允许自定义默认内边距。
    • 对 BackdropScaffold 中的参数进行了重新排序,以便遵循 API 指南中关于将必需参数排在可选参数前面的要求。
    • 将 BottomNavigationItem 中的 icon 参数移到了 selectedonClick 后面。
    • 将 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)

  • snapshotFlowwithMutableSnapshot 不再是实验性方法 (I6a45f)

  • 现在可以关闭 Recomposer。关闭的 Recomposer 会继续重组,直至组合子协程完成。Recomposer.shutDown 已重命名为 cancel,与 close 形成对比。(Ib6d76)

  • compose:runtime-dispatch 制品现已废弃。现在,MonotonicFrameClock 位于 compose:runtime 中,AndroidUiDispatcher 位于 compose:ui 中。(Ib5c36)

  • 已重构 Compose 编译器插件面向的 API,旨在使用接口而不是具体类。接口也不再使用类型参数。

    这种内部更改不会影响源代码兼容性,但这是一项重大的二进制文件更改。(I3b922b/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 用于 WithConstraintsScaffold 等子组合,则会多次调用该对象,从而打破单次调用 onEnter 的保证,而对于 RememberObserver 已将该对象移除。

    RememberObserver 添加了在以下情况下会被调用的 onAbandoned:如果从传递到 remember 的回调中返回 RememberObserver 实例,但该实例在组合状态下不被记住,并因此永远不会调用 onRemembered。当异常导致组合在完成前终止,或者组合因以下两种原因而遭到舍弃时就会发生上述情况:组合因不再是最新的而处于正在生成状态或者组合不再被需要。如果遵循上述单一引用建议的 RememberObserver 实例跟踪的是外部资源,那么 onForgottenonAbandoned 都会表示不再需要该资源。如果该对象跟踪的是 onRemembered 中已开始的工作或已分配的资源,则可以忽略 onAbandoned,因为如果调用 onRemembered,就不会调用 onAbandoned。(I02c36)

  • 不将 collectAsState() 函数标记为内嵌函数 (Ia73e4)

bug 修复

  • 已将 WithConstraints 重新设计为 BoxWithConstraints 并移至 foundation.layout。(I9420bb/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(I87c57b/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() 向正修改的树中插入节点,具体取决于哪个方法的效果更好。

    在构建某些树(例如 LayoutNodeView)时,自下而上构建会比自上而下构建效率更高。在做出此变更之前,若想实现自下而上构建,要进行很多插入操作,并需将插入内容复制到需借助自下而上的构建方式来提高性能的每个 applier。通过此变更,Applier 替换 insertBottomUp() 即可实现自下而上构建树,替换 insertTopDown() 即可实现自上而下构建树。(Icbdc2)

  • Compose 支持可进行可组合调用的属性 getter。系统不会停止支持此类 getter,但将某个属性 getter 声明为 @Composable 的语法会不断变化。

    要采用现已废弃的语法进行此声明,需对属性本身进行注解:

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

    若要采用目前正确的语法进行此声明,需对属性的 getter 进行注解:

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

    在一段时间内,这两种语法都能使用,但前者(即现已废弃的语法)最终将导致编译错误。(Id9197)

bug 修复

  • 将 AndroidOwner 变为内部函数(Ibcad0b/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,用作提供上下文环境的替代方案,可用于指定只会在尚未提供上下文环境值时设置的上下文环境值。(Id6635b/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。(I0fa98b/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(I85d73b/170461551
  • 添加了 SideEffect 可组合项,用于将组合的附带效应应用到其管理的对象。SideEffect 旨在取代 onCommit 可组合项。(Ia77c2)
  • 新增了实验性 API RestorableStateHolder。通过该 API,可先为子树保存定义为 [savedInstanceState] 和 [rememberSavedInstanceState] 的状态,然后再对其进行处理,以便下次利用恢复后的状态将其重新组合起来。(I66884b/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()(Ib2f32b/168293643b/167972292b/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。(Ie5950b/167680279

版本 1.0.0-alpha03

2020 年 9 月 16 日

发布了 androidx.compose.runtime:runtime-*:1.0.0-alpha03版本 1.0.0-alpha03 中包含这些提交内容

API 变更

  • CompositionCoroutineScope 不再实现 MonotonicFrameClockwithFrameNanos 的调用方应明确导入顶层函数。(Icb642b/166778123

bug 修复

  • 全局测试函数(例如 onNodewaitForIdle)现已废弃,请改用根据 ComposeTestRule 定义的新函数 (I7f45a)
  • launchInComposition 不再启动未分派的协程(Ief6afb/166486000

版本 1.0.0-alpha02

2020 年 9 月 2 日

发布了 androidx.compose.runtime:runtime-*:1.0.0-alpha02版本 1.0.0-alpha02 中包含这些提交内容

API 变更

  • 添加了 snapshotFlowwithMutableSnapshot API,分别用于使用和生成快照数据更改。(I3e722)
  • 可组合函数的调用规范发生了变化。这是一项重大的二进制文件更改。所有库都必须重新编译才能使用此版本的 Compose 编译器插件。

    这项更改不会在源代码级别产生重大变化,因为只有已更改的 API 属于明确选择启用的编译器 API。(I7afd2b/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 做出调整(I4ab76b/160042650b/156853976b/159026663b/154920561

bug 修复

  • 废弃了 emitView。请在可行的情况下改用 AndroidView 在 Compose 中发出 View。请注意,今后将不再支持直接对 View 和 ViewGroup 进行组合,除非二者是组合树的分支(在这种情况下,可通过 AndroidView 进行组合)。(I29b1eb/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)

  • RowColumn 现在属于内联函数,其使用开销将显著降低。(I75c10)

bug 修复

  • 废弃了 setViewContent,请改用 setContent。(I7e497b/160335130
  • 添加了 MonotonicFrameAnimationClock,您可将 MonotonicFrameClock 用作 AnimationClockObservable,以消除基于协程的新时钟与仍使用基于旧回调的时钟的 API 之间的差异。

    现在,ManualAnimationClock 的 MonotonicFrameClock 等效项是 ManualFrameClock。(I111c7b/161247083

  • 我们对 Modifier.stateDraggable 进行了彻底的重新设计,并将其重命名为 Modifier.swipeable。引入了一个新 SwipeableState 类,并对 DrawerState 和 BottomDrawerState 进行了重构,使其可从该类继承数据。[Modal/Bottom]DrawerLayout 不再使用 onStateChange 参数。(I72332b/148023068

  • 已废弃 Modifier.plus,现在改用 Modifier.then。“Then”能够更明确地指出先后执行顺序,同时还禁止输入会破坏链且降低可读性的 Modifier.padding().background() + anotherModifierIedd58b/161529964

  • 添加了 SubcomposeLayout。这是一个低级别基元,如果我们想要使用仅在衡量子树组合期间后期可用的一些值,就可以利用此基元在衡量期间组合子项。例如,WithConstraints 并非通过 SubcomposeLayout 实现。(I25cc8)

  • Material FilledTextField 已重命名为 TextField,且基础 TextField 已重命名为 BaseTextField,您可轻松寻找并使用所需的最简单的 API(Ia6242b/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 的属性委托和 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 }
     )
    }
    

    I409e8b/152050010b/146362815b/146342522b/143413369b/135715219b/143263925b/139653744

  • 更改了 Compose 的编译器的代码生成策略。在更改之前,Compose 编译器会转换对可组合函数的调用。进行此更改后,现在我们可以转换可组合函数的正文,并使调用位置保持不变(大多数情况下)。

    这意味着与 Compose 运行时进行通信的大多数逻辑发生在函数正文的开头,而不是在调用位置。

    这应该是针对所有 Compose 操作的源兼容性更改。大多数 Compose 用户都不需要在更改后更新任何代码。

    为了支持这项更改,所有可组合函数的 JVM 签名均已更改。将接受单个参数的可组合函数转换为接受 3 个参数的函数,其他参数为合成器,即“键”整数,一个用于通过调用传播元数据的位掩码整数。

    Compose 现在还会将默认参数转换为可组合函数。这项操作不会引入函数本身的额外合成默认过载,因此此更改会导致定义的函数变少。

    已知的有意行为更改是由于以下原因造成的:

    1. 有些调用会跳过之前不会跳过的位置
    2. 默认参数表达式中的可组合项表达式现已正确订阅并处理

    这项工作包括一些优化: 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,以包含其他编译时参数(I60756b/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)

  • 添加了顶级 onFrameNanos 函数用于动画定时 (Ie34c5)

  • 已废弃 @Untracked 注解,替换为 @ComposableContract(tracked=false) (Id211e)

  • RestartableFunction 和关联的 API 已重命名为 ComposableLambda 等。因为只有编译器定位到这些 API,所以此变更在正常情况下应该不会影响源代码级别的兼容性。重命名的主要目的是,当这个类出现在堆栈轨迹中时,用户能够更清晰地了解这个类 (I7eb25)

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

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

  • 在此变更之前,如果存在 @Composable 函数,Compose 编译器插件会以非常复杂的方式拦截对该函数内构造函数的调用(I5205ab/158123804

  • Recompose 可组合项已不再属于有效抽象。大多数重新组合都应由 MutableState 分配促成。在此之外,建议您使用 invalidate 函数来触发对当前范围的重新组合。(Ifc992)

  • Observe 已不再属于有效抽象函数。如需对其进行复制,只需创建一个执行可组合 lambda 参数的可组合函数即可复制其实现。例如,@Composable fun Observe(body: @Composable () -> Unit) = body() (I40d37)

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

  • 为最近引入的 StateFlow 添加了一个适配器,可用于预先填充初始值,使返回的 State 不可为 null(I61dd8b/156233789

  • 为 Flow 添加了一个适配器。用法示例:val value by flow.collectAsState()(If2198b/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,请改为使用 setContentsetViewContent。已废弃 Compose.disposeComposition,改用 setContent 返回的 Compositiondispose 方法。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> 文档(I4c7eeb/143769776

  • 添加了 ui-livedata - 带适用于 LiveData 的适配器的新制品。用法示例:val value by liveData.observeAsState()(Ie9e8cb/150465596

  • 已废弃没有明确的初始值的 Rx 适配器。使用 null 作为默认值并不一定是最佳选择,以 List 为例,最好是以 emptyList() 开头(I00025b/161348384

  • 添加了 ui-rxjava2 - 带适用于 RxJava2 的适配器的新制品。用法示例:val value by observable.subscribeAsState()(Ifab4bb/153369097

  • savedInstanceState() 现在可以与可为 null 的类型一起使用(I6847fb/153532190

  • 新增了 listSaver() 和 mapSaver(),可让您更轻松地编写自定义 Saver 对象(I8cf68b/152331508

  • 新函数:savedInstanceState() 和 rememberSavedInstanceState()。它们与 state() 和 remember() 类似,但包含已保存实例状态支持构建(If1987b/152025209

bug 修复

  • runOnIdleCompose 已重命名为 runOnIdle (I83607)
  • 将 LayoutNode 变成了实验性 API (I4f2e9)
  • 废弃了 androidx.ui.foundation.TextFieldValue 和 androidx.ui.input.EditorValue。还废弃了使用该类型的 TextField、FilledTextField 和 CoreTextField 可组合项。请改为使用 androidx.ui.input.TextFieldValue(I4066db/155211005
  • 移除了已废弃的 DrawBackground API,改为在修饰符上使用 drawBackground 扩展 API。重构了颜色、笔刷和涂料 drawBackground 实现,以减少代码路径,并且不再要求在组合过程中创建修饰符。(I0343a)
  • 更新了公开画布的更高级别的 Compose API,改为公开 CanvasScope。这样一来,用户便无需再维护自己的渲染对象。对于仍需要访问画布的使用方,可以使用 drawCanvas 扩展程序方法,该方法提供回调以向底层画布发出绘制命令。(I80afd)
  • withConstraints 尾随 lambda API 已更改。现在,它不是使用两个参数而是使用一个接收器作用域,除了 constraints 和 layoutDirection 之外,还以 Dp 为单位提供 minWidth、maxWidth、minHeight 和 maxHeight 属性(I91b9ab/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() 方法(Ibacedb/152919067
  • 已废弃 ColoredRect,请改用 Box(Modifier.preferredSize(width, height).drawBackground(color))。(I499fab/152753731
  • 将修饰符以及运算符替换成了出厂扩展函数 (I225e4)
  • 现在可以在 Row 和 Column 之外访问 RowScope 和 ColumnScope 成员。(I3a641)
  • LayoutFlexible 已重命名为 LayoutWeight。“tight”参数已重命名为“fill”。(If4738)
  • WithConstraints 获取了 LayoutDirection 参数 (I6d6f7)
  • 已将 background 重命名为 DrawBackground 并设置为默认记住 (Ia0bd3)
  • 将 ButtonStyle 替换成了不同的函数,并移除了文本(字符串)重载。如需了解使用信息,请参阅更新后的示例。(If63abb/146478620b/146482131
  • runOnIdleComposerunOnUiThread 现在是全局函数,而不是 ComposeTestRule 上的方法。(Icbe8f)

外部贡献

  • 从 Compose 运行时移植层移除了 Looper 和 Handler 等不需要的 API (I6847d)
  • 废弃了没有初始值的 Flow<T>.collectAsState(),改为使用 StateFlow<T> 或传递明确的初始值。(I63f98b/157674865