Compose 執行時間

Compose 的程式設計模型和狀態管理的基礎建構模塊,以及 Compose Compiler 外掛程式指定的核心執行階段。
最近更新時間 穩定版 候選版 Beta 版 Alpha 版
2022 年 9 月 7 日 1.2.1 - 1.3.0-beta02 -

結構

Compose 是由 androidx 中的 7 個 Maven 群組 ID 所組成。每個群組都包含一個指定功能子集,且各有一組專屬的版本資訊。

下表提供各群組的說明和每組版本資訊的連結。

群組說明
compose.animation在其 Jetpack Compose 應用程式中建構動畫,以提供豐富的使用者體驗。
compose.compiler透過 Kotlin 編譯器外掛程式轉換 @Composable 函式,並啟用最佳化功能。
compose.foundation透過現成可用的建構區塊編寫 Jetpack Compose 應用程式,並擴充基礎以建構您自己的設計系統元件。
compose.material運用現成可用的質感設計元件建構 Jetpack Compose UI。這是更高層級的 Compose 進入點,用意是確保提供的元件與 www.material.io 上所述元件相符。
compose.material3運用新一代的質感設計 3 元件建構 Jetpack Compose UI。質感設計 3 內有新的主題設定和元件,以及動態色彩等 Material You 個人化功能,與全新的 Android 12 視覺風格及系統 UI 呼應。
compose.runtimeCompose 的程式設計模型和狀態管理的基礎建構區塊,以及 Compose Compiler 外掛程式指定的核心執行階段。
compose.ui與裝置互動所需的 Compose UI 基礎元件,包括版面配置、繪圖及輸入。

宣告依附元件

如要新增 Compose 的依附元件,必須將 Google Maven 存放區新增至您的專案。詳情請參閱「Google 的 Maven 存放區」一節。

在應用程式或模組的 build.gradle 檔案中,新增您需要的構件依附元件:

Groovy

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

android {
    buildFeatures {
        compose true
    }

    composeOptions {
        kotlinCompilerExtensionVersion = "1.3.0-rc01"
    }

    kotlinOptions {
        jvmTarget = "1.8"
    }
}

Kotlin

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

android {
    buildFeatures {
        compose = true
    }

    composeOptions {
        kotlinCompilerExtensionVersion = "1.3.0-rc01"
    }

    kotlinOptions {
        jvmTarget = "1.8"
    }
}

如要進一步瞭解依附元件,請參閱「新增建構依附元件」一文。

意見回饋

您的意見可協助我們改善 Jetpack。發現新的問題或有改善這個程式庫的想法時,請告訴我們。建立新的問題之前,請先查看這個程式庫中的現有問題。只要按一下星號按鈕,即可投票給現有的問題。

建立新問題

詳情請參閱 Issue Tracker 說明文件

執行階段追蹤記錄 1.0 版本

1.0.0-alpha01 版本

2022 年 9 月 7 日

發布 androidx.compose.runtime:runtime-tracing:1.0.0-alpha011.0.0-alpha01 版本包含以下修訂項目。

新功能

  • androidx.compose.runtime:runtime-tracing 是一種程式庫,在即將推出的工具提供支援,可在 Compose 應用程式中進行擴充追蹤記錄。此初始版本為 1.0.0-alpha01。

1.3 版本

1.3.0-beta02 版本

2022 年 9 月 7 日

發布 androidx.compose.runtime:runtime-*:1.3.0-beta021.3.0-beta02 版本包含以下修訂項目。

修正錯誤

1.3.0-beta01 版本

2022 年 8 月 24 日

發布 androidx.compose.runtime:runtime-*:1.3.0-beta011.3.0-beta01 版本包含這些修訂版本。

API 變更

  • CompositionData 中新增 find 方法,讓使用這個 API 的開發人員工具能利用組合 ID,快速找出組合的子群組。(I5794f)

1.3.0-alpha03 版本

2022 年 8 月 10 日

發布 androidx.compose.runtime:runtime-*:1.3.0-alpha031.3.0-alpha03 版本包含以下修訂項目。

1.3.0-alpha02 版本

2022 年 7 月 27 日

發布 androidx.compose.runtime:runtime-*:1.3.0-alpha021.3.0-alpha02 版本包含這些修訂版本。

API 變更

  • 為回溯相容性而新增 ComposerKt.traceEventStart(Int, String) (I6e6de)

1.3.0-alpha01 版本

2022 年 6 月 29 日

發布 androidx.compose.runtime:runtime-*:1.3.0-alpha011.3.0-alpha01 版本包含以下修訂項目。

API 變更

  • 將公用程式功能移至執行階段 (I4f729)

1.2 版本

1.2.1 版本

2022 年 8 月 10 日

發布 androidx.compose.runtime:runtime-*:1.2.11.2.1 版本包含以下修訂項目。

修正錯誤

  • 修正記憶體流失問題:處置從透明數據匯報建立的巢狀數據匯報 b/239603305

1.2.0 版本

2022 年 7 月 27 日

發布 androidx.compose.runtime:runtime-*:1.2.01.2.0 版本包含以下修訂項目。

1.1.0 以來的重要異動

  • Compose Runtime 在 1.2.0 中引入了一些功能,另外還有許多穩定的錯誤修正。最重要的新功能是加入 movableContentOf API,此 API 可用於啟用複雜的使用者體驗,例如:共用元素轉換。movableContentOf API 可將可組合 lambda 轉換為另一種 lambda,後者會將其狀態和對應的節移至呼叫其新位置。如果先前的呼叫離開組合,狀態會暫時保留,如果對 lambda 的新呼叫進入組合,狀態和相關聯的節點就會移至新呼叫的位置。如沒有加入新呼叫,系統會永久移除對應的狀態。同時觀察器會收到相關通知。

  • 如果在相同組合中多次呼叫 movableContentOf lambda,系統會為每個呼叫建立新的狀態和節點,當呼叫離開組合,而新的呼叫進入時,系統會依照呼叫的順序,將狀態從第一個離開的呼叫移至進入的呼叫。所有未由新呼叫宣告的狀態都會永久移除。

  • 除此之外,還有一些其他新的功能,而我們也主要著重在穩定執行階段和快照模式狀態系統上。許多記憶體流失的問題皆已移除,且程式碼路徑也已經最佳化。

  • 相關異動摘要清單如下:

1.2 的新功能

1.2 中的效能

1.2 中的錯誤錯誤

1.2.0-rc03 版本

2022 年 6 月 29 日

發布 androidx.compose.runtime:runtime-*:1.2.0-rc031.2.0-rc03 版本包含以下修訂項目。

修正錯誤

  • 系統先前會一律將衍生狀態觀察作業,同時從重組範圍和組合作業中移除,以致損壞其他可能仍在觀察衍生狀態的範圍。這項變更讓系統只會在其他範圍不再觀察衍生狀態執行個體的情況下加以移除。(b/236618362)

1.2.0-rc02 版本

2022 年 6 月 22 日

發布 androidx.compose.runtime:runtime-*:1.2.0-rc021.2.0-rc02 版本包含以下修訂項目。

1.2.0-rc01 版本

2022 年 6 月 15 日

發布 androidx.compose.runtime:runtime-*:1.2.0-rc011.2.0-rc01 版本包含以下修訂項目。

API 變更

  • 撰寫程式庫中的介面現已使用 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-beta021.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。如果函式需要指定其他 Applier,必須針對想指定的 Applier 明確提供目標標記註解。(I40804)

1.2.0-alpha08 版本

2022 年 4 月 20 日

發布 androidx.compose.runtime:runtime-*:1.2.0-alpha081.2.0-alpha08 版本包含以下修訂項目。

API 變更

  • TracingInProgress 新增至 CompositionTracer 介面。(Ic6f12)
  • recomposeScopeIdentity 新增至 Composer (I0c873)
  • 將追蹤 API (Composer.setTracer) 限制為 OptIn(InternalComposeTracingApi)。(I9187f)
  • 新增 ResuableContentHost,讓您進一步控制為可重複使用的內容所建立的狀態生命週期。舉例來說,如果子組合暫時未處於使用狀態,系統可能會停用內容,導致忘記觸發該組合中所有已記住的狀態,例如所有可處理的效應。(I2c0f2b/220322704)

1.2.0-alpha07 版本

2022 年 4 月 6 日

發布 androidx.compose.runtime:runtime-*:1.2.0-alpha071.2.0-alpha07 版本包含以下修訂項目。

API 變更

  • 新增 Snapshot.withoutReadObservation { ... } 函式。使用者可以透過該函式執行傳遞的 lambda,而無需訂閱在這個區塊中讀取的狀態值變更。如果您想利用以快照為基礎的安全執行緒寫入/讀取作業來提高成效,同時希望能夠在不造成不必要重組或重新測量的情況下讀取這個值,這項變更就非常實用 (I9f365b/214054486)

1.2.0-alpha06 版本

2022 年 3 月 23 日

發布 androidx.compose.runtime:runtime-*:1.2.0-alpha061.2.0-alpha06 版本包含以下修訂項目。

1.2.0-alpha05 版本

2022 年 3 月 9 日

發布 androidx.compose.runtime:runtime-*:1.2.0-alpha051.2.0-alpha05 版本包含以下修訂項目。

外部貢獻

  • 已更新為使用 Kotlinx 協同程式 1.6.0 (I3366d)

1.2.0-alpha04 版本

2022 年 2 月 23 日

發布 androidx.compose.runtime:runtime-*:1.2.0-alpha041.2.0-alpha04 版本包含以下修訂項目。

API 變更

  • 新增了 ComposableTargetComposableTargetMarkerComposableOpenTarget,這樣如果所呼叫的可組合函式指定了不適用的 Applier,就能在編譯時回報。

    在多數情況下,Compose 編譯器外掛程式能夠推論出註解,因此直接使用這些註解的情形應該相當罕見。無法推論的案例包括建立及使用自訂 Applier、抽象的可組合函式 (例如介面方法)、欄位,或是屬可組合 lambda 的全域變數 (本機變數和參數為推論得出),或在使用 ComposeNode 或相關的可組合函式時。

    對於自訂 Applier,呼叫 ComposeNodeReusableComposeNode 的可組合函式需要為函式和任何可組合的 lambda 參數類型新增 CompoableTarget 註解。不過,與其直接使用 ComposableTarget,建議您建立以 ComposableTargetMarker 加上註解的註解,再使用已標示的註解。以 ComposableTargetMarker 加上標示的可組合註解,即等同於使用屬性類別完整名稱做為 Applier 參數的 ComposbleTarget。如需 ComposableTargetMarker 的使用範例,請參閱 anroidx.compose.ui.UiComposable。 (I38f11)

1.2.0-alpha03 版本

2022 年 2 月 9 日

發布 androidx.compose.runtime:runtime-*:1.2.0-alpha031.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-alpha021.2.0-alpha02 版本包含以下修訂項目。

1.2.0-alpha01 版本

2022 年 1 月 12 日

發布 androidx.compose.runtime:runtime-*:1.2.0-alpha011.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.11.1.1 版本包含以下修訂項目。

修正錯誤

1.1.0 版本

2022 年 2 月 9 日

發布 androidx.compose.runtime:runtime-*:1.1.01.1.0 版本包含以下修訂項目。

自 1.0.0 版本以來的重要異動

  • 穩定支援 Android 12 的過度捲動效果
  • 改善觸控目標縮放功能
  • 請注意,為配合 Compose 1.0,Material 元件會擴大版面配置空間,以符合 Material 針對觸控目標尺寸所制訂的無障礙功能準則。舉例來說,即使您將觸控目標按鈕的尺寸設定為小於最小尺寸 48x48dp,系統仍會將按鈕擴大為這個尺寸。這樣一來,Compose Material 的行為就會與質感設計元件相同,在混用 Views 和 Compose 時便可確保行為一致。利用 Compose Material 元件建立使用者介面時,這項異動還能確保達到觸控目標無障礙功能的最低要求。
  • 穩定支援導覽邊欄
  • 將先前推出的一些實驗性 API 升級為穩定版
  • 支援更新版本的 Kotlin

1.1.0-rc03 版本

2022 年 1 月 26 日

發布 androidx.compose.runtime:runtime-*:1.1.0-rc031.1.0-rc03 版本包含以下修訂項目。

修正錯誤

  • 更新以支援 Compose Material 1.1.0-rc03

1.1.0-rc01 版本

2021 年 12 月 15 日

發布 androidx.compose.runtime:runtime-*:1.1.0-rc011.1.0-rc01 版本包含以下修訂項目。

1.1.0-beta04 版本

2021 年 12 月 1 日

發布 androidx.compose.runtime:runtime-*:1.1.0-beta041.1.0-beta04 版本包含以下修訂項目。

新功能

  • 更新為可與 Kotlin 1.6.0 相容

1.1.0-beta03 版本

2021 年 11 月 17 日

發布 androidx.compose.runtime:runtime-*:1.1.0-beta031.1.0-beta03 版本包含以下修訂項目。

1.1.0-beta02 版本

2021 年 11 月 3 日

發布 androidx.compose.runtime:runtime-*:1.1.0-beta021.1.0-beta02 版包含這些修訂版本。

API 變更

  • 快照模式程式碼過去分割成多個檔案,但仍位於相同的 JVM 類別中。(Ic6c98)

1.1.0-beta01 版本

2021 年 10 月 27 日

發布 androidx.compose.runtime:runtime-*:1.1.0-beta011.1.0-beta01 版本包含以下修訂項目。

1.1.0-alpha06 版本

2021 年 10 月 13 日

發布 androidx.compose.runtime:runtime-*:1.1.0-alpha061.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-alpha051.1.0-alpha05 版本包含以下修訂項目。

1.1.0-alpha04 版本

2021 年 9 月 15 日

發布 androidx.compose.runtime:runtime-*:1.1.0-alpha041.1.0-alpha04 版本包含以下修訂項目。

1.1.0-alpha03 版本

2021 年 9 月 1 日

發布 androidx.compose.runtime:runtime-*:1.1.0-alpha031.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-alpha021.1.0-alpha02 版本包含以下修訂項目。

1.1.0-alpha01 版本

2021 年 8 月 4 日

發布 androidx.compose.runtime:runtime-*:1.1.0-alpha011.1.0-alpha01 版本包含以下修訂項目。

1.0 版本

1.0.5 版本

2021 年 11 月 3 日

發布 androidx.compose.runtime:runtime-*:1.0.51.0.5 版本包含以下修訂項目。

修正錯誤

  • 已修正追蹤 derivedStateOf 例項時的當機問題。(aosp/1792247)

1.0.4 版本

2021 年 10 月 13 日

發布 androidx.compose.runtime:runtime-*:1.0.41.0.4 版本包含以下修訂項目。

依附元件更新

  • 已更新為依附 Kotlin 1.5.31

1.0.3 版本

2021 年 9 月 29 日

發布 androidx.compose.runtime:runtime-*:1.0.31.0.3 版本包含以下修訂項目。

依附元件更新

  • 已更新為依附 Kotlin 1.5.30

1.0.2 版本

2021 年 9 月 1 日

發布 androidx.compose.runtime:runtime-*:1.0.21.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.11.0.1 版本包含以下修訂項目。

依附元件更新

  • 已更新為依附 Kotlin 1.5.21

1.0.0 版本

2021 年 7 月 28 日

發布 androidx.compose.runtime:runtime-*:1.0.01.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 和 AGP 7.1 的下一個版本中修正這個問題。(b/194289155)

1.0.0-rc02 版本

2021 年 7 月 14 日

發布 androidx.compose.runtime:runtime-*:1.0.0-rc021.0.0-rc02 版本包含以下修訂項目。

  • 修正 SnapshotStateObserver 會造成突發 NullPointerExceptions 的競爭狀況問題。(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-rc011.0.0-rc01 版本包含以下修訂項目。

1.0.0-beta09 版本

2021 年 6 月 16 日

發布 androidx.compose.runtime:runtime-*:1.0.0-beta091.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>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-beta081.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-beta071.0.0-beta07 版本包含以下修訂項目。

API 變更

  • 已加入新的撰寫編譯器 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-beta061.0.0-beta06 版本包含以下修訂項目。

API 變更

  • @ComposeCompilerApi已不再是 @RequiresOptIn (Iab690)

1.0.0-beta05 版本

2021 年 4 月 21 日

發布 androidx.compose.runtime:runtime-*:1.0.0-beta051.0.0-beta05 版本包含以下修訂項目。

API 變更

  • 已移除 @InternalComposeApi,允許錄製快照讀取和寫入 (Id134d)

修正錯誤

  • 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-beta041.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() 會還原舊值的問題 (I1b110b/182403380)

1.0.0-beta03 版本

2021 年 3 月 24 日

發布 androidx.compose.runtime:runtime-*:1.0.0-beta031.0.0-beta03 版包含以下修訂項目。

API 變更

  • 淘汰 DefaultMonotonicFrameClock。呼叫無 MonotonicFrameClockwithFrameNanosRecomposer.runRecomposeAndApplyChanges 現在會擲回 IllegalStateException。(I4eb0d)

1.0.0-beta02 版本

2021 年 3 月 10 日

發布 androidx.compose.runtime:runtime-*:1.0.0-beta021.0.0-beta02 版包含以下修訂項目。

修正錯誤

1.0.0-beta01 版本

2021 年 2 月 24 日

發布 androidx.compose.runtime:runtime-*:1.0.0-beta011.0.0-beta01 版本包含以下修訂項目。

這是 Compose 1.0.0 Beta 版發行的第一個版本。

API 變更

  • 新增 Recomposer.runRecomposeConcurrentlyAndApplyChanges 實驗性 API,以在主要畫面迴圈中重組無效的組合。(I342d0)
  • 任何標記為 @ReadOnlyComposable 的可組合項現在會驗證編譯時間,確保這些可組合項只會呼叫其他 @ReadOnlyComposable (I58961)
  • compositionLocalOfstaticCompositionLocalOfdefaultFactory 現已為必要,而非選擇性。

    如未提供預設工廠,這項變更可移除非空值的潛在類型錯誤。以前,這會為非空值的類型提供空值的參照。

    如果是可為空值類型,請考慮提供 { null } 做為預設工廠。

    除非能提供合理的預設值,否則我們不建議搭配不可為空值類型使用本機。如果沒有任何可行的預設值,defaultFactory lambda 應擲回例外狀況。然而,擲回例外狀況代表本機用戶端不會提供隱含依附元件,而該類型不受類型系統強制執行。(Ifbd2a)

  • 淘汰的符號已從撰寫執行階段中移除 (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 變更:

    • 已將 contentPAdding 參數新增至 Top/BottomAppBar,以自訂預設邊框間距。
    • 已依據 API 指南重新調整 BackdropScaffold 中的參數順序,將必要參數置於選用參數之前。
    • 已將 BottomNavigationItem 中的 icon 參數移至 selectedonClick 之後。
    • 已將 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-alpha121.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)

  • snapshotFlowwithMutableSnapshot 不再是實驗性質。(I6a45f)

  • Recomposer 現在可以關閉。封閉的重新寫入器將繼續調整,直到構成的子元件完成為止。將 Recomposer.shutDown 重新命名為「cancel」,以便與關閉狀態形成對比。(Ib6d76)

  • compose:runtime-dispatch 構件現已淘汰。目前可在 Compose:Runtime 中找到 MonotonicFrameClock,而 AndroidUiDispatcher 則可在 compose:ui 中找到。(Ib5c36)

  • Compose 編譯器外掛程式指定的 API 已經重構為採用介面,而不是具體類別。介面也不再使用類型參數。

    這項內部變更不應影響原始碼相容性,但屬於二進位破壞性變更 (I3b922b/169406779)

  • 加入 SnapshotMutableState (Icfd03)

  • DisposableEffectDisposable 已重新命名為 DisposaleEffectResult (Ica7c6)

  • 移除了 Recomposer.current()。[Abstract]ComposeView 現已預設為延遲建立、以視窗為範圍的 Recomposer,並由視窗的 ViewTreeLifecycleOwner 所驅動。主機的 Lifecycle 停止時,Recomposition 和以 withFrameNanos 為基礎的動畫滴答會暫停 (I38e11)

  • Recomposer.runRecomposers 現已提供唯讀 ReComposerInfo 的全域 StateFlow,用於在程序中觀察進行中的組合狀態。建議使用這個 API 取代已淘汰的 ReComposer.current() (If8ebe)

  • DisposableEffectDisposable 已重新命名為 DisposaleEffectResult (I3ea68)

1.0.0-alpha11 版本

2021 年 1 月 28 日

發布 androidx.compose.runtime:runtime-*:1.0.0-alpha111.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,這是不變的建議做法。不過,如果參照在某個組合中已有多次記錄,則系統會針對每個參照呼叫 onRemembered,但只會呼叫一次 onEnter。如果子組合 (如 WithConstraintsScaffold) 裡有使用該物件,則會呼叫 onEnter 多次,並導致單次呼叫 onEnter 不穩定,因此已從 RememberObserver 中移除。

    RememberObserver 新增了 onAbandoned,如果 RememberObserver 執行個體是從傳送至 remember 的回呼傳回,但未記錄在組合狀態中,且因此永不會呼叫 onRemembered,這種情況就會呼叫此項目。發生這種情況可能是因為例外狀況在完成前終止組合,或組合遭到捨棄,因為產生組合的狀態已過時,或是不再需要使用。如果按照上述單一參照建議提供的 RememberObserver 例項追蹤了外部資源,則 onForgottenonAbandoned 都表示不再需要資源。如果物件正在追蹤啟動的作業或是指派給 onRemembered 的資源,則您可以忽略 onAbandoned,因為呼叫 onRemembered 之後便不會呼叫此項目。(I02c36)

  • 請勿將 collectAsState() 函式標示為內嵌 (Ia73e4)

修正錯誤

  • WithConstraints 已重新設計為 BoxWithConstraints,並移至 foundation.layout。(I9420bb/173387208)
  • 運用 TestCoroutineDispatcher 進行測試 (I532b6)

1.0.0-alpha10 版本

2021 年 1 月 13 日

發布 androidx.compose.runtime:runtime-*:1.0.0-alpha101.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 取得 (I87c57b/173086397)

1.0.0-alpha09 版本

2020 年 12 月 16 日

發布 androidx.compose.runtime:runtime-*:1.0.0-alpha091.0.0-alpha09 版包含以下修訂項目。

API 變更

  • 已從公用 API 中移除 SlotTable、SlotReader 和 SlotWriter。這些項目先前被標示為 InternalInternalAPI。現在是撰寫模組的內部。

    已新增 CompositionData 和 CompositionGroup 以取代 ui-tooling API,可用於擷取組合資訊。這些是公開工具,但不適合在 ui-tooling API 外使用,因為 API 會提供 ui-tooling API 解讀的原始資訊 (I31a9c)

  • Applier 類別不再視為 (Id85b0)

  • Applier 介面經過變更,將樹狀結構建構方式從由上往下簡化為由下往上。

    insert() 方法已重新命名為 insertTopDown()

    加入新的方法 insertBottomUp()

    Applier 會根據效能表現選用 insertTopDown()insertBottomUp(),將節點插入目前編輯的樹狀結構。

    對某些樹狀結構 (例如 LayoutNodeView) 而言,由下往上的建構方式會比由上往下更有效率。在這項變更之前,您需要先插入一些堆疊,而其必須複製到每個需進行下行建構的建構作業。這項變更實施後,Applier 會覆寫 insertBottomUp() 以由下往上建構樹狀結構,而覆寫 insertTopDown() 則會由上往下建構樹狀結構。(Icbdc2)

  • Compose 支援能執行可組合叫用的屬性 getter。系統對這項支援仍維持不變,但是已變更用於將屬性 getter 宣告為 @Composable 的語法。

    現已淘汰的語法是透過將屬性本身加上註解來進行宣告:

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

    現行正確的語法是透過將屬性的 getter 加上註解來進行宣告:

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

    這兩種語法將可同時運作一段時間,但系統最終會將先前淘汰的語法視為編譯錯誤。(Id9197)

修正錯誤

1.0.0-alpha08 版本

2020 年 12 月 2 日

發布 androidx.compose.runtime:runtime-*:1.0.0-alpha081.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-alpha071.0.0-alpha07 版本包含以下修訂項目。

新功能

API 變更

  • @UnionType 註解已經淘汰 (I57cde)
  • 新增 provideDefault 做為提供環境的替代方法,僅用於在未提供任何環境值的情況下指定環境值。(Id6635b/171024925)
  • 將 LaunchedTask 重新命名為 LaunchedImpact,以便與 SideImpact 和 Disposableimpact API 保持一致。系統不允許使用不含主題參數的 LaunchedAction,以鼓勵採用最佳做法。(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。(I0fa98b/170475424)。

外部貢獻

  • 新增撰寫的 runtime-rxjava3 模組。與 runtime-rxjava2 類似 (I02cbf)

1.0.0-alpha06 版本

2020 年 10 月 28 日

發布 androidx.compose.runtime:runtime-*:1.0.0-alpha061.0.0-alpha06 版本包含以下修訂項目。

API 變更

  • Recomposer 現已成為 CompositionReference 以及有效的組合父項。現在只有少數情況必須使用明確的 Recomposer。(I4036f)
  • 已新增 DisposableEffect counterpart API 至 SideEffect,使用所需的 onDispose 補足 onCommit-with-params 的角色。
    • 新增 rememberUpdatedState API,以發布重組的資料至持續進行或長期進行的程序,例如 DisposableEffects 或 LaunchedTasks。
    • (Id50b9)
  • MutableVector 現在會實作 RandomAccess (I85d73b/170461551)
  • 已新增 SideEffect 可組合項,以套用組合的副作用至組合管理的物件。SideEffect 的用途是取代 onCommit 可組合項。(Ia77c2)
  • 新增實驗性 API RestorableStateHolder。這可允許儲存以 [savedInstanceState] 和 [rememberSavedInstanceState] 定義的子樹狀結構狀態,然後才進行處理,以於下次使用還原的狀態再次組合。(I66884b/166586419)

修正錯誤

  • 在 ComposeTestRule 中啟用轉換功能,同時從 ComposeTestRule 中移除用於啟用閃爍游標的選項。(If0de3)

1.0.0-alpha05 版本

2020 年 10 月 14 日

發布 androidx.compose.runtime:runtime-*:1.0.0-alpha051.0.0-alpha05 版本包含以下修訂項目。

API 變更

  • 實驗性 Modifier.pointerInput 暫停輸入修飾詞 (Ia77d2)
  • 透過減少每次捲動時子組合中的工作量,改善 LazyColumn/Row 的捲動效能。已為 Composition 類別新增 hasInvalidations() 方法。將重組工具的 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-alpha041.0.0-alpha04 版本包含以下修訂項目。

API 變更

  • 新增 OwnerScope,以便收集已失效的版面配置和繪圖觀測範圍。(Ic4cf8)
  • 新增 derivedStateOf API,以便根據計算結果建立可讀取 (及衍生自) 其他 State 物件的 State 物件 (If758b)
  • 為 SnapshotStateObserver 新增 TestOnly API (I6e2a9)

修正錯誤

  • foundation.Box 已淘汰。請改用 foundation.layout.Box。(Ie5950b/167680279)

1.0.0-alpha03 版本

2020 年 9 月 16 日

發布 androidx.compose.runtime:runtime-*:1.0.0-alpha031.0.0-alpha03 版本包含以下修訂項目。

API 變更

  • CompositionCoroutineScope 已不再實作 MonotonicFrameClockwithFrameNanos 的呼叫端應明確匯入頂層函式。(Icb642b/166778123)。

修正錯誤

  • onNodewaitForIdle 等全域測試函式現已淘汰,請改用依據 ComposerTestRule 定義的新對應函式 (I7f45a)
  • launchInComposition 不會再啟動未指派的協同程式 (Ief6afb/166486000)

1.0.0-alpha02 版本

2020 年 9 月 2 日

發布 androidx.compose.runtime:runtime-*:1.0.0-alpha021.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-alpha011.0.0-alpha01 版本包含以下修訂項目。

0.1.0-dev 版本

0.1.0-dev17 版本

2019 年 8 月 5 日

發布 androidx.compose.runtime:runtime-*:0.1.0-dev170.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 (I4ab76b/160042650b/156853976b/159026663b/154920561)

修正錯誤

  • emitView 已淘汰。請盡可能使用 AndroidView,在 Compose 中產生觀看次數。請注意,系統日後將不再支援直接組合 View 和 ViewGroup 的做法,除非這是組合樹狀結構的一部分,且能透過 AndroidView 完成這項作業。(I29b1eb/163871221)

0.1.0-dev16 版

2020 年 8 月 5 日

發布 androidx.compose.runtime:runtime-*:0.1.0-dev160.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)

修正錯誤

  • 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() + anotherModifier (Iedd58b/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-dev150.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 }
     )
    }
    

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

  • 變更 Compose 編譯器的程式碼產生策略。在變更之前,Compose 編譯器會將呼叫轉換為可組合函式。經此變更之後,我們現在可以轉換可組合函式的主體,並在多數情況下維持呼叫位置不變。

    也就是說,與 Compose 執行階段進行通訊的大多數邏輯,都是在函式主體的開頭 (而不是在呼叫位置) 執行。

    這應該是針對所有 Compose 使用情形的原始碼相容性變更。這項變更生效後,大多數 Compose 使用者都無需更新任何程式碼。

    為了配合這項異動,所有可組合函式的 JVM 簽名皆已變更。接受單一參數的可組合函式已轉換為接受 3 個參數的函式,外加的參數為 Composer (也就是「key」整數),是用於透過呼叫傳播中繼資料的位元遮罩整數。

    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)

  • 將 sortWith 和 removeRange 新增至 MutableVector (Icccf7)

  • 新增 CompositionLifecycleObserver 的預設方法實作 (I24289)

  • Applier 現在必須使用 clear() 方法棄置組合 (Ibe697)

  • 已在 MutableVector 中新增 asMutableList(),讓此函式可在無需複製整個清單的情況下傳送至公用 API。(I298df)

  • 新增 RememberCoroutineScope(),可用於取得在組合中託管的 CoroutineScope,以便啟動工作來回應事件。(I0e264)

  • MutableVector 是新的集合,不會實作任何標準 Collection 介面。此集合可帶來高於其他要求的速度,而且僅供內部實作使用。(I8ebd6)

  • 已暫時移除 StableMutableListStableMutableMap,避免 Compose 所需的 Kotlin 版本發生問題。這些介面將在 Compose 更新為沒有問題的 Kotlin 版本時重新加入。

    SnapshotStateListSnapshotStateMap 現已公開,但會在 StableMutableListStableMutableMap 還原後淘汰。(Ia7769)

  • 新增頂層 withFrameNanos 函式,用於動畫計時 (Ie34c5)

  • @Untracked 註解已淘汰。替換為 @ComposableContract(tracked=false) (Id211e)

  • RestartableFunction 和相關聯的 API 已重新命名為 ComposableLambda 等。這些 API 只會由編譯器指定為目標,因此正常來說,這不會影響來源層級相容性。重新命名的主要用意是,當這個類別出現在堆疊追蹤中,使用者能夠對其有更清晰的瞭解 (I7eb25)

  • @Composable 註解不再適用於類別 (Ia5f02)

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

  • 在做出這項變更之前,Compose 編譯器外掛程式會以複雜方式攔截對 @Composable 函式 (如果有) 內建構函式的呼叫 (I5205ab/158123804)

  • 「重組」可組合項已不能成為實用的抽象層。多數重組作業應該都是因為 MutableState 指派項目才會執行。除此之外,建議您使用 invalidate 函式來觸發針對目前範圍的重組作業。(Ifc992)

  • 「觀察」已不能成為實用的抽象層。如果需要複製,其實作可透過直接建立執行可組合項 lambda 參數的可組合函式取代。例如:@Composable fun Observe(body: @Composable () -> Unit) = body() (I40d37)

  • @Direct 已淘汰,並改用 @ComposableContract(restartable=false) (If4708)

  • 為最近引入的 StateFlow 新增轉接程式,以便預先填入初始值,讓傳回的狀態不可為空值 (I61dd8b/156233789)

  • 已新增 Flow 的轉接程式。使用範例:val value by flow.collectAsState() (If2198b/153375923)

  • [Mutable]State 屬性委派運算子已移至擴充功能,以支援 Kotlin 1.4 屬性委派最佳化作業。呼叫端必須新增匯入才能繼續使用 by state { ... }by mutableStateOf(...)。(I5312c)

  • androidx.compose.ViewComposer 已移至 androidx.ui.node.UiComposer androidx.compose.Emittable 已移除。它對 ComponentNode 來說是多餘的。androidx.compose.ViewAdapters 已移除。系統已不再支援這些項目。Compose.composeInto 已淘汰,請改用 setContentsetViewContent。Compose.disposeComposition 已淘汰,請改為對 setContent 傳回的 Composition 使用 dispose 方法。 androidx.compose.Compose.subcomposeInto 已移至 androidx.ui.core.subcomposeInto ComponentNode#emitInsertAt 已重新命名為 ComponentNode#insertAt ComponentNode#emitRemoveAt 已重新命名為 ComponentNode#removeitModeAt ComponentNode#emitMode 已重新命名為 ComponentNode#move (Idef00)

  • ComposeFlags.COMPOSER_PARAM 標記更新為 true,這會變更 Compose 外掛程式的程式碼產生策略。大致上來說,這會導致系統產生附加合成參數的 @Composable 函式,這個參數會傳遞至後續的 @Composable 呼叫中,藉此讓執行階段妥善管理執行作業。這麼做可大幅改善二進位檔的破壞性,不過,在所有撰寫好的應用使用情況中,應保持來源層級的相容性。(I7971c)

  • 對環境 API 做出破壞性變更。詳情請參閱記錄和 Ambient<T> 說明文件 (I4c7eeb/143769776)

  • 新增 ui-livedata - 專為 LiveData 設計的新構件 (有轉接程式)。使用範例:val value by liveData.observeAsState() (Ie9e8cb/150465596)

  • 不含明確初始值的 Rx 轉接程式已淘汰。使用空值不一定是最佳預設值,舉例來說,假如您使用的是 List,最好開頭是 emptyList() 或任何其他合理的預設值 (I00025b/161348384)

  • 新增 ui-rxjava2 - 專為 RxJava2 設計的新構件 (有轉接程式)。使用範例:val value by observable.subscribeAsState() (Ifab4bb/153369097)

  • savedInstanceState() 現在可以搭配可為空值類型使用 (I6847fb/153532190)

  • 新增 listSaver() 和 mapSaver(),以更簡單的方式寫入自訂 Saver 物件 (I8cf68b/152331508)

  • 新函式:savedInstanceState() 和 rememberSavedInstanceState()。這些與 state() 和 remember() 相似,但可以利用已儲存的執行個體狀態支援建構 (If1987b/152025209)

修正錯誤

  • 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 擴充功能。實作重構色彩、筆刷和繪製 drawBackground,以減少程式碼路徑,並移除 Modifier 被創建為部分組成元件的要求。(I0343a)
  • 更新較高層級的 Composer API,讓顯示 Canvas 改為顯示 CanvasScope。如此一來,消費者就不需要維護自己的 Paint 物件。如果是仍需要存取 Canvas 的取用端,則可以使用 DrawCanvas 擴充功能方法提供回呼,對基礎 Canvas 發出繪圖指令。(I80afd)
  • WithConstraints 結尾的 lambda API 已變更。現在,除了兩個參數外,這還具有接收器範圍。除了能夠設定限制與 layoutDirection 之外,該範圍還可以提供 Dp 中的 minWidth、maxWidth、minHeight 和 maxHeight 屬性 (I91b9ab/149979702)
  • 新增對稱式邊框間距修飾詞。(I39840)
  • 已更新 wrapContentWidth 和 wrapContentHeight 必須使用垂直或水平對齊,而非使用任何對齊。引力調整器已更新為接受垂直或水平對齊。更新 Row、Column 和 Stack 以支援自訂的持續對齊方式。(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)
  • RowScope 和 ColumnScope 構件現在已可從 Row 和 Column 之外存取。(I3a641)
  • 將 LayoutFlexible 重新命名為 LayoutWeight。將 tight 參數重新命名為 fill。(If4738)
  • WithConstraints 取得 LayoutDirection 參數 (I6d6f7)
  • 已將 background 重新命名為 DrawBackground,並成為預設加以記憶 (Ia0bd3)
  • 以不同函式取代 ButtonStyle,並移除文字 (字串) 超載。如需使用資訊,請參閱更新後的範例。(If63abb/146478620b/146482131)
  • runOnIdleComposerunOnUiThread 現已成為全域函式,而非 ComposeTestRule 中的方法。(Icbe8f)

外部貢獻

  • 從 Compose 執行階段移植層移除不需要的 API,例如 Looper 和 Handler (I6847d)
  • 淘汰沒有初始值的 Flow<T>.collectAsState()。請改用 StateFlow<T>,或傳遞明確的初始值。(I63f98b/157674865)