Compose Runtime
androidx.compose.runtime
androidx.compose.runtime.rxjava2
androidx.compose.runtime.rxjava3
androidx.compose.runtime.saveable
androidx.compose.runtime.snapshots
(查看所有 Compose 套件的 API 參考說明文件)
最近更新時間 | 穩定版 | 候選版 | Beta 版 | Alpha 版 |
---|---|---|---|---|
2024 年 11 月 13 日 | 1.7.5 | - | - | 1.8.0-alpha06 |
結構
Compose 是由 androidx
中的 7 個 Maven 群組 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 元件建構 Jetpack Compose UI。Material 3 提供新的主題設定和元件,以及動態色彩等 Material You 個人化功能,可呼應全新的 Android 12 視覺風格和系統 UI。 |
compose.runtime | Compose 程式設計模型和狀態管理的基本構成元素,以及 Compose Compiler 外掛程式指定的核心執行階段。 |
compose.ui | 與裝置互動所需的 Compose UI 基礎元件,包括版面配置、繪圖及輸入。 |
宣告依附元件
如要新增 Compose 的依附元件,必須將 Google Maven 存放區新增至您的專案。詳情請參閱「Google 的 Maven 存放區」一節。
在應用程式或模組的 build.gradle
檔案中,新增所需構件的依附元件:
Groovy
dependencies { implementation "androidx.compose.runtime:runtime:1.7.5" implementation "androidx.compose.runtime:runtime-livedata:1.7.5" implementation "androidx.compose.runtime:runtime-rxjava2:1.7.5" } android { buildFeatures { compose true } composeOptions { kotlinCompilerExtensionVersion = "1.5.15" } kotlinOptions { jvmTarget = "1.8" } }
Kotlin
dependencies { implementation("androidx.compose.runtime:runtime:1.7.5") implementation("androidx.compose.runtime:runtime-livedata:1.7.5") implementation("androidx.compose.runtime:runtime-rxjava2:1.7.5") } android { buildFeatures { compose = true } composeOptions { kotlinCompilerExtensionVersion = "1.5.15" } kotlinOptions { jvmTarget = "1.8" } }
如要進一步瞭解依附元件,請參閱「新增建構依附元件」一文。
意見回饋
您的意見可協助我們改善 Jetpack。如果您發現新問題,或是有改進這個程式庫的建議,請告訴我們。回報新問題前,請先查看這個程式庫的現有問題。只要按一下星號按鈕,即可投票給現有的問題。
詳情請參閱 Issue Tracker 說明文件。
執行階段追蹤記錄 1.7 版
1.7.0-rc01 版
2024 年 9 月 18 日
發布 androidx.compose.runtime:runtime-tracing:1.7.0-rc01
。1.7.0-rc01 版包含這些修訂項目。
Runtime Tracing 1.0 版
1.0.0-beta01 版
2023 年 11 月 29 日
發布 androidx.compose.runtime:runtime-tracing:1.0.0-beta01
。1.0.0-beta01 版包含此連結所列的修訂項目。
1.0.0-alpha05 版本
2023 年 11 月 15 日
發布 androidx.compose.runtime:runtime-tracing:1.0.0-alpha05
。1.0.0-alpha05 版本包含以下修訂項目。
修正錯誤
- 將固定依附元件綁定至支援的最低穩定版本 (例如 compose-runtime 和 tracing-perfetto) - 修正 compose-runtime-tracing 會將較新版本的 compose-runtime 帶入應用程式的問題。
1.0.0-alpha04 版本
2023 年 8 月 23 日
發布 androidx.compose.runtime:runtime-tracing:1.0.0-alpha04
。1.0.0-alpha04 版本包含以下修訂項目。
新功能
- 與最新版的 Benchmark 和 Tracing Perfetto 相容,可在應用程式啟動 (冷啟動) 時支援組合追蹤,例如在 AndroidX Benchmark 和 Android Studio (從 Hedgehog Beta 2 開始) 中。
API 變更
androidx.tracing.perfetto.Trace
已重新命名為androidx.tracing.perfetto.PerfettoSdkTrace
。(I44af8)。- 讓追蹤 Perfetto SDK API 與
android.os.Trace
保持一致。(I73ba0、b/282199917)。 - 在應用程式啟動時進行追蹤的必要條件。(Iad890)
- 已合併實驗性和公開 API 檔案 (I0f2e1、b/278769092)
1.0.0-alpha02 版
2023 年 2 月 8 日
發布 androidx.compose.runtime:runtime-tracing:1.0.0-alpha02
。1.0.0-alpha02 版包含此連結所列的修訂項目。
新功能
- 沒有功能變更。對下游依附元件
androidx.tracing:tracing-perfetto*
中的多項效能進行最佳化調整。
1.0.0-alpha01 版
2022 年 9 月 7 日
發布了 androidx.compose.runtime:runtime-tracing:1.0.0-alpha01
。1.0.0-alpha01 版包含此連結所列的修訂項目。
新功能
androidx.compose.runtime:runtime-tracing
是種程式庫。搭配即將推出且支援這類程式庫的工具使用,可在 Compose 應用程式中執行更強大的追蹤功能。本初始版本為 1.0.0-alpha01。
1.8 版
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)
- 已將
snapshotId
新增至Snapshot
和已淘汰的id
,該類型為Long
。快照的 ID 已從Int
變更為Long
,以免在幀率極高且動畫執行時間很長的系統上,快照 ID 發生溢位。這個類型是預期/實際類型,可讓這個類型在沒有原生Long
類型的平台上,成為Int
或其他類型。沒有原生Long
的平台 (例如 JavaScript) 應避免使用高影格速率 (超過 1000 FPS),否則可能會導致Int
每 24 天左右溢出。(I38ac3、b/374821679)。
修正錯誤
- 修正單一
provides
的providesDefault
。(aosp/3318540 b/374263387)。 - 最佳化
ChangeList
。(3318538)。
1.8.0-alpha05 版
2024 年 10 月 30 日
發布 androidx.compose.runtime:runtime-*:1.8.0-alpha05
。1.8.0-alpha05 版包含這些修訂項目。
修正錯誤
- 修正將
Int.MAX_VALUE
新增至SnapshotIdSet
時的堆疊溢位問題。(b/370536104、Ic4179f6)。 - 執行階段微最佳化 (I50c60)
- 允許 R8 移除偵錯 runtimeCheck 呼叫 (I8c44)
- 讓
compoundKeyOf
採用疊代而非遞迴 (I5817f)
外部貢獻
- 使用集合清單實作堆疊 (I7d47c)
1.8.0-alpha04 版
2024 年 10 月 16 日
發布 androidx.compose.runtime:runtime-*:1.8.0-alpha04
。1.8.0-alpha04 版包含這些修訂版本。
效能改善
- 在建構函式中提供狀態記錄的快照 ID (85c00f)
- 重構
SnapshotState***
以避免類別驗證錯誤 (6ee4a6) - 修正 R8 規則,以防擲回內嵌 (5beb92)
- 微最佳化運算 (d73c5c)
- 在 JVM 上最佳化
SynchronizedObject
配置 (2b043f)
1.8.0-alpha03 版
2024 年 10 月 2 日
發布 androidx.compose.runtime:runtime-*:1.8.0-alpha03
。1.8.0-alpha03 版包含這些修訂版本。
效能改善
- 為
rememberCoroutineScope
延遲建立子項脈絡 (f61464)rememberCoroutineScope
通常用於在組合後發生的事件發生時,啟動協同程式。在某些情況下,這些事件可能永遠不會發生,導致建立和取消工作時會產生額外成本,卻沒有任何好處。- 讓
rememberCoroutineScope
傳回的範圍在存取時延遲建立coroutineContext
,如果範圍從未使用,則完全避免建立及取消工作。
1.8.0-alpha02 版
2024 年 9 月 18 日
發布 androidx.compose.runtime:runtime-*:1.8.0-alpha02
。1.8.0-alpha02 版包含這些修訂項目。
新功能
- 新增
PausableComposition
,可讓您建立可在組合期間暫停,並以非同步方式套用至組合的子組合。暫停功能目前仍在開發中,需要編譯器支援。(I3394b)
1.8.0-alpha01 版
2024 年 9 月 4 日
發布 androidx.compose.runtime:runtime-*:1.8.0-alpha01
。1.8.0-alpha01 版包含這些修訂版本。
1.7 版
1.7.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
屬性,取得組合本機的值。這會取代current
,後者只能在@Composable
函式中使用。(Iadbc0)。 - 新建立的狀態物件可立即透過其他快照 (包括全域快照) 存取,並保留其初始狀態。您必須套用建立物件的快照,才能查看後續的任何修改。
mutableStateOf()
的初始狀態及其原始版本,是傳遞給mutableStateOf()
做為參數的值。mutableStateListOf()
和mutableStateMapOf()
的初始狀態為空白。- 新增
Snapshot.isInSnapshot
和Snapshot.PreexistingSnapshotId
,用於讓狀態物件在建立時,立即支援從全域快照存取。 - 只要遵循對內建快照物件所做的變更模式,自訂狀態物件就能支援立即存取。(I84a17)
- 為 Compose 程式庫啟用
nonSkippingGroupOptimization
。這會讓 androidx 中所有無法重新啟動的可組合函式產生的程式碼更有效率。我們預計日後會預設啟用這項功能。I(acbc08) - 在同一個影格中,將子組合中可組合 lambda 設為無效。(98301c)
- 請按照與
onForgotten
相同的順序呼叫onRelease
回呼。(2cd790) - 啟用嚴格略過模式 (ed1766)
- 在更多情況下讓
currentCompoundHashKey
保持不重複 (d4a872)
1.7.0-rc01 版
2024 年 8 月 21 日
發布 androidx.compose.runtime:runtime-*:1.7.0-rc01
。1.7.0-rc01 版包含這些修訂項目。
1.7.0-beta07 版
2024 年 8 月 7 日
發布 androidx.compose.runtime:runtime-*:1.7.0-beta07
。1.7.0-beta07 版包含這些修訂版本。
1.7.0-beta06 版
2024 年 7 月 24 日
發布 androidx.compose.runtime:runtime-*:1.7.0-beta06
。1.7.0-beta06 版包含這些修訂版本。
1.7.0-beta05 版
2024 年 7 月 10 日
發布 androidx.compose.runtime:runtime-*:1.7.0-beta05
。1.7.0-beta05 版包含這些修訂版本。
1.7.0-beta04 版
2024 年 6 月 26 日
發布 androidx.compose.runtime:runtime-*:1.7.0-beta04
。1.7.0-beta04 版包含這些修訂版本。
1.7.0-beta03 版
2024 年 6 月 12 日
發布 androidx.compose.runtime:runtime-*:1.7.0-beta03
。1.7.0-beta03 版包含這些修訂項目。
1.7.0-beta02 版
2024 年 5 月 29 日
發布 androidx.compose.runtime:runtime-*:1.7.0-beta02
。1.7.0-beta02 版包含這些修訂項目。
1.7.0-beta01 版
2024 年 5 月 14 日
發布 androidx.compose.runtime:runtime-*:1.7.0-beta01
。1.7.0-beta01 版包含這些修訂版本。
1.7.0-alpha08 版
2024 年 5 月 1 日
發布 androidx.compose.runtime:runtime-*:1.7.0-alpha08
。1.7.0-alpha08 版包含這些修訂項目。
1.7.0-alpha07 版
2024 年 4 月 17 日
發布 androidx.compose.runtime:runtime-*:1.7.0-alpha07
。1.7.0-alpha07 版包含這些修訂項目。
新功能
- 新增提供組合本機的功能,該本機會根據預設使用
compositionLocalWithComputedDefault()
或提供 lambda 來計算值,使用providesComputed
而非provides
。 - 您可以使用可組合函式中計算值的
currentValue
屬性,取得組合本機的值。這會取代current
,後者只能在@Composable
函式中使用。(Iadbc0)。
API 變更
- 新建立的狀態物件可立即透過其他快照 (包括全域快照) 存取,並保留其初始狀態。您必須套用建立物件的快照,才能查看後續的任何修改。
mutableStateOf()
的初始狀態及其原始版本,是傳遞給mutableStateOf()
做為參數的值。mutableStateListOf()
和mutableStateMapOf()
的初始狀態為空白。- 新增
Snapshot.isInSnapshot
和Snapshot.PreexistingSnapshotId
,用於讓狀態物件在建立時,立即支援從全域快照存取。 - 只要遵循對內建快照物件所做的變更模式,自訂狀態物件就能支援立即存取。(I84a17)
修正錯誤
- 修正巢狀快照中
readObserver
的合併問題。這會導致在snapshotFlow
中使用巢狀衍生狀態時,狀態未完全失效。(Idf138)。
1.7.0-alpha06 版
2024 年 4 月 3 日
發布 androidx.compose.runtime:runtime-*:1.7.0-alpha06
。1.7.0-alpha06 版包含這些修訂項目。
修正錯誤
1.7.0-alpha05 版
March 20, 2024
發布 androidx.compose.runtime:runtime-*:1.7.0-alpha05
。1.7.0-alpha05 版包含這些修訂項目。
修正錯誤
- 清除已停用的組合中的近期變更 (5950bc)
1.7.0-alpha04 版
2024 年 3 月 6 日
發布 androidx.compose.runtime:runtime-*:1.7.0-alpha04
。1.7.0-alpha04 版包含這些修訂項目。
效能改善
- 針對每個衍生狀態評估作業呼叫
Snapshot.current
一次 (ee7daf) - 在組合中依觀察項目讀取
currentRecord
一次 (b882b2) - 移除
snapshotFlow
中的意外迭代器配置 (231e56) - 為 Compose 程式庫啟用
nonSkippingGroupOptimization
。這會讓 androidx 中所有無法重新啟動的可組合函式產生的程式碼更有效率。我們預計日後會預設啟用這項功能。I(acbc08)
1.7.0-alpha03 版
2024 年 2 月 21 日
發布 androidx.compose.runtime:runtime-*:1.7.0-alpha03
。1.7.0-alpha03 版包含以下修訂項目。
API 變更
- 引入替換群組,以改善變更偵測功能 (0941b5)
效能改善
- 改善偵測變更時的記憶體分配 (53e7fd)
- 修正 Composer 中的記憶體流失問題 (0e097d)
- 在重組時使用
ScopeMap
傳遞無效項目 (e19a7e) - 最佳化無效項目對應表,只保留衍生狀態 (f11c44)
- 將
IdentityArraySet
用法替換為ScatterSet
(db572e) - 在
ScopeMap
中最佳化removeScope
(bb0530)
1.7.0-alpha02 版
2024 年 2 月 7 日
發布 androidx.compose.runtime:runtime-*:1.7.0-alpha02
。1.7.0-alpha02 版包含以下修訂項目。
修正錯誤
- 在同一個影格中,將子組合中可組合 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 版包含這些修訂項目。
成效最佳化
修正錯誤
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 版
March 20, 2024
發布 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 版包含此連結所列的修訂項目。
修正錯誤
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)
修正錯誤
- 修正運算單元資料表記憶體流失問題 (73fcfe)
- 略過即將移除的子組合重組作業。(Ieeb99、b/254645321)。
- 只有在
RememberObserver
儲存在 remember 計算作業中時,才會觸發其生命週期。(f6b4dc) - 將
$dirty
擷取限制在內嵌 lambda 中。(acfca0) - 修正可移動內容有時會收到錯誤的組合本機值的問題。(035cd6)
1.6.0-rc01 版
2024 年 1 月 10 日
發布 androidx.compose.runtime:runtime-*:1.6.0-rc01
。1.6.0-rc01 版包含以下修訂項目。
1.6.0-beta03 版
2023 年 12 月 13 日
發布 androidx.compose.runtime:runtime-*:1.6.0-beta03
。1.6.0-beta03 版包含以下修訂項目。
1.6.0-beta02 版
2023 年 11 月 29 日
發布 androidx.compose.runtime:runtime-*:1.6.0-beta02
。1.6.0-beta02 版包含以下修訂項目。
1.6.0-beta01 版
2023 年 11 月 15 日
發布 androidx.compose.runtime:runtime-*:1.6.0-beta01
。1.6.0-beta01 版包含以下修訂項目。
API 變更
- 在註解中傳播特定穩定性值。(274a4c)
修正錯誤
- 在情境中,針對組合本機範圍狀態使用參照政策。(83361c)
- 將 $dirty 擷取限制在內嵌 lambda 中。(acfca0)
- 修正可移動內容有時會收到錯誤的組合本機值的問題。(035cd6)
- 在
RecomposeScopeImpl
中使用更快的非配置雜湊表。(d79494) - 在「
DerivedState
」應用程式中使用ObjectIntMap
。(21862e) - 在
DerivedState
中,將 intSnapshotThreadLocal
設為IntRef
。(04eaf4)
1.6.0-alpha08 版
2023 年 10 月 18 日
發布 androidx.compose.runtime:runtime-*:1.6.0-alpha08
。1.6.0-alpha08 版包含以下修訂項目。
修正錯誤
- 只有在
RememberObserver
儲存在 remember 計算作業中時,才會觸發其生命週期。(f6b4dc) - 改善無效清單排序中的分配。(954d63)。
- 在
SnapshotStateObserver
中使用新的非分配地圖。(4303ce) - 在停用組合時清除無效項目。(e001be)
1.6.0-alpha07 版
2023 年 10 月 4 日
發布 androidx.compose.runtime:runtime-*:1.6.0-alpha07
。1.6.0-alpha07 版包含以下修訂項目。
API 變更
SnapshotStateList
現已標示為RandomAccess
,可使用清單輔助程式的直接索引版本。(I5210c、b/219554654)。
1.6.0-alpha06 版
2023 年 9 月 20 日
發布 androidx.compose.runtime:runtime-*:1.6.0-alpha06
。1.6.0-alpha06 版包含以下修訂項目。
1.6.0-alpha05 版
2023 年 9 月 6 日
發布 androidx.compose.runtime:runtime-*:1.6.0-alpha05
。1.6.0-alpha05 版包含以下修訂項目。
1.6.0-alpha04 版本
2023 年 8 月 23 日
發布 androidx.compose.runtime:runtime-*:1.6.0-alpha04
。1.6.0-alpha04 版本包含以下修訂版本。
新功能
- 重新擲回在重組迴圈中吞嚥的例外狀況 (4dff9a)
API 變更
- 新增方法來停用
ReusableComposition
,移除觀察項目,但保留節點。您可以呼叫setContent
再次啟用已停用的組合。(Ib7f31)。 - 新增
ReusableComposition
介面,用於管理子組合物的生命週期和重複使用。(I812d1、b/252846775)。
1.6.0-alpha03 版本
2023 年 8 月 9 日
發布 androidx.compose.runtime:runtime-*:1.6.0-alpha03
。1.6.0-alpha03 版包含以下修訂項目。
修正錯誤
1.6.0-alpha02 版本
2023 年 7 月 26 日
發布 androidx.compose.runtime:runtime-*:1.6.0-alpha02
。1.6.0-alpha02 版包含以下修訂項目。
新功能與效能提升
- 最佳化
rememberSaveable
(f01d79) - 延後重新讀取衍生狀態,直到變更記錄為止 (f38099)
- 改善組合本機值的提供方式 (a337ea)
SideEffect
會標示為@ExplicitGroupsComposable
,以免產生群組。(I74815)- 避免在重複使用時比較組合本機對應項目 (782071)
API 變更
- 為
CompositionLocalProviders
新增特殊案例超載,可避免在提供單一值時,用於加快提供多個值的額外負擔。(I6d640、b/288169379)。
修正錯誤
1.6.0-alpha01 版本
2023 年 6 月 21 日
發布 androidx.compose.runtime:runtime-*:1.6.0-alpha01
。1.6.0-alpha01 版包含這些修訂項目。
修正錯誤
- 略過即將移除的子組合重組作業。(Ieeb99、b/254645321)。
- 套用快照時減少了分配。(I65c09)。
- 如果快照未經修改,請避免在
DerivedState
中計算readableHash
(68c565)
1.5 版本
1.5.4 版本
2023 年 10 月 18 日
發布 androidx.compose.runtime:runtime-*:1.5.4
。1.5.4 版包含以下修訂項目。
1.5.3 版本
2023 年 10 月 4 日
發布 androidx.compose.runtime:runtime-*:1.5.3
。1.5.3 版包含以下修訂項目。
1.5.2 版本
2023 年 9 月 27 日
發布 androidx.compose.runtime:runtime-*:1.5.2
。1.5.2 版包含以下修訂項目。
1.5.1 版本
2023 年 9 月 6 日
發布 androidx.compose.runtime:runtime-*:1.5.1
。1.5.1 版包含此連結所列的修訂項目。
1.5.0 版本
2023 年 8 月 9 日
發布 androidx.compose.runtime:runtime-*:1.5.0
。1.5.0 版包含此連結所列的修訂項目。
API 變更
- 移除重組、色彩動畫和
AndroidComposeView
中的配置。(Ib2bfa)。 - 新增
@StateFactoryMarker
註解,用於標示建立狀態的函式,且必須在remember
呼叫中包裝。(I64550) - 新增 State 和
MutableState
的基本版本 (fb3d89) - 新增了
Snapshot.isApplyObserverNotificationPending
(I672a5) - 新增
State
API 的原始版本,讓您可以在State
物件中追蹤 Int、Long、Float 和 Double 值,而不必因自動裝箱而遭受處罰。如要使用這些方法,請使用新的工廠方法mutableIntState(Int)
、mutableFloatStateOf(Float)
等。(I48e43)
修正錯誤
- 略過即將移除的子組合重組作業。(Ieeb99、b/254645321)。
- 不要在
ComposerImpl
中保留快照參照 (0206f7) - 不要套用兩次組合 (f5791b)
- 確保未初始化的衍生狀態值無效 (aa2a92)
- 在組合項處置期間呼叫
onEndChanges
。(62cc8c) - 修正將內容移至子元件的錯誤 (4beb41)
- 修正潛在的死結問題 (c1a425 和 8edce0)
- 為 Android 視窗建立的重新組合器現在會在收到 ON_STOP 通知時,只封鎖對
withFrameNanos
的呼叫,而非所有組合。這表示與已停止活動相關聯的視窗會繼續重新組合,以便處理資料變更,但動畫或withFrameNanos
的任何其他呼叫端會遭到封鎖。(Id9e7f、b/240975572)。 - 在處置效果之前,執行
LayoutNode
的停用回呼 3784073 - 修正重新啟動的 lambda 變更旗標 ea81df9
- 修正含有節點的 Composable 即時編輯迴歸問題 (73fd4d8)
- ON_STOP 應暫停影格時鐘廣播,而非組合 ae276f1
- 針對未變更的衍生狀態,讓
SnapshotStateObserver
範圍失效 84d9b1c - 修正組合項處置時可能發生的死結 28761fc
- 修正將內容移至子元件的情形 92d4156
- 修正重新啟動 lambda 的變更旗標 (8a03e9)
- 在處置效果之前,執行
LayoutNode
的停用回呼 (8b0fa4) - 修正結束節點群組時的
endToMarker()
。(d71d980) - 使用目前的
SlotWriter
群組來檢查停用 (a0b518b) - 移除
SlotTable.moveSlotGapTo()
中的fill
,並將其移至關閉 (81f9935) - 修正可移動內容移動時缺少無效化的問題 (1d7c024)
- 修正已移動的可移動內容立即失效問題 (8676618)
效能改善
- 如果快照未經過修改,請避免在
DerivedState
中計算readableHash
。(307102)。 - 減少配置 (I65c09、d7ea77、727974 和 445808)
- 快速取消 Compose
CoroutineScopes
(a55362 和 bd382f) - 使用無法存取的狀態記錄覆寫狀態物件的記錄 (c986960)
- 在實現群組時使用正確範圍的 Composer (9a5e5b6)
- 使用
IdentityArraySet
儲存快照無效資訊 (7f60cca) - 減少快照觀察值的分配 (5bc535f)
1.5.0-rc01 版
2023 年 7 月 26 日
發布 androidx.compose.runtime:runtime-*:1.5.0-rc01
。1.5.0-rc01 版包含此連結所列的修訂項目。
修正錯誤
延後重新讀取衍生狀態,直到變更記錄為止 (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 版包含以下修訂項目。
修正錯誤
- 略過即將移除的子組合重組作業。(Ieeb99、b/254645321)。
1.5.0-beta02 版
2023 年 6 月 7 日
發布 androidx.compose.runtime:runtime-*:1.5.0-beta02
。1.5.0-beta02 版包含以下修訂項目。
效能改善
- 如果快照未經過修改,請避免在
DerivedState
中計算readableHash
。(307102)。
1.5.0-beta01 版
2023 年 5 月 24 日
發布 androidx.compose.runtime:runtime-*:1.5.0-beta01
。1.5.0-beta01 版包含此連結所列的修訂項目。
API 變更
- 移除重組、色彩動畫和
AndroidComposeView
中的配置 (Ib2bfa) - 新增
@StateFactoryMarker
註解,用於標示建立狀態的函式,且必須在remember
呼叫中包裝。(I64550) - 新增 State 和
MutableState
的基本版本 (fb3d89) - 新增了
Snapshot.isApplyObserverNotificationPending
(I672a5)
修正錯誤
- 減少配置 (I65c09、d7ea77、727974 和 445808)
- 不要在
ComposerImpl
中保留快照參照 (0206f7) - 快速取消 Compose
CoroutineScopes
(a55362 和 bd382f) - 不要套用兩次組合 (f5791b)
- 確保未初始化的衍生狀態值無效 (aa2a92)
- 在組合項處置期間呼叫
onEndChanges
。(62cc8c) - 修正將內容移至子元件的錯誤 (4beb41)
- 修正潛在的死結問題 (c1a425)
- ON_STOP 應暫停影格時鐘廣播,而非組合 (f4a2d1)
- 修正重新啟動 lambda 的變更旗標 (8a03e9)
- 在處置效果之前,執行
LayoutNode
的停用回呼 (8b0fa4)
外部貢獻
- 新增了
Snapshot.isApplyObserverNotificationPending
(I672a5)
1.5.0-alpha04 版
2023 年 5 月 10 日
發布 androidx.compose.runtime:runtime-*:1.5.0-alpha04
。1.5.0-alpha04 版包含以下修訂項目。
API 變更
- 新增
State
API 的原始版本,讓您可以在State
物件中追蹤 Int、Long、Float 和 Double 值,而不必因自動裝箱而遭受處罰。如要使用這些方法,請使用新的工廠方法mutableIntState(Int)
、mutableFloatStateOf(Float)
等。(I48e43)
修正錯誤
在組合項處置期間呼叫
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
的任何其他呼叫端會遭到封鎖。(Id9e7f、b/240975572)。
修正錯誤
- 修正快照清單和對應項目中的潛在鎖定問題 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)
- 在實現群組時使用正確範圍的 Composer (9a5e5b6)
- 修正結束節點群組時的
endToMarker()
。(d71d980) - 使用目前的
SlotWriter
群組來檢查停用 (a0b518b) - 使用
IdentityArraySet
儲存快照無效資訊 (7f60cca) - 移除
SlotTable.moveSlotGapTo()
中的fill
,並將其移至關閉 (81f9935) - 修正可移動內容移動時缺少無效化的問題 (1d7c024)
- 修正已移動的可移動內容立即失效問題 (8676618)
- 減少快照觀察值的分配 (5bc535f)
1.5.0-alpha01 版本
2023 年 3 月 22 日
發布 androidx.compose.runtime:runtime-*:1.5.0-alpha01
。1.5.0-alpha01 版包含此連結所列的修訂項目。
新功能
- 新增
Modifier.Node#coroutineScope
,讓Modifier.Nodes
能啟動協同程式 (I76ef9) - 實作
CompositionLocalConsumerModifierNode
介面,允許Modifier.Nodes
讀取CompositionLocals
。(Ib44df)
1.4 版
1.4.3 版本
2023 年 5 月 3 日
發布 androidx.compose.runtime:runtime-*:1.4.3
,但沒有任何變更。
1.4.2 版
2023 年 4 月 19 日
發布 androidx.compose.runtime:runtime-*:1.4.2
。1.4.2 版本包含這些修訂版本。
修正錯誤
修正快照清單和地圖中的潛在死結 2eb6570
如果修改內容與直接寫入狀態記錄同時進行,則可能會在
SnapshotStateList
或SnapshotStateMap
中新增內容時發生死結。隨著 93fcae828b 引進的變更,使用直接寫入來釋出未使用的記錄,這種情況發生的機率大幅提高。鎖定現在已排序,因此在保留地圖或清單鎖定時,系統不會嘗試取得快照鎖定。
1.4.1 版本
2023 年 4 月 5 日
發布 androidx.compose.runtime:runtime-*:1.4.1
。1.4.1 版本包含這些修訂版本。
修正錯誤
- 修正結束節點群組時的
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 - 將
parameterTypes
屬性新增至ComposableMethod
7b6c7ad
修正錯誤並提升效能
- 清除
SnapshotStateObserver
29f4a3e 中的兩個範圍索引 - 在不可略過的 lambda 主體中新增所需群組 7d06752
- 改善快照狀態的記憶體參照特性 93fcae8
- 移除組合本機查詢中的 Box 0875717
- 為無法重複使用的節點群組使用正確的鍵 6388d8d
- 避免
SnapshotStateObserver
套用遞迴和並行元素 98cb6ba - 在
IdentityArraySet
「get」方法中新增檢查索引邊界檢查功能 35a77d3 - 更新 Compose 模組,以便使用
ViewTreeLifecycleOwner
擴充功能 21c2122 - 在 Recomposer 完成影格後傳送套用通知。98f2641
- 修正取消 Recomposer 時發生的索引超出邊界當機問題 8f8656f
- 如果組合的父項供應器已變更,一律強制重新組合 9526fcc
- 取消的工作的重新編譯容許值 a55f7ed
- 改善大量作曲家失效處理作業 9b7ed67
- 修正為非本機傳回值產生結尾群組的問題 b6f590c
1.4.0-rc01 版本
2023 年 3 月 8 日
發布 androidx.compose.runtime:runtime-*:1.4.0-rc01
。1.4.0-rc01 版包含此連結所列的修訂項目。
修正錯誤
1.4.0-beta02 版本
2023 年 2 月 22 日
發布 androidx.compose.runtime:runtime:1.4.0-beta02
和 androidx.compose.runtime:runtime-saveable:1.4.0-beta02
。1.4.0-beta02 版包含以下修訂項目。
1.4.0-beta01 版本
2023 年 2 月 8 日
發布 androidx.compose.runtime:runtime-*:1.4.0-beta01
。1.4.0-beta01 版包含此連結所列的修訂項目。
API 變更
- 新增
ComposeNodeLifecycleCallback
,用於觀察 Compose 節點的生命週期 (I3731b) - 將
@TestOnly
新增至Composer.disableSourceInformation()
,因為後者只有在測試中呼叫才安全。(I896c8)
修正錯誤
1.4.0-alpha05 版本
2023 年 1 月 25 日
發布 androidx.compose.runtime:runtime:1.4.0-alpha05
和 androidx.compose.runtime:runtime-saveable:1.4.0-alpha05
。1.4.0-alpha05 版包含此連結所列的修訂項目。
API 變更
- 針對內嵌/已淘汰並隱藏的函式提供更多類型/是否可為空值選項 (I24f91)
1.4.0-alpha04 版
2023 年 1 月 11 日
發布了 androidx.compose.runtime:runtime-*:1.4.0-alpha04
。1.4.0-alpha04 版包含此連結所列的修訂項目。
API 變更
TestMonotonicFrameClock
現在採用正確的實驗性註解。(I95c9e)
修正錯誤
- 避免
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)
修正錯誤
- 現在,
Recomposer
套用變更之後,系統即會傳送快照套用通知 (Iad6c0、b/222093277)
1.4.0-alpha02 版
2022 年 11 月 9 日
發布 androidx.compose.runtime:runtime-*:1.4.0-alpha02
。1.4.0-alpha02 版包含此連結所列的修訂項目。
1.4.0-alpha01 版
2022 年 10 月 24 日
發布 androidx.compose.runtime:runtime-*:1.4.0-alpha01
。查看 1.4.0-alpha01 版的修訂項目。
API 變更
SnapshotStateList
和SnapshotStateMap
現已分別採用toList()
和toMap()
的明確實作。這些方法在傳回儲存內容所需的內部不可變動資料時,會傳回目前的內容,且不會執行副本。例如,這個值可用於使用snapshotFlow
產生值的流程,而不必複製資料 (Ica2bd)
1.3 版
1.3.3 版
2023 年 1 月 11 日
發布 androidx.compose.runtime:runtime-*:1.3.3
。1.3.3 版包含此連結所列的修訂項目。
- 自 1.3.2 以來沒有變更
1.3.2 版
2022 年 12 月 7 日
發布了 androidx.compose.runtime:runtime-*:1.3.2
。1.3.2 版包含此連結所列的修訂項目。
修正錯誤
- 已更新為可支援 androidx.compose.ui 1.3.2
1.3.1 版
2022 年 11 月 9 日
發布 androidx.compose.runtime:runtime-*:1.3.1
。1.3.1 版包含此連結所列的修訂項目。
1.3.0 版
2022 年 10 月 24 日
發布 androidx.compose.runtime:runtime-*:1.3.0
。1.3.0 版包含此連結所列的修訂項目。
自 1.2.0 版以來的重要變更
例外狀況處理/即時編輯支援
- 為了更妥善支援即時編輯功能,新增了 API 來處理組合過程中的例外狀況
- 熱重載的組合錯誤處理
- 處理儲存/還原時發生的即時編輯錯誤
組合追蹤
- 新增了執行階段追蹤 API,以支援新的組合追蹤工具
- 產生可組合追蹤事件開始/結束呼叫
- 重新新增 ComposerKt.traceEventStart(Int, String)
可組合反射 API
- 新增了
ComposableMethod
API,以更可靠的反映方式叫用可組合 API。 - 將 invokeComposable 移至 Compose 執行階段
- 重構 API 以叫用可組合方法
執行階段修正
快照系統
- 快照系統的記憶體管理、效能和正確性得到各種改善。
- 在 SnapshotStateObserver 中最佳化範圍移除
- 處理以透明快照建立的巢狀結構快照
- 修正了從全域快照讀取狀態的競爭狀況
- 在 SnapshotStateObserver 中支援 DerivedState
- 避免從其他範圍讀取時,從組合中移除衍生的狀態
- 在 DerivedState 中使用 IdentityArrayMap,而非 HashMap
- 更新衍生狀態觀察器以使用可變動的向量
- 更新 SnapshotStateObserver 狀態清除
- 用 ArraySet 取代 SnapshotStateObserver.invalidated
- 修正了從全域快照讀取狀態的競爭狀況
- 修正在 DerivedState 雜湊計算中使用過時記錄
- 修正改善全域快照時的競爭狀況
- 在 SnapshotStateObserver 中加速範圍觀察清除
1.3.0-rc01 版
2022 年 10 月 5 日
發布 androidx.compose.runtime:runtime-*:1.3.0-rc01
。1.3.0-rc01 版包含此連結所列的修訂項目。
修正錯誤
- 已修正來自運算單元資料表的
ArrayIndexOutOfBoundsException
(b/249076084)
1.3.0-beta03 版
2022 年 9 月 21 日
發布 androidx.compose.runtime:runtime-*:1.3.0-beta03
。1.3.0-beta03 版包含此連結所列的修訂項目。
行為破壞性變更
remember
和rememberCoroutineScope
的參數,已變更為crossinline
。這樣會回報早期傳回錯誤,而不是允許提前回報,從而導致稍後回報內部錯誤。- 這項變更可能會導致系統回報新的編譯器錯誤,亦即需要從傳遞至這些函式的 lambda 中移除非本機回傳 (Ibea62)
1.3.0-beta02 版
2022 年 9 月 7 日
發布 androidx.compose.runtime:runtime-*:1.3.0-beta02
。1.3.0-beta02 版包含此連結所列的修訂項目。
修正錯誤
- 已更新 API (I64ca0)
1.3.0-beta01 版
2022 年 8 月 24 日
發布了 androidx.compose.runtime:runtime-*:1.3.0-beta01
。1.3.0-beta01 版包含此連結所列的修訂項目。
API 變更
- 在
CompositionData
中新增find
方法,讓使用這個 API 的開發人員工具能利用組合 ID,快速找出組合的子群組 (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 版的修訂項目。
修正錯誤
- 修正記憶體流失問題:處置從透明數據匯報建立的巢狀數據匯報 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,此 API 可用於啟用複雜的使用者體驗,例如:共用元素轉換。movableContentOf
API 可將可組合 lambda 轉換為另一種 lambda,後者會將其狀態和對應的節點移至呼叫的新位置。如果先前的呼叫離開組合,狀態會暫時保留,如果對 lambda 的新呼叫進入組合,狀態和相關聯的節點就會移至新呼叫的位置。如沒有加入新呼叫,系統會永久移除對應的狀態。同時觀察器會收到相關通知。如果在相同組合中多次呼叫
movableContentOf
lambda,系統會為每個呼叫建立新的狀態和節點,當呼叫離開組合,而新的呼叫進入時,系統會依照呼叫的順序,將狀態從第一個離開的呼叫移至進入的呼叫。所有未由新呼叫宣告的狀態都會永久移除。除此之外,還有一些其他新的功能,而我們也主要著重在穩定執行階段和快照模式狀態系統上。許多記憶體流失的問題皆已移除,且程式碼路徑也已經最佳化。
相關異動摘要清單如下:
1.2
的新功能
- 新增實驗性快照 unsafeEnter/Leave
- 新增 Snapshot.asContextElement 實驗性 API
- 加入 Snapshot.withoutReadObservation
- 允許狀態在組合中移動
- 在 Compose 中追蹤重組
1.2
中的效能
1.2
中的錯誤錯誤
- 從發布重組範圍中移除追蹤資訊
- 避免從其他範圍讀取時,從組合中移除衍生的狀態
- 在 SnapshotStateObserver 中使用更有效率的 removeScope()
- 清除組合中衍生狀態依附元件
- 修正可移動內容內的內部重組後 currentCompositeKeyHash 變更的問題
- 清除處理期間無效的組合
- 修正重組期間的衍生狀態讀取
- 修正觀察衍生狀態物件的記憶體流失
- 已修正 movableContent 複合雜湊索引鍵不一致的問題
- 修正 Compose 當機時的邊角案例
- 確保將群組強制設為無效時會強制重組
- 修正附有輸入的 rememberSaveable 進行還原時順序不正確的錯誤
1.2.0-rc03 版
2022 年 6 月 29 日
發布 androidx.compose.runtime:runtime-*:1.2.0-rc03
。1.2.0-rc03 版包含此連結所列的修訂項目。
修正錯誤
- 系統先前會一律將衍生狀態觀察作業,同時從重組範圍和組合作業中移除,以致損壞其他可能仍在觀察衍生狀態的範圍。這項變更讓系統只會在其他範圍不再觀察衍生狀態執行個體的情況下加以移除。(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) @ComposableTargetMarker
註解和標示@ComposableTarget
的註解現在可藉由加上@file
前綴,於檔案範圍使用。如果在檔案範圍使用目標註解,編譯器將假設檔案中的所有可組合函式都是用來指定相關 Applier。舉例來說,使用@file:UiComposable
即等同於宣告所有@Composable
函式皆指定 Compose UI Applier。如果函式需要指定其他套用器,必須針對想指定的套用器明確提供目標標記註解 (I40804)。
1.2.0-alpha08 版
2022 年 4 月 20 日
發布 androidx.compose.runtime:runtime-*:1.2.0-alpha08
。查看 1.2.0-alpha08 版的修訂項。
API 變更
- 將
TracingInProgress
新增至CompositionTracer
介面 (Ic6f12) - 將
recomposeScopeIdentity
新增至 Composer (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 協同程式 1.6.0 (I3366d)
1.2.0-alpha04 版
2022 年 2 月 23 日
發布 androidx.compose.runtime:runtime-*:1.2.0-alpha04
。查看 1.2.0-alpha04 版的修訂項。
API 變更
新增了
ComposableTarget
、ComposableTargetMarker
和ComposableOpenTarget
,這樣如果所呼叫的可組合函式指定了不適用的 Applier,就能在編譯時回報。在多數情況下,Compose 編譯器外掛程式能夠推論出註解,因此直接使用這些註解的情形應該相當罕見。無法推論的案例包括建立及使用自訂 Applier、抽象的可組合函式 (例如介面方法)、欄位,或是屬可組合 lambda 的全域變數 (本機變數和參數為推論得出),或在使用
ComposeNode
或相關的可組合函式時。對於自訂 Applier,呼叫
ComposeNode
或ReusableComposeNode
的可組合函式需要為函式和任何可組合的 lambda 參數類型新增CompoableTarget
註解。不過,與其直接使用ComposableTarget
,建議您建立以ComposableTargetMarker
加上註解的註解,再使用已標示的註解。使用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 的新呼叫進入組合,狀態和相關聯的節點就會移至新呼叫的位置。如未新增新呼叫,系統會永久移除對應的狀態。同時別忘了,觀察器會收到相關通知。如果在相同組合中多次呼叫
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 變更
- 將
identity
欄位新增至CompositionData
,以便在版面配置檢查器中產生不變的 ID。(Ic116e)
依附元件更新
- 現在依附於 Kotlin
1.6.10
。
1.1 版
1.1.1 版
2022 年 2 月 23 日
發布 androidx.compose.runtime:runtime-*:1.1.1
。1.1.1 版包含此連結所列的修訂項目。
修正錯誤
- 修正
androidx.compose.ui.platform.RenderNodeLayer.updateDisplayList
中的NullPointerException
(aosp/1947059、b/206677462) - 修正在 Android 上讀取剪貼簿時,由剪貼簿內容造成的當機問題 (I06020、b/197769306)
- 修正
LazyVerticalGrid
中的 RTL (aosp/1931080、b/207510535)
1.1.0 版
2022 年 2 月 9 日
發布 androidx.compose.runtime:runtime-*:1.1.0
。查看 1.1.0 版的修訂項。
自 1.0.0 版以來的重要變更
- 穩定支援 Android 12 的過度捲動效果
- 改善觸控目標縮放功能
- 請注意,為配合 Compose 1.0,Material Design 元件會擴大版面配置空間,以符合 Material Design 針對觸控目標尺寸所制訂的無障礙功能準則。舉例來說,即使您將觸控目標按鈕的尺寸設定為小於最小尺寸
48x48dp
,系統仍會將按鈕擴大為這個尺寸。這樣一來,Compose Material 的行為就會與 Material Design 元件相同,在混用 Views 和 Compose 時便可確保行為一致。利用 Compose Material 元件建立使用者介面時,這項異動還能確保達到觸控目標無障礙功能的最低要求。 - 穩定支援導覽邊欄
- 將先前推出的一些實驗性 API 升級為穩定版
- 支援更新版本的 Kotlin
1.1.0-rc03 版
2022 年 1 月 26 日
發布 androidx.compose.runtime:runtime-*:1.1.0-rc03
。1.1.0-rc03 版包含此連結所列的修訂項目。
修正錯誤
- 更新以支援 Compose Material
1.1.0-rc03
1.1.0-rc01 版
2021 年 12 月 15 日
發布 androidx.compose.runtime:runtime-*:1.1.0-rc01
。1.1.0-rc01 版包含此連結所列的修訂項目。
1.1.0-beta04 版
2021 年 12 月 1 日
發布 androidx.compose.runtime:runtime-*:1.1.0-beta04
。查看 1.1.0-beta04 版的修訂項。
新功能
- 更新為可與 Kotlin
1.6.0
相容
1.1.0-beta03 版
2021 年 11 月 17 日
發布 androidx.compose.runtime:runtime-*:1.1.0-beta03
。1.1.0-beta03 版包含此連結所列的修訂項目。
1.1.0-beta02 版
2021 年 11 月 3 日
發布 androidx.compose.runtime:runtime-*:1.1.0-beta02
。查看 1.1.0-beta02 版的修訂項。
API 變更
- 快照模式程式碼過去分割成多個檔案,但仍位於相同的 JVM 類別中。(Ic6c98)
1.1.0-beta01 版
2021 年 10 月 27 日
發布 androidx.compose.runtime:runtime-*:1.1.0-beta01
。1.1.0-beta01 版包含此連結所列的修訂項目。
1.1.0-alpha06 版
2021 年 10 月 13 日
發布 androidx.compose.runtime:runtime-*:1.1.0-alpha06
。查看 1.1.0-alpha06 版的修訂項。
API 變更
- 從必須跨模組呼叫的 Composer 方法中移除
InternalCompilerApi
(I1aa0b) Recomposer.state
已被淘汰,並由Recomposer.currentState
取代,以便將其類型變更為 StateFlow (Ic2ab3、b/197773820)
1.1.0-alpha05 版
2021 年 9 月 29 日
發布 androidx.compose.runtime:runtime-*:1.1.0-alpha05
。1.1.0-alpha05 版包含此連結所列的修訂項目。
1.1.0-alpha04 版
2021 年 9 月 15 日
發布 androidx.compose.runtime:runtime-*:1.1.0-alpha04
。1.1.0-alpha04 版包含此連結所列的修訂項目。
1.1.0-alpha03 版
2021 年 9 月 1 日
發布 androidx.compose.runtime:runtime-*:1.1.0-alpha03
。1.1.0-alpha03 版包含此連結所列的修訂項目。
新功能
- Compose Compiler 現在支援舊版的 Compose Runtime (1.0)。在這項變更之前,Compose Compiler 只能與相同或後續版本的 Compose Runtime 相容。這項變更生效後,Compose Compiler 就能與舊版的 Compose Runtime (1.0) 相容 (aosp/1796968)
- 已更新 Compose
1.1.0-alpha03
,使其依附 Kotlin1.5.30
。(I74545)
1.1.0-alpha02 版
2021 年 8 月 18 日
發布 androidx.compose.runtime:runtime-*:1.1.0-alpha02
。1.1.0-alpha02 版包含此連結所列的修訂項目。
1.1.0-alpha01 版
2021 年 8 月 4 日
發布 androidx.compose.runtime:runtime-*:1.1.0-alpha01
。1.1.0-alpha01 版包含此連結所列的修訂項目。
1.0 版
1.0.5 版
2021 年 11 月 3 日
發布 androidx.compose.runtime:runtime-*:1.0.5
。1.0.5 版包含此連結所列的修訂項目。
修正錯誤
- 修正追蹤 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 Release 網誌!
已知問題
如果使用的是 Android Studio Bumblebee Canary 4 或 AGP
7.1.0-alpha04
/7.1.0-alpha05
,則可能會遇到下列當機情形:java.lang.AbstractMethodError: abstract method "void androidx.lifecycle.DefaultLifecycleObserver.onCreate(androidx.lifecycle.LifecycleOwner)"
如需修正這個問題,請暫時將
build.gradle
檔案中的 minSdkVersion 提高到 24 以上。Android Studio Bumblebee 和 AGP7.1
的下一個版本會修正這個問題 (b/194289155)
1.0.0-rc02 版
2021 年 7 月 14 日
發布 androidx.compose.runtime:runtime-*:1.0.0-rc02
。1.0.0-rc02 版包含此連結所列的修訂項目。
- 修正 SnapshotStateObserver 會造成突發 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 版包含此連結所列的修訂項目。
新增的設定檔規則
這個版本將設定檔規則新增至下列撰寫模組 (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>
是H
、S
和P
之中的一或多個字元,用於指出這個方法應標記為「Hot」、「Startup」或「Post Startup」。<CLASS_DESCRIPTOR>
是指定方法所屬的類別描述元。舉例來說,androidx.compose.runtime.SlotTable
類別的描述元是Landroidx/compose/runtime/SlotTable;
。<METHOD_SIGNATURE>
是方法的簽名,含有該方法的名稱、參數類型和傳回類型。舉例來說,LayoutNode
上的fun isPlaced(): Boolean
方法含有isPlaced()Z
簽名。這些模式可包含萬用字元 (
**
、*
和?
),以便讓單一規則涵蓋多種方法或類別。
規則的用途
方法中如果帶有
H
標記,表示這個方法是「Hot」方法,應該預先完成編譯。方法中如果帶有
S
標記,表示這是系統會在啟動時呼叫的方法,應該預先完成編譯,以免啟動時耗費資源處理編譯作業及解析方法。方法中如果帶有
P
標記,表示這是系統在啟動之後才會呼叫的方法。如果類別顯示在這個檔案中,表示系統會在啟動期間使用該類別,因此應該要事先在堆積中分配該類別,以免耗費載入類別的成本。
運作方式
- 程式庫可以定義這些規則,並會包裝於 AAR 構件中。接著,系統會在建構包含這些構件的應用程式時,將這些規則合併起來,然後使用合併後的規則建構該應用程式專屬的精簡二進位 ART 設定檔。當該應用程式安裝在裝置上時,ART 便可以利用這個設定檔預先編譯特定應用程式子集,以提高應用程式效能,特別是首次執行的效能。請注意,這項設定不會對可偵錯的應用程式產生任何影響。
1.0.0-beta08 版
2021 年 6 月 2 日
發布 androidx.compose.runtime:runtime-*:1.0.0-beta08
。1.0.0-beta08 版包含此連結所列的修訂項目。
API 變更
State<T>
現在是State<out T>
(I69049)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)
修正錯誤
- 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)
修正錯誤
- 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 版包含此連結所列的修訂項目。
修正錯誤
在這項變更之前,系統會依據對應參數略過本機可組合函式。在此變更之後,系統就不會略過任何本地可組合函數。之所以要做這樣的更改,是因為本地函數通常會擷取父項參數,而略過參數是常見的錯誤原因。
總結來說,建議您參考以下範例:
@Composable fun Counter(count: Int, onCountChange: (Int) -> Unit) { @Composable fun ShowCount() { Text("Count: $count") } ShowCount() Button(onClick={ onCountChange(count + 1) }) { Text("Increment") } }
在此變更之前,即使
count
參數已更新,ShowCount
可組成的函數也會一律略過。不過現在已非如此。(I5648a)修正了
rememberSaveable()
會在與輸入參數搭配使用時將舊值還原的問題 (I1b110、b/182403380)
1.0.0-beta03 版
2021 年 3 月 24 日
發布 androidx.compose.runtime:runtime-*:1.0.0-beta03
。1.0.0-beta03 版包含此連結所列的修訂項目。
API 變更
- 淘汰
DefaultMonotonicFrameClock
。現在呼叫無MonotonicFrameClock
的withFrameNanos
或Recomposer.runRecomposeAndApplyChanges
會擲回IllegalStateException
(I4eb0d)
1.0.0-beta02 版
2021 年 3 月 10 日
發布 androidx.compose.runtime:runtime-*:1.0.0-beta02
。查看 1.0.0-beta02 版的修訂項。
修正錯誤
- 強制限制實驗 API 的公開使用行為 (I6aa29、b/174531520)
- 修正在導覽構成目的地中使用無效
rememberSaveable { mutableStateOf(0) }
的問題。(I1312b、b/180042685、b/180701630)
1.0.0-beta01 版
2021 年 2 月 24 日
發布 androidx.compose.runtime:runtime-*:1.0.0-beta01
。1.0.0-beta01 版包含此連結所列的修訂項目。
這是 Compose 1.0.0 Beta 版的第一個版本。
API 變更
- 新增
Recomposer.runRecomposeConcurrentlyAndApplyChanges
實驗性 API,以在主要畫面迴圈中重組無效的組合。(I342d0) - 任何標記為 @ReadOnlyComposable 的可組合項現在會驗證編譯時間,確保這些可組合項只會呼叫其他 @ReadOnlyComposable (I58961)
compositionLocalOf
和staticCompositionLocalOf
的defaultFactory
現在是必要元素,而非選用元素。如未提供預設工廠,這項變更可移除非空值的潛在類型錯誤。以前,這會為非空值的類型提供空值的參照。
如果是可為空值類型,請考慮提供
{ null }
做為預設工廠。除非能提供合理的預設值,否則我們不建議搭配不可為空值類型使用本機。如果沒有任何可行的預設值,
defaultFactory
lambda 應擲回例外狀況。不過,擲回例外狀況代表本機取用者會有隱含的依附元件,前提是該元件不會由類型系統強制執行 (Ifbd2a)。淘汰的符號已從 Compose 執行階段中移除 (I3252c)
已移除淘汰的
emptyContent()
。請改用{}
(Idb33f、b/179432510)。Provider 已重新命名為 CompositionLocalProvider
- Composition 建構函式不再接受索引鍵參數,且已淘汰。
- currentCompositeKeyHash 已變成可組合的頂層屬性,而非可組合的頂層函式。
- CompositionData 和 CompositionGroup 已移至 androidx.compose.runtime.tooling 命名空間
- ComposableLambda 已成為介面而非具體類別,並且不再有類型參數。
- ComposableLambdaN 已成為介面而非具體類別,並且不再有類型參數。
- snapshotFlow 函式已移至 androidx.compose.runtime 命名空間。
- SnapshotMutationPolicy 的合併方法不再是實驗性功能
- 已移除 @TestOnly 頂層 clearRoot 函式,因為不再需要使用。
- 已移除 keySourceInfoOf 和 resetSourceInfo 函式,因為不再需要使用。
- 已移除 Composer.collectKeySourceInformation,因為不再需要使用。
- 已移除 isJoinedKey、joinedKeyLeft 和 joinedKeyRight 方法。因為不再需要使用。
- 重新整理多個頂層 API,分別歸類到不同的檔案中。由於 Kotlin 的檔案類別語意的關係,此舉會破壞二進位檔案相容性,但不影響原始碼相容性,因此對大多數使用者而言應不成問題
- (I99b7d、b/177245490)
SnapshotStateObserver 已不再是實驗版 (Id2e6a)
刪除一些已淘汰的 API (Ice5da、b/178633932)
已進行下列 Material API 變更:
- 已將 contentPAdding 參數新增至 Top/BottomAppBar,以自訂預設邊框間距。
- 已依據 API 指南重新調整 BackdropScaffold 中的參數順序,將必要參數置於選用參數之前。
- 已將 BottomNavigationItem 中的
icon
參數移至selected
和onClick
之後。 - 已將 BottomNavItem 中的
alwaysShowLabels
參數重新命名為alwaysShowLabel
。 - 在幾個元件中將
bodyContent
參數重新命名為content
。 - 已將
ButtonDefaults.buttonColors()
中的參數重新排序。請注意,由於參數類型維持不變,因此不會造成您的程式碼產生錯誤。請務必使用具名參數或是手動更新順序,否則您的程式碼將無法正常運作。 - 已將
secondaryVariant
參數新增至darkColors()
。此顏色通常與深色主題中的secondary
相同,但新增這個參數是為了保持一致性和進一步自訂功能。 - 已從公用 API 介面中移除 ElevationDefaults 和 animateElevation(),因為這些項目不常用或不實用。
- 已將
Slider
中的onValueChangeEnd
重新命名為onValueChangeFinished
,並將該值設為可為空值。 - 為求一致,請將
Snackbar
中的text
參數重新命名為content
。 - 已將
contentPadding
參數新增至DropdownMenuItem
,以自訂預設邊框間距,並將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)
- 重新命名 Ambients,以便符合 Ambient -> CompositionLocal 重新命名規則。Ambient 原本名為 AmbientFoo,現在已將 CompositionLocal 命名為 LocalFoo。(I2d55d)
- 已將 Ambient 重新命名為 CompositionLocal,environmentenvironmentOf / staticAmbientOf 則重新命名為 lightLocal / staticCompositionLocalOf。此變更有助於讓 CompositionLocal 的用途更明確:提供/擷取本機值至組合的機制。CompositionLocal 執行個體應加上
Local
的前綴,例如 val LocalFoo = compositionLocalOf { Foo() }。(Ia55b6) - takeMutableSnapshot 和 takeSnapshot 已變更為 Snapshot 的隨附方法。(I91f19)
@ComposableContract
已淘汰,並改用三個更具體的註解。@ComposableContract(restartable = false)
已變成@NonRestartableComposable
@ComposableContract(readonly = true)
已變成@ReadOnlyComposable
@ComposableContract(preventCapture = true)
已變成@DisallowComposableCalls
@ComposableContract(tracked = true)
已移除。(I60a9d)emptyContent() 和 (@Composable () -> Unit).orEmpty() 公用程式已經淘汰,因為已經不再有良好的效能影響力或價值 (I0484d)
snapshotFlow
和withMutableSnapshot
不再是實驗性質。(I6a45f)Recomposer 現在可以關閉。封閉的重組工具將繼續調整,直到構成的子項協同程式完成為止。 將 Recomposer.shutDown 重新命名為「cancel」,以便與關閉對照 (Ib6d76)。
compose:runtime-dispatch
構件現已淘汰。目前可在 Compose:Runtime 中找到 MonotonicFrameClock,而 AndroidUiDispatcher 則可在 compose:ui 中找到。(Ib5c36)Compose 編譯器外掛程式指定的 API 已經重構為採用介面,而不是具體類別。此外,介面也不會再使用類型參數。
這項內部變更應該不會影響原始碼相容性,但屬於二進位破壞性變更 (I3b922、b/169406779)
加入 SnapshotMutableState (Icfd03)
DisposableEffectDisposable 已重新命名為 DisposaleEffectResult (Ica7c6)
移除了 Recomposer.current()。[Abstract]ComposeView 現已預設為延遲建立、以視窗為範圍的 Recomposer,並由視窗的 ViewTreeLifecycleOwner 所驅動。主機的 Lifecycle 停止時,Recomposition 和以 withFrameNanos 為基礎的動畫滴答會暫停。(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 和 DisposableEffect API (If760e)
- emit() API 和所有超載已淘汰,並重新命名為 ComposeNode。這些 API 是相同的,只是為了遵循 Compose 的命名慣例而使用了不同的名稱 (I4137b)
- 現已淘汰 invalidate 和 ContentReference(),並改用 CurrentRecomposeScope 和 RememberCompositionReference。(I583a8)
CompositionLifecycleObserver 現已淘汰,取而代之的是 RememberObserver。
RememberObserver
是用修改後的語意和重新命名方法取代的CompositionLifecycleObserver
。針對只記錄一次的物件,您可以不假思索地改為使用新的 API,這是不變的建議做法。不過,如果參照在某個組合中已有多次記錄,系統會針對每個只呼叫一次onEnter
的參照呼叫onRemembered
。如果子組合 (例如WithConstraints
和Scaffold
) 使用該物件,則會多次呼叫onEnter
,導致無法保證能穩定地單次呼叫onEnter
,因此已將其從RememberObserver
中移除。RememberObserver
新增onAbandoned
,如果RememberObserver
執行個體是從傳遞至remember
的回呼所傳回,但未記錄在組合狀態中,並因此一律不會呼叫onRemembered
,這時就會呼叫此新增項目。之所以會這樣,可能是因為例外狀況在組合完成前終止組合,或是因為產生組合的狀態已過時 (或基於其他原因不再需要使用),導致組合遭到捨棄。如果按照上述單一參照建議提供的RememberObserver
執行個體追蹤了外部資源,則onForgotten
和onAbandoned
都表示不再需要資源。如果物件正在追蹤onRemembered
中啟動的工作或配置的資源,則可以忽略onAbandoned
,因為呼叫onRemembered
之後便不會對其發出呼叫 (I02c36)請勿將
collectAsState()
函式標示為內嵌 (Ia73e4)
修正錯誤
- 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 版包含此連結所列的修訂項目。
破壞性變更
所有
@Composable
函式都執行完畢後,可透過重新建構內部編譯器 API,針對進入「套用變更」組合階段所產生的節點進行批次變更。這是一項可能會影響應用程式程式碼的破壞性行為變更,因為在套用完變更之前,您都無法透過內部和實驗性 API 使用節點。這種情況通常可以採取以下變通方法:在
SideEffect
可組合項中使用這類依附元件包圍程式碼,藉此延遲程式碼的執行作業,直到節點建立並完成初始化作業。(I018da)
API 變更
- 加入重組工具已經套用變更時的追蹤方式 (I1b3e2)
展開 [Abstract]ComposeView API,回收以 Compose 為基礎的檢視畫面,處理其組合以便日後重新建立。新增 API,可用於安裝及探索視窗範圍的 Recomposers 和 CompositionReferences,以便建立子組合。
新增 ViewCompositionStrategy,可用於設定 [Abstract]ComposeViews 的組合處理策略;預設行為是在視窗卸離時丟棄 (I860ab)
修正錯誤
- 重組工具現在會呈現目前狀態的流程,以便監控其活動及相關成效的活動。(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。這些項目先前被標示為 InternalInternalAPI。現在是撰寫模組的內部。
為了取代 ui-tooling API 而新增 CompositionData 和 CompositionGroup,用於擷取組合資訊。這些是公開工具,但不適合在 ui-tooling API 外使用,因為這些工具會提供由 ui-tooling API 解讀的原始資訊 (I31a9c)
Applier 類別不再視為 (Id85b0)
Applier
介面經過變更,將樹狀結構建構方式從由上往下簡化為由下往上。insert()
方法已重新命名為insertTopDown()
。加入新的方法
insertBottomUp()
。套用器會根據效能表現選用
insertTopDown()
或insertBottomUp()
,將節點插入目前編輯的樹狀結構。對某些樹狀結構 (例如
LayoutNode
和View
) 而言,由下往上的建構方式會比由上往下更有效率。在這項變更之前,如要實作由下而上建構作業,您需要先插入一些堆疊,並必須將其複製到每個需進行由下而上效能建構作業的套用器。這項變更實施後,Applier
會覆寫insertBottomUp()
以由下往上建構樹狀結構,而覆寫insertTopDown()
則會由上往下建構樹狀結構。(Icbdc2)Compose 支援能執行可組合叫用的屬性 getter。系統對這項支援仍維持不變,但是已變更用於將屬性 getter 宣告為 @Composable 的語法。
現已淘汰的語法是透過將屬性本身加上註解來進行宣告:
@Composable val someProperty: Int get() = ...
現行正確的語法是透過將屬性的 getter 加上註解來進行宣告:
val someProperty: Int @Composable get() = ...
這兩種語法將可同時運作一段時間,但系統最終會將先前淘汰的語法視為編譯錯誤。(Id9197)
修正錯誤
- AndroidOwner 內部 (Ibcad0、b/170296980)
- subcomposeInto(LayoutNode) 已設為內部 (Id724a)
1.0.0-alpha08 版
2020 年 12 月 2 日
發布 androidx.compose.runtime:runtime-*:1.0.0-alpha08
。1.0.0-alpha08 版包含此連結所列的修訂項目。
API 變更
- 新增了針對可組合 lambda 參數命名方式和位置的 Lint 檢查,以檢查是否與 Compose 準則一致。另外也根據 Lint 檢查和指引,將部分使用
children
做為結尾 lambda 名稱的 API 遷移至content
(Iec48e) - 重組工具不再接受 EmbeddingContext;系統會從 performanceCoroutineContext 取得必要的排程依附元件。FrameManager 已淘汰;平台在進行整合時應初始化本身的全域快照處理程序 (I02369)。
- RestorableStateHolder.withRestorableState 函式已重新命名為 RestorableStateProvider (I66640)
修正錯誤
- 已淘汰名稱後綴為
Ambient
的環境 (Ambient) 屬性,並按照其他 Ambient 和 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 做為提供環境的替代方法,可僅針對未提供任何環境值的情況指定環境值。(Id6635、b/171024925)
- 將 LaunchedTask 重新命名為 LaunchedImpact,以便與 SideImpact 和 Disposableimpact API 保持一致。為鼓勵採用最佳做法,系統不允許使用不含主題參數的 LaunchedEffect (Ifd3d4)
- Applier 現已有 onBeginChanges/onEndChanges 回呼,並可在 Composer 開始/結束將變更套用至樹狀結構時被叫用。如有需要,這些可用於批次處理資源管理。(Icf476)
- 現在,重組工具在進行建構時需要 CoroutineContext (Ic4610)
- 對內部 SlotTable 實作所做的變更,並不會影響公用 API。(If9828)
- 移除不使用初始值且已淘汰的 rxjava2 轉接程式 (Idb72f)
修正錯誤
- 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 counterpart API 至 SideEffect,使用所需的 onDispose 補足 onCommit-with-params 的角色。
- 新增了 rememberUpdatedState API,以發布重組的資料至持續進行或長期進行的程序,例如 DisposableEffects 或 LaunchedTasks。
- (Id50b9)
- MutableVector 現在會實作 RandomAccess (I85d73、b/170461551)
- 新增了 SideEffect 可組合項,以套用組合的副作用至組合管理的物件。SideEffect 的用途是取代 onCommit 可組合項。(Ia77c2)
- 新增實驗性 API RestorableStateHolder。這可允許儲存以「savedInstanceState」和「rememberSavedInstanceState」定義的子樹狀結構狀態,然後才進行處理,以於下次使用還原的狀態再次組合 (I66884、b/166586419)
修正錯誤
- 在 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() 方法。將重組工具的 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)
修正錯誤
- foundation.Box 已淘汰。請改用 foundation.layout.Box。(Ie5950、b/167680279)
1.0.0-alpha03 版
2020 年 9 月 16 日
發布了 androidx.compose.runtime:runtime-*:1.0.0-alpha03
。1.0.0-alpha03 版包含此連結所列的修訂項目。
API 變更
CompositionCoroutineScope
已不再實作MonotonicFrameClock
。withFrameNanos
的呼叫端應明確匯入頂層函式。(Icb642、b/166778123)。
修正錯誤
onNode
或waitForIdle
等全域測試函式現已淘汰,請改用依據 ComposerTestRule 定義的新對應函式 (I7f45a)launchInComposition
不會再啟動未指派的協同程式 (Ief6af、b/166486000)
1.0.0-alpha02 版
2020 年 9 月 2 日
發布了 androidx.compose.runtime:runtime-*:1.0.0-alpha02
。1.0.0-alpha02 版包含此連結所列的修訂項目。
API 變更
- 新增消耗和產生快照資料變更使用的
snapshotFlow
和withMutableSnapshot
API。(I3e722) 可組合函式的呼叫慣例已變更。這是二進位檔破壞性變更。所有程式庫都必須重新編譯,才能與這個版本的 Compose 編譯器外掛程式搭配使用。
這項變更不會對原程式碼層級產生重大影響,因為只有已變更的 API 屬於明確選擇啟用的編譯器 API。(I7afd2、b/158123185)。
從 EmbeddingContext (I7b9be) 中移除排程方法
OnPreCommit 已淘汰,onCommit 的效用現在與 onPreCommit 相同。
現在,onCommit 和 onActive 會在已提交組合變更的同一個 Choreographer 畫面中執行,而不是在下一個 Choreographer 畫面開始時執行。(I70403)
1.0.0-alpha01 版
2020 年 8 月 26 日
發布了 androidx.compose.runtime:runtime-*:1.0.0-alpha01
。1.0.0-alpha01 版包含此連結所列的修訂項目。
0.1.0-dev 版
0.1.0-dev17 版
2019 年 8 月 5 日
發布了 androidx.compose.runtime:runtime-*:0.1.0-dev17
。0.1.0-dev17 版包含此連結所列的修訂項目。
API 變更
- 自訂輸出項目現在可以宣告將其一或多個 setter 設為可略過,並在該輸出項目外獨立進行重組 (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)
修正錯誤
emitView
已淘汰。請盡可能使用AndroidView
,在 Compose 中產生 View。請注意,系統日後將不再支援直接組合 View 和 ViewGroup 的做法,除非這是組合樹狀結構的一部分,且能透過 AndroidView 完成這項作業 (I29b1e、b/163871221)。
0.1.0-dev16 版
2020 年 8 月 5 日
發布了 androidx.compose.runtime:runtime-*:0.1.0-dev16
。0.1.0-dev16 版包含此連結所列的修訂項目。
API 變更
mutableStateOf()
、ambientOf()
和savedInstanceStateOf()
的預設異動原則已變更為structuralEqualityPolicy()
,而不是referentialEqualityPolicy()
。原本的預設是將決定指派給
mutableStateOf()
執行個體的新值視為變更,現在的預設是使用==
,而不是使用===
。請參閱 https://kotlinlang.org/docs/reference/equality.html
ambientOf()
和savedInstanceStateOf()
會在其實作中使用mutableStateOf()
,因此變更為與mutableStateOf()
一致。以更符合開發人員預期的方式使用結構等式。
例如:
val state = mutableStateOf(1f)
然後,
state.value = 1f
不會再將變更視為
state
,而且在組合期間使用state
也不再需要重組。這是一項突破性的變更,但在大多數情況下 (例如:使用不會覆寫
equals()
的類別時),這不會在應用程式中有明顯的影響。確實會覆寫
equals()
的類別 (例如data
類別) 可能會出現效能降低的情形,原因在於現在當這些類別的equals()
方法指派給mutableStateOf()
時,系統預設會呼叫這些方法。只要在對
mutableStateOf()
、ambientOf()
和savedInstanceStateOf()
的呼叫中新增政策參數policy = referentialEqualityPolicy()
,即可還原先前的行為。(Ic21a7)Row
和Column
現在是內嵌函式,可大幅減少使用這些項目的負擔。(I75c10)
修正錯誤
- setViewContent 已淘汰,現應改用 setContent。(I7e497、b/160335130)。
新增了 MonotonicFrameAnimationClock,讓您可使用 MonotonicFrameClock 做為 AnimationClockObservable,以消除協同程式型新版時鐘與仍使用回呼型舊版時鐘的 API 之間的差異。
MonotonicFrameClock 等同於 ManualAnimationClock,現在為 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 版包含此連結所列的修訂項目。
依附元件更新
- 如要使用
0.1.0-dev15
版的 Compose,您必須依據上方「宣告依附元件」一節所示的新程式碼片段更新依附元件。
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
屬性取代為var
屬性,並使用mutableStateOf
做為屬性委派項目。這樣做的好處是,類別的使用方式將完全不變更,只有類別內部的實作需要。不過,這個行為模式與原始範例不完全相同,因為現在每個屬性都是個別接受觀察/訂閱,因此重構完成後顯示的重組可能範圍更小 (這是好現象)。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 (也就是「key」整數),是用於透過呼叫傳播中繼資料的位元遮罩整數。
Compose 也會將預設引數轉換為可組合的函式。此舉不會引入函式本身的額外合成預設超載,因此這項變更將導致接受定義的函式變少。
由這種情況產生的已知預期行為變更:
- 部分呼叫會略過先前不會略過的部分
- 系統現可正確訂閱及處理預設引數運算式中的可組合運算式
這項工作包含以下最佳化作業: 1. 參數的比較結果會透過呼叫圖傳播到其他可組合函式。這將導致執行階段的比較項目更少、縮減運算單元資料表的大小,以及略過更多先前未略過的可組合函式。 2. 系統在執行階段不會再比較或儲存在編譯時間判定為「靜態」的參數。這樣可以減少比較項,並縮減運算單元資料表的大小。 3. 函式主體的控制流結構可用於盡可能減少產生的群組數量。這麼做可減少運算單元資料表大小,並降低執行階段 4 的工作負擔。如果未在函式主體內使用調度和接收器參數,則在判斷函式是否可略過時不會將這些參數納入考量。
多數破壞性變更都是針對編譯器直接指定的 API,因此不會影響 Compose 的一般使用情形: 1. Composer::startExpr 已移除 2. Composer::endExpr 已移除 3. Composer::call 已淘汰 4. 已移除
key
的非變化版本超載。往後請使用vararg
版。5. Pivotal 註解已淘汰。請改為使用key
。6. ScopeUpdateScope::updateScope 已變更為 Function3 而非 Function1 7. restartableFunction 和 restartableFunctionN 已更新為包含其他編譯時間參數 (I60756、b/143464846)將 sortWith 和 removeRange 新增至 MutableVector (Icccf7)
新增了 CompositionLifecycleObserver 的預設方法實作 (I24289)
Applier 現在必須使用 clear() 方法來棄置組合 (Ibe697)
已在 MutableVector 中新增了 asMutableList(),讓此函式可在無需複製整個清單的情況下傳送至公用 API。(I298df)
新增了 RememberCoroutineScope(),可用於取得在組合中託管的 CoroutineScope,以便啟動工作來回應事件。(I0e264)
MutableVector 是新的集合,不會實作任何標準 Collection 介面。此集合可帶來高於其他要求的速度,而且僅供內部實作使用。(I8ebd6)
已暫時移除
StableMutableList
和StableMutableMap
,避免 Compose 所需的 Kotlin 版本發生問題。這些介面將在 Compose 更新為沒有問題的 Kotlin 版本時重新加入。SnapshotStateList
和SnapshotStateMap
現已公開,但會在StableMutableList
和StableMutableMap
還原後淘汰。(Ia7769)新增頂層 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)。「觀察」已不能成為實用的抽象層。如果需要複製,其實作可透過直接建立執行可組合項 lambda 參數的可組合函式取代。例如:
@Composable fun Observe(body: @Composable () -> Unit) = body()
(I40d37)@Direct 已淘汰,並改用 @ComposableContract(restartable=false) (If4708)
為最近引入的 StateFlow 新增轉接程式,以便預先填入初始值,讓傳回的狀態不可為空值 (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 已淘汰,請改用
setContent
或setViewContent
。Compose.disposeComposition 已淘汰,請改為對setContent
傳回的Composition
使用dispose
方法。 androidx.compose.Compose.subcomposeInto 已移至 androidx.ui.core.subcomposeInto ComponentNode#emitInsertAt 已重新命名為 ComponentNode#insertAt ComponentNode#emitRemoveAt 已重新命名為 ComponentNode#removeitModeAt ComponentNode#emitMode 已重新命名為 ComponentNode#move (Idef00)將
ComposeFlags.COMPOSER_PARAM
標記更新為true
,這會變更 Compose 外掛程式的程式碼產生策略。大致上來說,這會導致系統產生附加合成參數的 @Composable 函式,這個參數會傳遞至後續的 @Composable 呼叫中,藉此讓執行階段妥善管理執行作業。這是二進位檔的重大破壞性變更,但應在所有 Compose 的合法使用情況中,保留來源層級的相容性。(I7971c)對環境 API 做出破壞性變更。詳情請參閱記錄和
Ambient<T>
說明文件 (I4c7ee、b/143769776)新增了 ui-livedata - 專為 LiveData 設計的新構件 (有轉接程式)。使用範例:val value by liveData.observeAsState() (Ie9e8c、b/150465596)
不含明確初始值的 Rx 轉接程式已淘汰。使用空值不一定是最佳預設值,舉例來說,假如您使用的是 List,最好開頭是 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)
修正錯誤
runOnIdleCompose
已重新命名為runOnIdle
(I83607)- 已將 LayoutNode 設為實驗性 API (I4f2e9)
- androidx.ui.foundation.TextFieldValue 和 androidx.ui.input.EditorValue 已淘汰。使用該類型的 TextField、FilledTextField 和 CoreTextField 可組合項也已淘汰。請改用 androidx.ui.input.TextFieldValue (I4066d、b/155211005)
- 移除已淘汰的 DrawBackground API,改為透過修飾詞提供 drawBackground 擴充功能。重構色彩、筆刷與繪製 drawBackground 的實作,減少程式碼路徑,並移除建立 Modifier 做為部分組成元件的要求。(I0343a)
- 已更新較高層級的 Composer API,將原有顯示 Canvas 改為顯示 CanvasScope。如此一來,取用者就不必維護自己的 Paint 物件。如果取用者仍要求 Canvas 存取權,則可以使用 drawCanvas 擴充功能方法,這種方法可提供回呼,透過基礎 Canvas 發出繪圖指令 (I80afd)。
- WithConstraints 結尾的 lambda API 已變更。現在,除了兩個參數外,這還具有接收器範圍。除了能夠設定限制與 layoutDirection 之外,該範圍還可以提供 Dp 中的 minWidth、maxWidth、minHeight 和 maxHeight 屬性 (I91b9a、b/149979702)
- 新增了對稱式邊框間距修飾詞。(I39840)
- 已更新 wrapContentWidth 和 wrapContentHeight 必須使用垂直或水平對齊,而非使用任何對齊。引力調整器已更新為接受垂直或水平對齊。更新 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)。 - 將修飾詞和運算子替換成工廠擴充功能函式 (I225e4)
- RowScope 和 ColumnScope 構件現在已可從 Row 和 Column 之外存取。(I3a641)
- 將 LayoutFlexible 重新命名為 LayoutWeight。將 tight 參數重新命名為 fill。(If4738)
- WithConstraints 取得 LayoutDirection 參數 (I6d6f7)
- 已將 background 重新命名為 DrawBackground,並成為預設加以記憶 (Ia0bd3)
- 以不同函式取代 ButtonStyle,並移除文字 (字串) 超載。如需使用資訊,請參閱更新後的範例。(If63ab、b/146478620、b/146482131)
runOnIdleCompose
和runOnUiThread
現已成為全域函式,而非 ComposeTestRule 中的方法 (Icbe8f)
外部貢獻
- 從 Compose 執行階段移植層移除不需要的 API,例如 Looper 和 Handler (I6847d)
- 淘汰沒有初始值的
Flow<T>.collectAsState()
。請改用StateFlow<T>
,或傳遞明確的初始值。(I63f98、b/157674865)