Compose Runtime

Compose のプログラミング モデルと状態管理の基本ビルディング ブロックと、Compose コンパイラ プラグインがターゲットとするコアランタイム。
最新の更新 安定版リリース リリース候補版 ベータ版リリース アルファ版リリース
2022 年 4 月 20 日 1.1.1 - - 1.2.0-alpha08

構造

Compose は、androidx 内の 7 つの Maven Group ID を組み合わせたものです。各グループにはそれぞれの目的に応じて Compose の機能のサブセットが含まれており、それぞれに固有のリリースノートがあります。

次の表に、各グループの説明と、それぞれのリリースノートのリンクを示します。

グループ説明
compose.animationJetpack Compose アプリ内でアニメーションを作成して、ユーザー エクスペリエンスを高めます。
compose.compiler@Composable 関数を変換し、Kotlin コンパイラ プラグインで最適化を有効にします。
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 コンパイラ プラグインがターゲットとするコアランタイム。
compose.uiレイアウト、描画、入力などのデバイス操作に必要な Compose UI の基本コンポーネント。

依存関係の宣言

Compose への依存関係を追加するには、Google の Maven リポジトリをプロジェクトに追加する必要があります。詳しくは、Google の Maven リポジトリをご覧ください。

アプリまたはモジュールの build.gradle ファイルに、必要なアーティファクトの依存関係を追加します。

Groovy

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

android {
    buildFeatures {
        compose true
    }

    composeOptions {
        kotlinCompilerExtensionVersion = "1.2.0-alpha08"
    }

    kotlinOptions {
        jvmTarget = "1.8"
    }
}

Kotlin

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

android {
    buildFeatures {
        compose = true
    }

    composeOptions {
        kotlinCompilerExtensionVersion = "1.2.0-alpha08"
    }

    kotlinOptions {
        jvmTarget = "1.8"
    }
}

依存関係について詳しくは、ビルド依存関係の追加をご覧ください。

フィードバック

お寄せいただいたフィードバックは Jetpack 改善の参考にさせていただきます。新しい問題が見つかった場合や、このライブラリを改善するアイデアをお持ちの場合は、お知らせください。新しい問題を報告していただく前に、このライブラリの既存の問題をご確認ください。スターボタンをクリックすると、既存の問題に投票できます。

新しい問題を報告する

詳細については、Issue Tracker のドキュメントをご覧ください。

バージョン 1.2

バージョン 1.2.0-alpha08

2022 年 4 月 20 日

androidx.compose.runtime:runtime-*:1.2.0-alpha08 がリリースされました。バージョン 1.2.0-alpha08 に含まれるコミットについては、こちらをご覧ください

API の変更

  • CompositionTracer インターフェースに TracingInProgress を追加しました。(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-alpha07 がリリースされました。バージョン 1.2.0-alpha07 に含まれる commit については、こちらをご覧ください

API の変更

  • 新しい関数 Snapshot.withoutReadObservation { ... } が追加されました。この関数によりユーザーは、このブロック中に読み込まれた状態値の変更にサブスクライブせずに、渡されたラムダを実行できます。これは、スナップショット ベースのスレッドセーフな書き込み / 読み取りの利点を活用しつつ、不要な再コンポジションまたは再測定を行わずに値を読み取れるようにしたいユースケースで役立つ場合があります。(I9f365b/214054486

バージョン 1.2.0-alpha06

2022 年 3 月 23 日

androidx.compose.runtime:runtime-*:1.2.0-alpha06 がリリースされました。バージョン 1.2.0-alpha06 に含まれる commit については、こちらをご覧ください。

バージョン 1.2.0-alpha05

2022 年 3 月 9 日

androidx.compose.runtime:runtime-*:1.2.0-alpha05 がリリースされました。バージョン 1.2.0-alpha05 に含まれる commit については、こちらをご覧ください。

外部からの協力

  • Kotlinx コルーチン 1.6.0 を使用するように更新されました(I3366d

バージョン 1.2.0-alpha04

2022 年 2 月 23 日

androidx.compose.runtime:runtime-*:1.2.0-alpha04 がリリースされました。バージョン 1.2.0-alpha04 に含まれる commit については、こちらをご覧ください

API の変更

  • ComposableTargetComposableTargetMarkerComposableOpenTarget を追加しました。使用が想定されていない Applier を対象としてコンポーズ可能な関数を呼び出した場合について、コンパイル時のレポートが可能になります。

    ほとんどの場合、アノテーションは Compose コンパイラ プラグインによって推定されます。そのため、これらのアノテーションを直接使用することはめったにありません。推定できないケースとしては、カスタム Applier、コンポーズ可能な抽象関数(インターフェース メソッドなど)、コンポーズ可能なラムダであるフィールドまたはグローバル変数(ローカル変数とパラメータは推定される)を作成および使用する場合や、ComposeNode または関連するコンポーズ可能な関数を使用する場合が挙げられます。

    カスタム Applier の場合は、ComposeNode または ReusableComposeNode を呼び出すコンポーズ可能な関数が、関数に対して CompoableTarget アノテーションとコンポーズ可能なラムダのパラメータ型を追加する必要があります。ただし、ComposableTargetMarker を付けてアノテーションを作成し、ComposableTarget を直接使用する代わりに、そのマークされたアノテーションを使用することをおすすめします。ComposableTargetMarker でマークされたコンポーズ可能なアノテーションは、Applier パラメータとして属性クラスの完全修飾名を持つ ComposbleTarget と同等になります。ComposableTargetMarker の使用例については、anroidx.compose.ui.UiComposable をご覧ください。(I38f11

バージョン 1.2.0-alpha03

2022 年 2 月 9 日

androidx.compose.runtime:runtime-*:1.2.0-alpha03 がリリースされました。バージョン 1.2.0-alpha03 に含まれる commit については、こちらをご覧ください

API の変更

  • コンポーザブル ラムダを別のラムダに変換する movableContentOf を追加しました。変換されたラムダは、状態および対応するノードを呼び出された新しい場所に移動します。前の呼び出しがコンポジションから出ると状態は一時的に保持され、ラムダへの新しい呼び出しがコンポジションに入った場合、状態および関連付けられたノードが新しい呼び出しの場所に移動されます。新しい呼び出しが追加されない場合、状態は完全に削除され、オブザーバーに通知されます。

    movableContentOf ラムダが同じコンポジションで複数回呼び出された場合、呼び出しごとに新しい状態とノードが作成されます。呼び出しがコンポジションを出て新しい呼び出しが入ると、状態は、呼び出しの順序で最初に出る呼び出しから入る呼び出しへと移動します。新しい呼び出しで宣言されていない状態はすべて完全に削除されます。(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 に含まれる commit については、こちらをご覧ください

バージョン 1.2.0-alpha01

2022 年 1 月 12 日

androidx.compose.runtime:runtime-*:1.2.0-alpha01 がリリースされました。バージョン 1.2.0-alpha01 に含まれるコミットについては、こちらをご覧ください

API の変更

  • Layout Inspector で不変の ID を生成するために、identity フィールドを CompositionData に追加しました。(Ic116e

依存関係の更新

  • Kotlin 1.6.10 に依存するようになりました。

バージョン 1.1

バージョン 1.1.1

2022 年 2 月 23 日

androidx.compose.runtime:runtime-*:1.1.1 がリリースされました。バージョン 1.1.1 に含まれる commit については、こちらをご覧ください

バグの修正

  • androidx.compose.ui.platform.RenderNodeLayer.updateDisplayListNullPointerException を修正しました(aosp/1947059b/206677462
  • Android のクリップボードから読み取る際にクリップボードの内容が原因で発生するクラッシュを修正しました。(I06020b/197769306
  • LazyVerticalGrid の RTL を修正しました(aosp/1931080b/207510535

バージョン 1.1.0

2022 年 2 月 9 日

androidx.compose.runtime:runtime-*:1.1.0 がリリースされました。バージョン 1.1.0 に含まれる commit については、こちらをご覧ください

1.0.0 以降の重要な変更

  • Android 12 のオーバースクロール効果の安定版サポートを追加
  • タップ ターゲットのサイズ調整を改善
  • Compose 1.0 では、マテリアル ユーザー補助ガイドラインタップ ターゲットのサイズに合わせるために、マテリアル コンポーネントのレイアウト スペースが拡張されることに注意してください。たとえば、ボタンのサイズをいくら小さく設定しても、ボタンのタップ ターゲットは最小サイズの 48x48dp に拡張されます。これにより、Compose Material とマテリアル デザイン コンポーネントの動作が一致し、View と Compose を混在させても動作の一貫性を保持できます。また、Compose Material コンポーネントを使用して UI を作成する際に、タップ ターゲットに関するユーザー補助の最小要件が確実に満たされます。
  • ナビゲーション レールの安定版のサポートを追加
  • 試験運用版であったいくつかの API を安定版に移行
  • 新しいバージョンの Kotlin のサポート

バージョン 1.1.0-rc03

2022 年 1 月 26 日

androidx.compose.runtime:runtime-*:1.1.0-rc03 がリリースされました。バージョン 1.1.0-rc03 に含まれる commit については、こちらをご覧ください

バグの修正

  • 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 に含まれる commit については、こちらをご覧ください

バージョン 1.1.0-beta04

2021 年 12 月 1 日

androidx.compose.runtime:runtime-*:1.1.0-beta04 がリリースされました。バージョン 1.1.0-beta04 に含まれる commit については、こちらをご覧ください

新機能

  • Kotlin 1.6.0 との互換性を確保するために更新しました

バージョン 1.1.0-beta03

2021 年 11 月 17 日

androidx.compose.runtime:runtime-*:1.1.0-beta03 がリリースされました。バージョン 1.1.0-beta03 に含まれる commit については、こちらをご覧ください

バージョン 1.1.0-beta02

2021 年 11 月 3 日

androidx.compose.runtime:runtime-*:1.1.0-beta02 がリリースされました。バージョン 1.1.0-beta02 に含まれる commit については、こちらをご覧ください

API の変更

  • スナップショット コードが複数のファイルに分割されましたが、すべて同じ JVM クラス内にあります。(Ic6c98

バージョン 1.1.0-beta01

2021 年 10 月 27 日

androidx.compose.runtime:runtime-*:1.1.0-beta01 がリリースされました。バージョン 1.1.0-beta01 に含まれる commit については、こちらをご覧ください

バージョン 1.1.0-alpha06

2021 年 10 月 13 日

androidx.compose.runtime:runtime-*:1.1.0-alpha06 がリリースされました。バージョン 1.1.0-alpha06 に含まれる commit については、こちらをご覧ください

API の変更

  • モジュール間で呼び出す必要がある Composer メソッドから InternalCompilerApi を削除しました。(I1aa0b
  • Recomposer.state はサポートが終了し、Recomposer.currentState に置き換えられ、タイプが StateFlow に変更されました。(Ic2ab3b/197773820

バージョン 1.1.0-alpha05

2021 年 9 月 29 日

androidx.compose.runtime:runtime-*:1.1.0-alpha05 がリリースされました。バージョン 1.1.0-alpha05 に含まれる commit については、こちらをご覧ください

バージョン 1.1.0-alpha04

2021 年 9 月 15 日

androidx.compose.runtime:runtime-*:1.1.0-alpha04 がリリースされました。バージョン 1.1.0-alpha04 に含まれる commit については、こちらをご覧ください

バージョン 1.1.0-alpha03

2021 年 9 月 1 日

androidx.compose.runtime:runtime-*:1.1.0-alpha03 がリリースされました。バージョン 1.1.0-alpha03 に含まれる commit については、こちらをご覧ください

新機能

  • Compose Compiler は、古いバージョンの Compose Runtime(1.0)をサポートするようになりました。この変更の前、Compose Compiler は同じバージョン以降の Compose Runtime とのみ互換性がありました。この変更の後、Compose Compiler は古いバージョンの Compose Runtime(1.0)と互換性を持つようになります。(aosp/1796968
  • Kotlin 1.5.30 に依存するように、Compose 1.1.0-alpha03 を更新しました。(I74545

バージョン 1.1.0-alpha02

2021 年 8 月 18 日

androidx.compose.runtime:runtime-*:1.1.0-alpha02 がリリースされました。バージョン 1.1.0-alpha02 に含まれる commit については、こちらをご覧ください

バージョン 1.1.0-alpha01

2021 年 8 月 4 日

androidx.compose.runtime:runtime-*:1.1.0-alpha01 がリリースされました。バージョン 1.1.0-alpha01 に含まれる commit については、こちらをご覧ください

バージョン 1.0

バージョン 1.0.5

2021 年 11 月 3 日

androidx.compose.runtime:runtime-*:1.0.5 がリリースされました。バージョン 1.0.5 に含まれる commit については、こちらをご覧ください

バグの修正

  • derivedStateOf インスタンスをトラッキングするクラッシュを修正しました。(aosp/1792247

バージョン 1.0.4

2021 年 10 月 13 日

androidx.compose.runtime:runtime-*:1.0.4 がリリースされました。バージョン 1.0.4 に含まれる commit については、こちらをご覧ください

依存関係の更新

  • Kotlin 1.5.31 に依存するように更新しました。

バージョン 1.0.3

2021 年 9 月 29 日

androidx.compose.runtime:runtime-*:1.0.3 がリリースされました。バージョン 1.0.3 に含まれる commit については、こちらをご覧ください

依存関係の更新

  • Kotlin 1.5.30 に依存するように更新しました。

バージョン 1.0.2

2021 年 9 月 1 日

androidx.compose.runtime:runtime-*:1.0.2 がリリースされました。バージョン 1.0.2 に含まれる commit については、こちらをご覧ください

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 に含まれる含まれる commit については、こちらをご覧ください

依存関係の更新

  • Kotlin 1.5.21 に依存するように更新しました。

バージョン 1.0.0

2021 年 7 月 28 日

androidx.compose.runtime:runtime-*:1.0.0 がリリースされました。バージョン 1.0.0 に含まれる commit については、こちらをご覧ください

1.0.0 の主な機能

これは Compose の最初の安定版リリースです。詳細については、Compose リリースの公式ブログをご覧ください。

既知の問題

  • Android Studio Bumblebee Canary 4 または AGP 7.1.0-alpha04 / 7.1.0-alpha05 を使用している場合、次のクラッシュが発生することがあります。

      java.lang.AbstractMethodError: abstract method "void androidx.lifecycle.DefaultLifecycleObserver.onCreate(androidx.lifecycle.LifecycleOwner)"
    

    修正するには、build.gradle ファイルで一時的に minSdkVersion を 24 以上に変更します。この問題は、次期バージョンの Android Studio Bumblebee と AGP 7.1 で修正される予定です。(b/194289155

バージョン 1.0.0-rc02

2021 年 7 月 14 日

androidx.compose.runtime:runtime-*:1.0.0-rc02 がリリースされました。バージョン 1.0.0-rc02 に含まれる commit については、こちらをご覧ください

  • NullPointerExceptions を散発的に発生させる SnapshotStateObserver の競合状態を修正しました。(aosp/1763445aosp/1758105b/192677711
  • java.lang.IllegalStateException: Reading a state that was created after the snapshot was taken or in a snapshot that has not yet been applied クラッシュの原因となるランタイム スナップショットの問題を修正しました。(b/193006595b/192570897

バージョン 1.0.0-rc01

2021 年 7 月 1 日

androidx.compose.runtime:runtime-*:1.0.0-rc01 がリリースされました。バージョン 1.0.0-rc01 に含まれる commit については、こちらをご覧ください

バージョン 1.0.0-beta09

2021 年 6 月 16 日

androidx.compose.runtime:runtime-*:1.0.0-beta09 がリリースされました。バージョン 1.0.0-beta09 に含まれる commit については、こちらをご覧ください

プロファイル ルールの追加

このリリースでは、以下の compose モジュールにプロファイル ルールが追加されました。(I14ed6

  • androidx.compose.animation
  • androidx.compose.animation-core
  • androidx.compose.foundation
  • androidx.compose.foundation-layout
  • androidx.compose.material
  • androidx.compose.material-ripple
  • androidx.compose.runtime
  • androidx.compose.ui
  • androidx.compose.ui.geometry
  • androidx.compose.ui.graphics
  • androidx.compose.ui.text
  • androidx.compose.ui.text
  • androidx.compose.ui.unit
  • androidx.compose.ui.util

プロファイル ルールとは

  • ライブラリのプロファイル ルールは、src/main または同等のディレクトリにあるテキスト ファイル baseline-prof.txt で指定します。このファイルでは、1 行に 1 つずつルールを指定します。ここでのルールは、ライブラリ内のメソッドまたはクラスとマッチングするパターンです。ルールの構文は、人が読める ART プロファイル形式のスーパーセットで、adb shell profman --dump-classes-and-methods ... を使用する際に使用されます。ルールは、メソッドまたはクラスをターゲットとする 2 つの形式のいずれかを使用します。

  • メソッドルールのパターンは次のようになります。

    <FLAGS><CLASS_DESCRIPTOR>-><METHOD_SIGNATURE>
    
  • クラスルールのパターンは次のようになります。

    <CLASS_DESCRIPTOR>
    
  • 上記の <FLAGS> は、このメソッドに「ホット」、「起動」、または「起動後」のフラグを付けるかどうかを示す文字 HSP(1 つまたは複数)です。

  • <CLASS_DESCRIPTOR> は、ターゲットとなるメソッドが属するクラスの記述子です。たとえば、クラス androidx.compose.runtime.SlotTable の記述子は、Landroidx/compose/runtime/SlotTable; です。

  • <METHOD_SIGNATURE> はメソッドのシグネチャで、メソッドの名前、パラメータの型、戻り値の型を含みます。たとえば、LayoutNode のメソッド fun isPlaced(): Boolean のシグネチャは、isPlaced()Z です。

  • 1 つのルールに複数のメソッドまたはクラスを含める場合は、これらのパターンにワイルドカード(***?)を使用できます。

ルールの機能

  • フラグ H が付いているメソッドは、このメソッドが「ホット」メソッドであり、事前コンパイルが必要であることを示します。

  • S フラグが付いているメソッドは、このメソッドが起動時に呼び出されるメソッドであり、コンパイルのコストと起動時にメソッドを解釈するコストを回避するために事前コンパイルが必要であることを示します。

  • P フラグが付いているメソッドは、このメソッドが起動後に呼び出されることを示します。

  • このファイルに存在するクラスは、このクラスが起動時に使用されるクラスであり、クラス読み込みのコストを回避するためにヒープで事前割り当てする必要があることを示しています。

ルールの仕組み

  • ライブラリは、AAR アーティファクトにパッケージするルールを定義できます。それらのアーティファクトを含むアプリがビルドされると、ルールが結合されます。結合されたルールは、アプリに固有のコンパクト バイナリ ART プロファイルをビルドするために使用されます。ART では、アプリがデバイスにインストールされた際にこのプロファイルを利用して、アプリの特定の部分を事前にコンパイルし、アプリのパフォーマンス(特に初回実行時)を改善できます。なお、これはデバッグ可能なアプリには影響しません。

バージョン 1.0.0-beta08

2021 年 6 月 2 日

androidx.compose.runtime:runtime-*:1.0.0-beta08 がリリースされました。バージョン 1.0.0-beta08 に含まれる commit については、こちらをご覧ください

API の変更

  • State<T>State<out T> になりました。(I69049
  • ControlledComposition API の変更により、単一パスの再コンポーズで再コンポーズの変更が可能になりました。(Iaafd1b/184173932

バージョン 1.0.0-beta07

2021 年 5 月 18 日

androidx.compose.runtime:runtime-*:1.0.0-beta07 がリリースされました。バージョン 1.0.0-beta07 に含まれる commit については、こちらをご覧ください

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 に含まれる commit については、こちらをご覧ください

API の変更

  • @ComposeCompilerApi@RequiresOptIn ではなくなりました。(Iab690

バージョン 1.0.0-beta05

2021 年 4 月 21 日

androidx.compose.runtime:runtime-*:1.0.0-beta05 がリリースされました。バージョン 1.0.0-beta05 に含まれる commit については、こちらをご覧ください

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-beta04 がリリースされました。バージョン 1.0.0-beta04 に含まれる commit については、こちらをご覧ください

バグの修正

  • この変更以前は、ローカルのコンポーズ可能な関数はパラメータに基づいてスキップ可能でした。この変更以降は、ローカルのコンポーズ可能な関数はスキップされなくなります。ローカル関数が親からパラメータを取得するのが想定される一般的な動作であり、バグのよくある理由がスキップであるため、この変更が行われました。

    以下の例を参照してください。

    @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-beta03 がリリースされました。バージョン 1.0.0-beta03 に含まれる commit については、こちらをご覧ください

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 に含まれる commit については、こちらをご覧ください

バグの修正

  • 試験運用版 API の一般使用に対する制限を適用します。(I6aa29b/174531520
  • navigation-compose のデスティネーション内で使用すると rememberSaveable { mutableStateOf(0) } が壊れる問題を修正しました。(I1312bb/180042685b/180701630

バージョン 1.0.0-beta01

2021 年 2 月 24 日

androidx.compose.runtime:runtime-*:1.0.0-beta01 がリリースされました。バージョン 1.0.0-beta01 に含まれる commit については、こちらをご覧ください

これは、Compose 1.0.0 ベータ版の最初のリリースです。

API の変更

  • 無効化されたコンポジションをメインフレーム ループから除外するように再コンポーズする、試験運用版 API Recomposer.runRecomposeConcurrentlyAndApplyChanges を追加しました。(I342d0
  • @ReadOnlyComposable としてマークされたコンポーザブルは、他の @ReadOnlyComposable だけを呼び出すように、コンパイル時に検証されるようになりました。(I58961
  • compositionLocalOfstaticCompositionLocalOfdefaultFactory は、オプションではなく必須になりました。

    この変更により、null 値非許容型(デフォルト ファクトリが提供されていない)で発生する可能性のある型エラーを解消しました。これまでは、null 値非許容型に対して null 参照を指定していました。

    null 値許容型の場合は、{ null } をデフォルト ファクトリとして提供することを検討してください。

    null 値許容型を持たないローカル変数は、有効なデフォルト値を指定しない限り、使用しないことをおすすめします。有効なデフォルトが存在しない場合、defaultFactory ラムダは例外をスローします。ただし、例外がスローされると、ローカル変数のユーザーは、その変数が型システムで適用されないという前提で、その変数に暗黙的に依存することになります。(Ifbd2a

  • サポートが終了したシンボルを Compose Runtime から削除しました。(I3252c

  • サポートが終了した emptyContent() を削除しました。代わりに {} を使用してください。(Idb33fb/179432510

  • プロバイダの名前を CompositionLocalProvider に変更しました

    • コンポジション コンストラクタがキーパラメータを受け入れなくなり、非推奨となりました。
    • currentCompositeKeyHash が、構成可能なトップレベル関数ではなく、構成可能なトップレベル プロパティになりました。
    • CompositionData と CompositionGroup を androidx.compose.runtime.tooling 名前空間に移動しました
    • ComposableLambda は具象クラスではなくインターフェースになり、型パラメータは含まれなくなりました。
    • ComposableLambdaN は具象クラスではなくインターフェースになり、型パラメータは含まれなくなりました。
    • snapshotFlow 関数を androidx.compose.runtime 名前空間に移動しました
    • SnapshotMutationPolicy の統合メソッドは試験運用版ではなくなりました
    • @TestOnly トップレベルの clearRoots 関数は削除され、不要になりました。
    • keySourceInfoOf 関数と resetSourceInfo 関数は削除され、不要になりました。
    • Composer.collectKeySourceInformation は削除され、不要になりました。
    • isJoinedKey、joinedKeyLeft、joinedKeyRight の各メソッドが削除され、不要になりました。
    • いくつかのトップレベル API を別のファイルに移動し、再編成しました。Kotlin のファイルクラス セマンティクスにより、バイナリとの互換性は損なわれますがソースコードとの互換性は維持されるので、多くのユーザーにとって問題にはなりません。
    • I99b7db/177245490
  • SnapshotStateObserver が試験運用版ではなくなりました。(Id2e6a

  • これまでにサポートが終了している API をいくつか削除しました。(Ice5dab/178633932

  • 以下の Material API 変更を加えました。

    • Top / BottomAppBar に contentPadding パラメータを追加し、デフォルトのパディングをカスタマイズできるようにしました。
    • API ガイドラインに沿って必須のパラメータがオプションのパラメータの前になるよう、BackdropScaffold 内のパラメータの順序を変更しました。
    • BottomNavigationItem の icon パラメータを selectedonClick の後ろになるよう移動しました。
    • BottomNavigationItem の alwaysShowLabels パラメータの名前を alwaysShowLabel に変更しました。
    • 一部のコンポーネントの bodyContent パラメータの名前を content のみに変更しました。
    • ButtonDefaults.buttonColors() のパラメータの順序を変更しました。パラメータの型は変更されないため、これによりコードでエラーは発生しません。名前付きパラメータを使用するか、順序を手動で更新してください。そうしないと、コードは以前と同じように動作しません。
    • darkColors()secondaryVariant パラメータを追加しました。通常、このカラーはダークテーマの secondary と同じですが、整合性とカスタマイズ性向上のために追加しました。
    • ElevationDefaults と animateElevation() はあまり使用されず、役に立っていないため、公開 API のサーフェスから削除しました。
    • SlideronValueChangeEnd の名前を onValueChangeFinished に変更し、null 可能にしました。
    • 整合性のため、Snackbartext パラメータの名前を content に変更しました。
    • DropdownMenuItemcontentPadding パラメータを追加してデフォルトのパディングをカスタマイズできるようにし、contentRowScope の拡張にしました。
    • ModalDrawerLayout の名前を ModalDrawer に変更しました。
    • BottomDrawerLayout の名前を BottomDrawer に変更しました。
    • I1cc66

バージョン 1.0.0-alpha12

2021 年 2 月 10 日

androidx.compose.runtime:runtime-*:1.0.0-alpha12 がリリースされました。バージョン 1.0.0-alpha12 に含まれる commit については、こちらをご覧ください

API の変更

  • ViewGroup は UiApprier でサポートされなくなりました。サポートが終了した emitView コンポーザブルを削除しました。(Ifb214
  • CompositionReference の名前を CompositionContext に変更しました(I53fcb
  • ComponentActivity.setContent を androidx.activity:activity-compose モジュールの androidx.activity.compose.setContent に移動しました。(Icf416
  • Snapshot API を API ガイドラインとの整合性を高め、内部実装クラスを公開 API から非表示にするように更新しました。(Id9e32
  • Ambient から CompositionLocal への名前変更に合わせて Ambient の名前を変更しました。AmbientFoo という名前の Ambient は、LocalFoo という名前の CompositionLocal になりました。(I2d55d
  • Ambient の名前を CompositionLocal に、ambientOf / staticAmbientOf の名前を compositionLocalOf / staticCompositionLocalOf にそれぞれ変更しました。この変更により、CompositionLocal の目的、つまりコンポジションのローカルな値を提供および取得するためのメカニズムがより明確化されました。CommercialLocal インスタンスには、Local のプレフィックス(たとえば、val LocalFoo = compositionLocalOf { Foo() })を付ける必要があります(Ia55b6
  • takeMutableSnapshot と takeSnapshot は、スナップショットのコンパニオン メソッドに移動しました。(I91f19
  • @ComposableContract のサポートが終了し、3 つの具体的なアノテーションを使用するようになりました。

    @ComposableContract(restartable = false)@NonRestartableComposable になり、@ComposableContract(readonly = true)@ReadOnlyComposable になり、@ComposableContract(preventCapture = true)@DisallowComposableCalls になり、@ComposableContract(tracked = true) が削除されました。(I60a9d

  • emptyContent() と (@Composable () -> Unit).orEmpty() ユーティリティのサポートを終了しました(パフォーマンス上の効果や価値がなくなったため)(I0484d)。

  • snapshotFlowwithMutableSnapshot は試験運用版ではなくなりました(I6a45f

  • Recomposer をクローズできるようになりました。クローズされた Recomposer は、コンポジション子コルーチンが完了するまで再コンポジションを続けます。Recomposer.shutDown の名前を cancel に変更して close と対比させるようにしました。(Ib6d76

  • compose:runtime-dispatch アーティファクトのサポートを終了しました。MonotonicFrameClock は compose:runtime に、また AndroidUiDispatcher は compose:ui に含まれるようになりました。(Ib5c36

  • Compose コンパイラ プラグインの対象となる API は、具象クラスではなくインターフェースを使用するようにリファクタリングされました。また、それらのインターフェースは、タイプ パラメータを使用しなくなりました。

    この内部変更はソースコードの互換性には影響を与えませんが、バイナリの互換性を破る変更になります。(I3b922b/169406779

  • SnapshotMutableState を導入しました(Icfd03

  • DisposableEffectDisposable の名前を DisposaleEffectResult に変更しました(Ica7c6

  • Recomposer.current() を削除しました。[Abstract]ComposeView のデフォルトは、遅延的に作成されたウィンドウ スコープの Recomposer(ウィンドウの ViewTreeLifecycleLifecycle によって駆動される)になりました。ホスト ライフサイクルが停止すると、再コンポジションと 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 に含まれる commit については、こちらをご覧ください

API の変更

  • onCommit、onDispose、onActive を非推奨にし、SideEffect API と DisposableEffect API に置き換えました。(If760e
  • emit() API とすべてのオーバーロードのサポートが終了し、名前が ComposeNode に変更されました。API 自体は同じもので、Compose の命名規則に従うように名前だけが変更されています。(I4137b
  • invalidate と compositionReference() を非推奨にし、それぞれ currentRecomposeScope と rememberCompositionReference に置き換えました。(I583a8
  • RememberObserver が CompositionLifecycleObserver に置き換わり、CompositionLifecycleObserver のサポートが終了しました。

    RememberObserverCompositionLifecycleObserver に置き換えました。セマンティクスを変更し、メソッドの名前を変更しました。新しい API への変更は、1 回だけ記憶されているオブジェクトに対しては機械的に行うことができます(引き続き、これがおすすめの方法です)。ただし、参照がコンポジション内で複数回記憶されている場合は、onEnter が 1 回だけ呼び出される参照ごとに onRemembered が呼び出されます。オブジェクトが WithConstraintsScaffold などのサブコンポジションで使用されていた場合、onEnter が複数回呼び出されることで単一の onEnter 呼び出しの保証の信頼性が損なわれていましたが、RememberObserver では削除されました。

    RememberObserver は、remember に渡されたコールバックから RememberObserver インスタンスが返された場合に呼び出される onAbandoned を追加しますが、コンポジションの状態には記憶されないため、onRemembered が呼び出されることはありません。これは、例外によってコンポジションが完了前に終了する場合や、コンポジションの生成状態が最新でなくなった、あるいは不要になったためにコンポジションが破棄された場合などに発生することがあります。上記の単一参照の推奨事項に沿った RememberObserver のインスタンスが外部リソースを追跡している場合、onForgottenonAbandoned の両方が、リソースが不要になったことを示します。オブジェクトが、開始された処理または onRemembered に割り当てられたリソースを追跡する場合、onRemembered が呼び出されても onAbandoned は呼び出されないため、onAbandoned は無視できます。(I02c36

  • collectAsState() 関数をインラインとしてマークしないでください。(Ia73e4

バグの修正

  • WithConstraints は BoxWithConstraints として再構築され、founds.layout に移動しました。(I9420bb/173387208
  • テストでは TestCoroutineDispatcher を利用します。(I532b6

バージョン 1.0.0-alpha10

2021 年 1 月 13 日

androidx.compose.runtime:runtime-*:1.0.0-alpha10 がリリースされました。バージョン 1.0.0-alpha10 に含まれるコミットについては、こちらをご覧ください。

互換性を破る変更

  • 内部コンパイラ API の再構成により、コンポーズの結果として生成されたノードへの変更は、@Composable 関数がすべて完了した後、コンポーズの「変更を適用」フェーズで一括適用されるようになりました。

    これは、動作面の互換性を破る変更です。この変更により、ノードは変更が適用されるまでの間、内部 API や試験運用版 API から使用できなくなるため、アプリコードの変更が必要になる可能性があります。通常この問題を回避するには、ノードが生成されて初期化されるまでコードの実行を遅らせるよう、SideEffect コンポーザブルの依存関係でコードを囲むようにします。(I018da

API の変更

  • Recomposer によって変更が適用されたかどうかをトラッキングする方法を追加しました。(I1b3e2
  • [Abstract]ComposeView API を拡張することにより、コンポジションを破棄後に再作成して、Compose ベースのビューをリサイクルできるようにしました。子コンポジションを作成するためのウィンドウ スコープの Recomposer と ComposerReference をインストールおよび検出するための API を追加します。

    [Abstract]ComposeViews のコンポジション破棄戦略を設定するための ViewCompositionStrategy を追加します。デフォルトでは、ウィンドウのデタッチ時に破棄されます。(I860ab

バグの修正

  • Recomposer の現時点における状態のフローが公開され、そのアクティビティおよび関連する効果のアクティビティをモニタリングできるようになりました。(Ifb2b9
  • ネイティブ keyEvent に keyEvent.nativeKeyEvent でアクセスできるようになりました。(I87c57b/173086397

バージョン 1.0.0-alpha09

2020 年 12 月 16 日

androidx.compose.runtime:runtime-*:1.0.0-alpha09 がリリースされました。バージョン 1.0.0-alpha09 に含まれる commit については、こちらをご覧ください。

API の変更

  • SlotTable、SlotReader、SlotWriter を公開 API から削除しました。これらは、以前 InternalComposeAPI としてマークされていました。現在は Compose モジュールの内部にあります。

    コンポジション情報の抽出に使用するため、CompositionData と CompositionGroup が UI-Tooling API に代わって追加されました。これらは公開されていますが、UI-Tooling API が解釈する未加工の情報を提供するので、UI-Tooling API の外部での使用は想定されていません。(I31a9c

  • Appier クラスは試験運用版 API と見なされなくなりました。(Id85b0

  • Applier インターフェースが変更され、トップダウンではなくボトムアップでツリーのビルドが簡素化されました。

    insert() メソッドの名前が insertTopDown() に変更されました。

    新しいメソッド insertBottomUp() が追加されました。

    Applier は、編集対象のツリーにノードを挿入する際に、insertTopDown() または insertBottomUp() のうちパフォーマンスが優れているほうを使用します。

    LayoutNodeView などの一部のツリーは、トップダウンよりボトムアップのほうが効率的にビルドできます。この変更の前は、ボトムアップを実装するために大量の挿入が必要でした。パフォーマンスを向上させるためにボトムアップの構築を必要とするすべての Applier にボトムアップをコピーする必要があったためです。この変更により、ApplierinsertBottomUp()insertTopDown() をオーバーライドし、それぞれボトムアップとトップダウンでツリーをビルドするようになりました。(Icbdc2

  • Compose は、コンポーズ可能な呼び出しを行えるプロパティ ゲッターをサポートしています。このサポートは終了しませんが、プロパティ ゲッターを @Composable として宣言する構文が変更されます。

    サポートが終了した構文では、これを行うためにプロパティ自体にアノテーションを付けていました。

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

    現在の適切な構文では、これを行うためにプロパティのゲッターにアノテーションを付けます。

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

    当面はどちらの構文も機能しますが、サポートが終了した構文はいずれはコンパイル エラーになります。(Id9197

バグの修正

  • AndroidOwner が内部に隠蔽されました。(Ibcad0b/170296980
  • subcomposeInto(LayoutNode) が内部に隠蔽されました。(Id724a

バージョン 1.0.0-alpha08

2020 年 12 月 2 日

androidx.compose.runtime:runtime-*:1.0.0-alpha08 がリリースされました。バージョン 1.0.0-alpha08 に含まれる commit については、こちらをご覧ください。

API の変更

  • Compose のガイドラインとの整合性を確認するため、コンポーズ可能なラムダ パラメータの名前と位置に対する lint チェックを追加しました。また、lint チェックおよびガイダンスに従って、後置ラムダの名前として children を使用する一部の API を content に移行しました。(Iec48e
  • Recomposer は EmbeddingContext を受け入れなくなりました。必要なスケジューリング依存関係は effectCoroutineContext から取得されます。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 に含まれる commit については、こちらをご覧ください。

新機能

API の変更

  • @UnionType アノテーションのサポートが終了しました(I57cde
  • アンビエントを提供する代替手段として provideDefault が追加されました。アンビエント値がまだ提供されていない場合にのみ設定されるアンビエント値を指定するために使用できます。(Id6635b/171024925
  • SideEffect API と DisposableEffect API との整合性を持たせるために、LaunchedTask の名前が LaunchedEffect に変更されました。ベスト プラクティスを促進するために、サブジェクト パラメータのない LaunchedEffect は許可されません。(Ifd3d4
  • Applier に、Composer がツリーへの変更の適用を開始 / 終了したときに呼び出される onBeginChanges / onEndChanges コールバックが追加されました。必要に応じてリソース管理のバッチ処理に使用できます。(Icf476
  • Recomposer は、作成時に CoroutineContext が必要になりました(Ic4610
  • 公開 API に影響を与えない、内部 SlotTable 実装に変更しました。(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

外部からの協力

  • Compose 用の runtime-rxjava3 モジュールを追加しました。runtime-rxjava2 に類似しています(I02cbf

バージョン 1.0.0-alpha06

2020 年 10 月 28 日

androidx.compose.runtime:runtime-*:1.0.0-alpha06 がリリースされました。バージョン 1.0.0-alpha06 に含まれるコミットについては、こちらをご覧ください。

API の変更

  • Recomposer が CompositionReference になり、有効なコンポジションの親になりました。明示的な Recomposer が必要な場面は少なくなりました。(I4036f
  • SideEffect に対応する DisposableEffect の API を追加しました。onCommit-with-params の役割を果たしますが、onDispose が必要です。
    • 再コンポジションから進行中または長期のプロセス(DisposableEffects や LaunchedTasks などの)にデータをパブリッシュする rememberUpdatedState API を追加しました。
    • 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-alpha05 がリリースされました。バージョン 1.0.0-alpha05 に含まれるコミットについては、こちらをご覧ください

API の変更

  • 試験運用版の Modifier.pointerInput 入力一時停止修飾子(Ia77d2
  • LazyColumn/Row のスクロール パフォーマンスが、スクロールごとのサブコンポジションでの作業を軽減することで改善されました。Composition クラス用の新しい hasInvalidations() メソッドが追加されました。Recomposer の hasPendingChanges() メソッドは hasInvalidations() という名前に変更されました(Ib2f32b/168293643b/167972292b/165028371
  • 時間をかけて単一の State<T> 値を更新するコンポジションからコルーチンを起動するために produceState API が追加されました(Id4a57
  • Compose API ガイドラインに合わせて launchInComposition が LaunchedTask という名前に変更されました(I99a8e
  • カスタム Layouts での place() 呼び出しの順序で、子の描画順序を定義できるようになりました(Ibc9f6

バージョン 1.0.0-alpha04

2020 年 10 月 1 日

androidx.compose.runtime:runtime-*:1.0.0-alpha04 がリリースされました。バージョン 1.0.0-alpha04 に含まれる commit については、こちらをご覧ください

API の変更

  • レイアウトや図形描画のモニタリング スコープを、有効でなくなった後に収集できるように、OwnerScope を追加しました。(Ic4cf8
  • 計算に基づいて状態オブジェクトを作成するための derivedStateOf API を追加し、他の状態オブジェクトを読み込んで(そこから導出して)状態オブジェクトを作成するようにしました。(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-alpha03 がリリースされました。バージョン 1.0.0-alpha03 に含まれるコミットについては、こちらをご覧ください

API の変更

  • CompositionCoroutineScopeMonotonicFrameClock を実装しなくなりました。withFrameNanos の呼び出し元は、トップレベル関数を明示的にインポートする必要があります。(Icb642b/166778123

バグの修正

  • onNodewaitForIdle などのグローバル テスト関数のサポートは終了しました。ComposeTestRule で定義されている新しい同等の関数に移行してください(I7f45a
  • launchInComposition がディスパッチされていないコルーチンを開始しないようになりました(Ief6afb/166486000

バージョン 1.0.0-alpha02

2020 年 9 月 2 日

androidx.compose.runtime:runtime-*:1.0.0-alpha02 がリリースされました。バージョン 1.0.0-alpha02 に含まれる commit については、こちらをご覧ください

API の変更

  • Snapshot データの変更の消費および生成用に snapshotFlow および withMutableSnapshot API が追加されました。(I3e722
  • コンポーズ可能な関数の呼び出し規則が変更されました。これは互換性を破るバイナリの変更です。このバージョンの Compose コンパイラ プラグインで動作するには、すべてのライブラリを再コンパイルする必要があります。

    変更された API は明示的なオプトインがあるコンパイラ API だけであるため、ソースレベルで互換性を破る変更はありません。(I7afd2b/158123185

  • EmbeddingContext からスケジュール設定メソッドを削除しました。(I7b9be

  • onPrecommit は非推奨です。onCommit で onPrecommit の動作がサポートされるようになりました。

    onCommit と onActive は、次の Choreographer フレームの開始時点ではなく、構成要素の変更が commit された同じ Choreographer フレームで実行されるようになりました。(I70403

バージョン 1.0.0-alpha01

2020 年 8 月 26 日

androidx.compose.runtime:runtime-*:1.0.0-alpha01 がリリースされました。バージョン 1.0.0-alpha01 に含まれるコミットについては、こちらをご覧ください

バージョン 0.1.0-dev

バージョン 0.1.0-dev17

2020 年 8 月 19 日

androidx.compose.runtime:runtime-*:0.1.0-dev17 がリリースされました。バージョン 0.1.0-dev17 に含まれるコミットについては、こちらをご覧ください

API の変更

  • カスタム出力では、1 つ以上のセッターをスキップし、その出力とは関係なく再コンポーズできることを宣言できるようになりました。(Ibbd13
  • サポートが終了した FrameManager の呼び出しを削除しました。

    内部コンポーズ API が変更され、mutableStateof() などの状態オブジェクトを追跡するオーバーヘッドが減りました。(I80ba6

  • 明確化のため、state { ... } composable のサポートを終了し、remember { mutableStateOf(...) } の明示的な呼び出しに置き換えました。これにより、状態管理の API サーフェス全般とコンセプトの数が縮小され、クラス プロパティ委任の by mutableStateOf() パターンと一致するようになります。(Ia5727

  • Flow.collectAsState は、デフォルト ディスパッチャを Dispatchers.Main にせず、コンポジション自体から決定するようになりました。(I9c1d9

  • 状態を保存する何かが for ループ内で使用されたときにクラッシュする問題が修正されました。savedInstanceState() で同じキーを使用できるようになり、これに合わせて UiSavedStateRegistry の API が調整されました。(I4ab76b/160042650b/156853976b/159026663b/154920561

バグの修正

  • emitView のサポートが終了しました。Compose 内で View を出力する場合、可能であれば、代わりに AndroidView を使用してください。View と ViewGroup を直接コンポーズする方法は、将来サポートされなくなります。ただし、これらがコンポジション ツリーに残っていて、AndroidView を使用してコンポーズされる場合は除きます。(I29b1eb/163871221

バージョン 0.1.0-dev16

2020 年 8 月 5 日

androidx.compose.runtime:runtime-*:0.1.0-dev16 がリリースされました。バージョン 0.1.0-dev16 に含まれるコミットについては、こちらをご覧ください

API の変更

  • mutableStateOf()ambientOf()savedInstanceStateOf() のデフォルトの変更ポリシーが、referentialEqualityPolicy() から structuralEqualityPolicy() に変更されました。

    mutableStateOf() インスタンスへの代入を変更とみなすかどうかの決定に使用する等価演算子のデフォルトを、=== から == に変更しました。

    詳しくは、https://kotlinlang.org/docs/reference/equality.html をご覧ください。

    ambientOf()savedInstanceStateOf() は実装で mutableStateOf() を使用しているため、mutableStateOf() との整合性をとるための変更を行いました。

    構造的等価性の使用はデベロッパーの想定に近いものです。

    たとえば、

    val state = mutableStateOf(1f)
    

    の後に

    state.value = 1f
    

    を実行したとしても、state への変更とはみなされず、コンポジション中に state を使用しても再コンポジションは不要となります。

    これは互換性を破る変更ですが、ほとんどの場合(equals() をオーバーライドしないクラスを使用する場合など)、アプリに目立った影響はありません。

    equals() をオーバーライドするクラス(data クラスなど)では、パフォーマンスが低下する可能性があります。これは、mutableStateOf() に代入された場合にデフォルトで equals() メソッドが呼び出されるためです。

    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 が SwipeableState クラスを継承するようにリファクタリングされました。[Modal/Bottom]DrawerLayout が onStateChange パラメータを取らなくなりました。(I72332b/148023068

  • Modifier.plus のサポートが終了しました。代わりに Modifier.then を使用してください。then により、順序が明確化され、Modifier.padding().background() + anotherModifier と書いてチェーンを分断し可読性を下げることが防止されます。(Iedd58b/161529964

  • SubcomposeLayout を追加しました。これは、測定中に後にならないと使用できない値を使用してサブツリーをコンポーズする場合に、子をコンポーズできるようにする低レベル プリミティブです。たとえば、WithConstraints は SubcomposeLayout を使用せずに実装されています。(I25cc8

  • material の FilledTextField を TextField に、foundation の TextField を BaseTextField に名前変更し、シンプルで望ましい API を簡単に見つけて使用できるようにしました。(Ia6242b/155482676

  • Modifier.drawBackground の名前が Modifier.background に変更されました。(I13677

バージョン 0.1.0-dev15

2020 年 7 月 22 日

androidx.compose.runtime:runtime-*:0.1.0-dev15 がリリースされました。バージョン 0.1.0-dev15 に含まれるコミットについては、こちらをご覧ください

依存関係の更新

  • 0.1.0-dev15 バージョンの Compose を使用するには、上記の依存関係の宣言で示されている新しいコード スニペットに従って、依存関係を更新する必要があります。

API の変更

  • @Model アノテーションのサポートが終了しました。代わりに state と mutableStateOf を使用してください。このサポート終了は、慎重に検討されたうえで決定されたものです。

    サポート終了の理由

    主な理由を以下に示します。

    • API に関する項目と概念について、指南が必要な内容を減らす。
    • 他の同等のツールキット(Swift UI、React、Flutter)との連携をより緊密にする。
    • サポート終了の判断を取り下げることができる。@Model はいつでも元に戻すことができます。
    • @Model の構成に関して、以下のようなまれな使用例をなくし、回答の難しい質問が出ないようにする。
    • @Model データクラス、等式、ハッシュコードなど。
    • 一部のプロパティを監視対象とし、その他のプロパティは監視対象としない方法。
    • 監視を行う際に使用する構造等価式と参照等価式の指定方法。
    • システムへの「過度な期待」を減らす。システムの能力が過信されること(リストの差分取得の方法がすでにあると考えるなど)が少なくなるようにします。
    • 監視の粒度をより直感的にする。
    • リファクタリングにより、変数をクラスのプロパティにできる可能性を高める。
    • State を個別に操作して最適化が行える可能性を高める。
    • エコシステムの他の部分との連携をより緊密にし、State が変更不能であることによる曖昧さを軽減する(変更可能な State を活用する)。

    移行メモ

    @Model の既存の使用例については、下の 2 つの方法のいずれかに、ほぼすべて容易に変換できます。以下に、2 つのプロパティを含み、コンポーズ可能な関数内で使用される @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 プロパティにして、remember ではなく state を使用します。そして、データクラスの copy(...) コンビニエンス メソッドを使用して、元のクラスのコピーに state の値を割り当てます。

    このアプローチが機能するのは、State インスタンスが作成されたスコープと同じスコープで、クラスに対する変更だけが行われた場合であることに注意してください。スコープ外でクラスの変更が内部的に行われており、その監視に依存している場合は、次のアプローチを使用します。

    data class Position(
     val x: Int,
     val y: Int
    )
    
    @Composable fun Example() {
     var p by state { Position(0, 0) }
     PositionChanger(
       position=p,
       onXChange={ p = p.copy(x=it) }
       onYChange={ p = p.copy(y=it) }
     )
    }
    

    方法 2: mutableStateOf とプロパティ委任を使用する

    このアプローチは、Kotlin でのプロパティ委任と mutableStateOf API を使用することで簡単に実施できます。コンポジションの外部に MutableState インスタンスを作成することが可能です。基本的には、元のクラスのすべての var プロパティを、プロパティ委任として mutableStateOf を持つ var プロパティに置き換えます。このアプローチには、クラスの使用方法の変更が一切なく、クラスの内部実装のみが変更されるという利点があります。ただし、各プロパティが個別に監視および登録されるようになるため、元の例とまったく同じ動作にはなりません。リファクタリング後に再度コンポジションが作成される際には、対象が限定されるという利点もあります。

    class Position(x: Int, y: Int) {
     var x by mutableStateOf(x)
     var y by mutableStateOf(y)
    }
    
    // source of Example is identical to original
    @Composable fun Example() {
     var p = remember { Position(0, 0) }
     PositionChanger(
       position=p,
       onXChange={ p.x = it }
       onYChange={ p.y = it }
     )
    }
    

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

  • Compose のコンパイラにおけるコード生成の仕様を変更しました。変更前の Compose コンパイラでは、コンポーズ可能な関数の呼び出し部分を変換していました。変更後はコンポーズ可能な関数の本文を変換し、呼び出し部分での変換は一部を除いて行いません。

    つまり、Compose ランタイムとのロジック上のやり取りは、呼び出し部分ではなく関数本文の開始部分で発生します。

    この変更は Compose の使用方法に関わらずソース互換であり、Compose を使用していても通常はコードを更新する必要はありません。

    この処理をサポートするため、すべてのコンポーズ可能な関数の JVM の署名が変更されました。コンポーズ可能な関数でパラメータを 1 つ受け取る場合、3 つのパラメータを受け取る関数に変換されます。追加されるパラメータは Composer と「key」整数です。ビットマスク整数として、呼び出しを通じてメタデータを伝達する際に使用されます。

    なお、デフォルトの引数がコンポーズ可能な関数に変換されるようになっています。変換時に、関数の合成によるオーバーロードがデフォルトで行われることはないため、定義される関数の数は少なくなります。

    今回の変更による確認済みの意図的な動作変更は次のとおりです。

    1. 一部の呼び出しが、変更前にはスキップされなかった箇所でスキップされる。
    2. デフォルトの引数を含む式で、コンポーズ可能な式が正しく登録および処理される。

    最適化に関しては、次の内容が含まれます。 1. パラメータの比較結果が、コールグラフを介して他のコンポーズ可能な関数に伝達される。その結果、実行時の比較処理が減ってスロット テーブルのサイズが小さくなる。また、スキップされるコンポーズ可能な関数が以前よりも増える。 2. コンパイル時に「静的」と判定されたパラメータは実行時に比較または保存されなくなる。その結果、比較処理が減ってスロット テーブルのサイズが小さくなる。 3. 関数の本文に制御フロー構造が使用され、生成されるグループの数が最小限に抑えられる。その結果、スロット テーブルのサイズが小さくなり、実行時の処理が減少する。 4. 関数に渡される未使用のディスパッチ パラメータとレシーバ パラメータが、関数の本文内で使用されていない場合には、関数のスキップを行うかどうかの判断には用いられない。

    互換性を破る変更のほとんどは、コンパイラが直接ターゲットとする API に関するものであり、compose の一般的な使用には影響しません。 1. Composer::startExpr が削除されました。 2. Composer::endExpr が削除されました。 3. Composer::call のサポートが終了しました。 4. key の non-varargs のオーバーロードが削除されました。今後は vararg バージョンを使用してください。 5. Pivotal アノテーションのサポートが終了しました。代わりに key を使用してください。6. ScopeUpdateScope::updateScope が変更され、Function1 ではなく Function3 を想定するようになりました。7. restartableFunction と restartableFunctionN が更新され、コンパイル時パラメータが追加されました。(I60756b/143464846

  • sortWith と removeRange を MutableVector に追加しました。(Icccf7

  • CompositionLifecycleObserver のデフォルトのメソッド実装を追加しました。(I24289

  • Applier には、コンポジションを破棄するための clear() メソッドが必要になりました。(Ibe697

  • asMutableList() を MutableVector に追加しました。これにより、リスト全体をコピーしなくても公開 API に渡せるようになりました。(I298df

  • コンポジション内の管理対象の CoroutineScope を取得するための rememberCoroutineScope() を追加して、イベントに応じてジョブを起動できるようにしました。(I0e264

  • MutableVector は、標準の Collection インターフェースを実装しない新しいコレクションです。このコレクションは、他の要件を超える速度を提供し、内部実装でのみ使用されます。(I8ebd6

  • Compose が必要とする Kotlin のバージョンの問題を避けるために、StableMutableListStableMutableMap を一時的に削除しました。これらのインターフェースは、Compose が問題のないバージョンの Kotlin に更新され次第、再導入される予定です。

    SnapshotStateListSnapshotStateMap は現在公開されていますが、StableMutableListStableMutableMap が再導入され次第、サポート終了となります。(Ia7769

  • アニメーションのタイミングをサポートする最上位レベルの withFrameNanos 関数を追加しました。(Ie34c5

  • @Untracked アノテーションが非推奨になりました。@ComposableContract(tracked=false) に置き換えます。(Id211e

  • RestartableFunction および関連する API の名前が ComposableLambda などに変更されました。これらの API をターゲットとしていたのはコンパイラのみのため、通常はこの名前変更がソースレベルの互換性に影響することはありません。この名前変更の主な目的は、このクラスがスタック トレースに表示されたときにその長所を伝えるためです。(I7eb25

  • @Composable アノテーションをクラスで使用できなくなりました。(Ia5f02

  • Ambient<T> が @Immutable ではなく @Stable になりました。(I0b4bb

  • この変更が行われる前、compose コンパイラ プラグインは、スコープ内の解決された「composer」に「emit 演算子」メソッドが見つかった場合、@Composable 関数内のコンストラクタの呼び出しに対して自明でないインターセプトを実行していました。(I5205ab/158123804

  • Recompose composable は、有用な抽象化ではなくなりました。ほとんどの場合、再コンポーズは、MutableState 割り当ての結果として生じます。それ以外の場合は、invalidate 関数を使用して、現在のスコープの再コンポーズをトリガーすることをおすすめします。(Ifc992

  • Observe は有用な抽象化ではなくなりました。Observe を複製する必要がある場合は、コンポーズ可能なラムダ パラメータを実行するコンポーズ可能な関数を作成することにより、Observe の実装を複製できます。例: @Composable fun Observe(body: @Composable () -> Unit) = body()I40d37

  • @Direct のサポートが終了し、@ComposableContract(restartable=false) に置き換えられました。(If4708

  • 最近導入された StateFlow 用のアダプタを追加しました。State が返される際に null になることがないように、初期値を事前入力できます(I61dd8b/156233789)。

  • Flow 用のアダプタを追加しました。使用例: val value by flow.collectAsState()(If2198b/153375923

  • [Mutable] State プロパティ デリゲート演算子が、Kotlin 1.4 のプロパティ デリゲート最適化に対応するため、拡張機能に移動されました。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 が返す Compositiondispose メソッドを使用してください。androidx.compose.Compose.subcomposeInto は androidx.ui.core.subcomposeInto に移動されました。ComponentNode#emitInsertAt の名前が ComponentNode#insertAt に変更されました。ComponentNode#emitRemoveAt の名前が ComponentNode#removeAt に変更されました。ComponentNode#emitMode の名前が ComponentNode#move に変更されました。(Idef00

  • ComposeFlags.COMPOSER_PARAM フラグを true に更新しました。これにより、compose プラグインのコード生成方法が変更されます。概略としては、ランタイムが実行を適切に管理できるようにするため、@Composable 関数が追加の合成パラメータで生成され、このパラメータがその後の @Composable 呼び出しに渡されます。これは互換性を破る重大なバイナリの変更ですが、compose のすべての許可される使用方法でソースレベルの互換性が保持されます。(I7971c

  • アンビエント API を大幅に変更しました。詳細については、ログと Ambient<T> のドキュメントをご覧ください(I4c7eeb/143769776

  • ui-livedata(Live Data 用アダプタを含む新しいアーティファクト)を追加しました。使用例: val value by liveData.observeAsState()(Ie9e8cb/150465596

  • 明示的な初期値のない Rx アダプタが非推奨になりました。null を使用することは、必ずしも最適なデフォルトではありません。たとえば、List を使用する場合は、emptyList() などの妥当なデフォルトから始めることをおすすめします。(I00025b/161348384

  • ui-rxjava2(RxJava2 用アダプタを含む新しいアーティファクト)を追加しました。使用例: val value by observable.subscribeAsState()(Ifab4bb/153369097

  • savedInstanceState() で null 許容型を使用できるようになりました。(I6847fb/153532190

  • 新しい listSaver() と mapSaver() により、カスタムの Saver オブジェクトを簡単に記述できるようになりました。(I8cf68b/152331508

  • 新しい関数: savedInstanceState() および rememberSavedInstanceState()。これらは state() や remember() に似ていますが、保存されたインスタンスの状態のサポートが組み込まれています。(If1987b/152025209

バグの修正

  • runOnIdleCompose の名前が runOnIdle に変更されました。(I83607
  • LayoutNode API が試験運用版になりました。(I4f2e9
  • androidx.ui.foundation.TextFieldValue と androidx.ui.input.EditorValue のサポートが終了しました。この型を使用する TextField、FilledTextField、CoreTextField の各 composable も非推奨になりました。代わりに androidx.ui.input.TextFieldValue を使用してください。(I4066db/155211005
  • 非推奨となった DrawBackground API が削除され、Modifier の drawBackground 拡張機能 API に置き換えられました。色、ブラシ、ペイントに関する drawBackground 実装をリファクタリングし、コードパスを削減するとともに、コンポジションの一部として Modifier を作成する必要をなくしました。(I0343a
  • キャンバスを公開するハイレベルの Compose API を更新して、代わりに CanvasScope を公開するようにしました。これにより、ユーザーが独自の Paint オブジェクトを維持管理する必要がなくなります。引き続きキャンバスの利用が必要なユーザーは、drawCanvas 拡張メソッドを使用できます。このメソッドにより、対象のキャンバスに対して Draw コマンドを実行するコールバックが行われます。(I80afd
  • WithConstraints 後置ラムダ API が変更されました。2 つのパラメータに代わってレシーバ スコープが設けられ、constraints と layoutDirection に加えて、Dp 単位で指定する minWidth、maxWidth、minHeight、maxHeight プロパティが用意されました。(I91b9ab/149979702
  • 対称パディング修飾子を追加しました。(I39840
  • 任意の Alignment ではなく垂直方向または水平方向の Alignment を受け入れるように、wrapContentWidth と wrapContentHeight を更新しました。垂直方向または水平方向の Alignment を受け入れるように、重力修飾子を更新しました。カスタムの連続 Alignment をサポートすることを目的として 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 のメンバーに、行と列の外部からアクセスできるようになりました。(I3a641
  • LayoutFlexible の名前を LayoutWeight に変更しました。このパラメータを補うために tight パラメータの名前を変更しました。(If4738
  • WithConstraint に LayoutDirection パラメータが追加されました(I6d6f7
  • background の名前が DrawBackground に変更され、デフォルトで記憶されるようになりました。(Ia0bd3
  • ButtonStyle を別の関数に置き換え、テキスト(文字列)オーバーロードを削除しました。使用方法については、更新済みのサンプルをご覧ください。(If63abb/146478620b/146482131
  • runOnIdleComposerunOnUiThread が ComposeTestRule のメソッドではなくグローバル関数になりました。(Icbe8f

外部からの協力

  • Looper や Handler などの不要な API が Compose Runtime 移植レイヤから削除されました。(I6847d
  • 初期値のない Flow<T>.collectAsState() が非推奨になりました。代わりに StateFlow<T> を使用するか、明示的な初期値を渡してください。(I63f98b/157674865