Compose Runtime
最新の更新 | 現在の安定版リリース | 次のリリース候補 | ベータ版リリース | アルファ版リリース |
---|---|---|---|---|
2020 年 12 月 16 日 | - | - | - | 1.0.0-alpha09 |
構造
Compose は、androidx
内の 6 つの Maven グループ ID を組み合わせたものです。各グループには対象となる機能のサブセットが含まれており、それぞれに固有のリリースノートがあります。
次の表に、各グループの説明と、それぞれのリリースノートのリンクを示します。
グループ | 説明 |
---|---|
compose.animation | Jetpack Compose アプリ内でアニメーションを作成して、ユーザー エクスペリエンスを拡充します。 |
compose.compiler | @Composable 関数を変換し、Kotlin コンパイラ プラグインで最適化を有効にします。 |
compose.foundation | すぐに使用できるビルディング ブロックで Jetpack Compose アプリを作成し、基盤を拡張して独自のデザイン システム要素を構築します。 |
compose.material | すぐに使用できるマテリアル デザイン コンポーネントで Jetpack Compose UI を構築します。Compose の上位レベルのエントリ ポイントであり、www.material.io のガイドラインと適合するコンポーネントを提供するように設計されています。 |
compose.runtime | Compose のプログラミング モデルと状態管理の基本ビルディング ブロックと、Compose コンパイラ プラグインがターゲットとするコアランタイム。 |
compose.ui | レイアウト、描画、入力などのデバイス操作に必要な Compose UI の基本コンポーネント。 |
依存関係の宣言
Compose への依存関係を追加するには、Google の Maven リポジトリをプロジェクトに追加する必要があります。詳しくは、Google の Maven リポジトリをご覧ください。
アプリまたはモジュールの build.gradle
ファイルに、必要なアーティファクトの依存関係を追加します。
dependencies { implementation "androidx.compose.runtime:runtime:1.0.0-alpha03" implementation "androidx.compose.runtime:runtime-livedata:1.0.0-alpha03" implementation "androidx.compose.runtime:runtime-rxjava2:1.0.0-alpha03" } android { buildFeatures { compose true } composeOptions { kotlinCompilerVersion "1.4.0" kotlinCompilerExtensionVersion "1.0.0-alpha03" } } tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach { kotlinOptions { jvmTarget = "1.8" freeCompilerArgs += ["-Xallow-jvm-ir-dependencies", "-Xskip-prerelease-check"] } }
依存関係について詳しくは、ビルド依存関係の追加をご覧ください。
フィードバック
お寄せいただいたフィードバックは Jetpack 改善の参考にさせていただきます。新しい問題が見つかった場合や、このライブラリを改善するアイデアをお持ちの場合は、お知らせください。新しい問題を報告していただく前に、このライブラリの既存の問題をご確認ください。スターボタンをクリックすると、既存の問題に投票できます。
詳細については、Issue Tracker のドキュメントをご覧ください。
バージョン 1.0.0
バージョン 1.0.0-alpha09
2020 年 12 月 16 日
androidx.compose.runtime:runtime-*:1.0.0-alpha09
がリリースされました。バージョン 1.0.0-alpha09 に含まれるコミットについては、こちらをご覧ください。
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()
のうちパフォーマンスが優れているほうを使用します。LayoutNode
やView
などの一部のツリーは、トップダウンよりボトムアップのほうが効率的にビルドできます。この変更の前は、ボトムアップを実装するために大量の挿入が必要でした。パフォーマンスを向上させるためにボトムアップの構築を必要とするすべての Applier にボトムアップをコピーする必要があったためです。この変更により、Applier
はinsertBottomUp()
とinsertTopDown()
をオーバーライドし、それぞれボトムアップとトップダウンでツリーをビルドするようになりました。(Icbdc2)Compose は、コンポーズ可能な呼び出しを行えるプロパティ ゲッターをサポートしています。このサポートは終了しませんが、プロパティ ゲッターを @Composable として宣言する構文が変更されます。
サポートが終了した構文では、これを行うためにプロパティ自体にアノテーションを付けていました。
@Composable val someProperty: Int get() = ...
現在の適切な構文では、これを行うためにプロパティのゲッターにアノテーションを付けます。
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 の変更
- 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 に含まれるコミットについては、こちらをご覧ください。
新機能
API の変更
@UnionType
アノテーションのサポートが終了しました(I57cde)- アンビエントを提供する代替手段として provideDefault が追加されました。アンビエント値がまだ提供されていない場合にのみ設定されるアンビエント値を指定するために使用できます。(Id6635、b/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 に移動しました。(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)
- SideEffect に対応する DisposableEffect の API を追加しました。onCommit-with-params の役割を果たしますが、onDispose が必要です。
- 再コンポジションから進行中または長期のプロセス(DisposableEffects や LaunchedTasks などの)にデータをパブリッシュする rememberUpdatedState API を追加しました。
- (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() メソッドが追加されました。Recomposer の hasPendingChanges() メソッドは hasInvalidations() という名前に変更されました(Ib2f32、b/168293643、b/167972292、b/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 に含まれるコミットについては、こちらをご覧ください。
API の変更
- レイアウトや図形描画のモニタリング スコープを、有効でなくなった後に収集できるように、OwnerScope を追加しました。(Ic4cf8)
- 計算に基づいて状態オブジェクトを作成するための derivedStateOf API を追加し、他の状態オブジェクトを読み込んで(そこから導出して)状態オブジェクトを作成するようにしました。(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
などのグローバル テスト関数のサポートは終了しました。ComposeTestRule で定義されている新しい同等の関数に移行してください(I7f45a)launchInComposition
がディスパッチされていないコルーチンを開始しないようになりました(Ief6af、b/166486000)
バージョン 1.0.0-alpha02
2020 年 9 月 2 日
androidx.compose.runtime:runtime-*:1.0.0-alpha02
がリリースされました。バージョン 1.0.0-alpha02 に含まれるコミットについては、こちらをご覧ください。
API の変更
- Snapshot データの変更の消費および生成用に
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
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 が調整されました。(I4ab76、b/160042650、b/156853976、b/159026663、b/154920561)
バグの修正
emitView
のサポートが終了しました。Compose 内で View を出力する場合、可能であれば、代わりにAndroidView
を使用してください。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()
のデフォルトの変更ポリシーが、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)Row
とColumn
をインライン関数にしました。これにより、使用する際のオーバーヘッドが大幅に削減されます。(I75c10)
バグの修正
- setViewContent のサポートが終了しました。代わりに setContent を使用してください。(I7e497、b/160335130)
MonotonicFrameAnimationClock を追加して、MonotonicFrameClock を AnimationClockObservable として使用できるようにしました。これにより、新しいコルーチン ベースのクロックと、従来のコールバック ベースのクロックを使用している API との隙間が埋まりました。
ManualAnimationClock に相当する MonotonicFrameClock は ManualFrameClock になりました。(I111c7、b/161247083)
Modifier.stateDraggable は、全面的に書き直され、名前が Modifier.swipeable に変わりました。新しく SwipeableState クラスが導入され、DrawerState と BottomDrawerState が SwipeableState クラスを継承するようにリファクタリングされました。[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 に、foundation の 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
データクラス、等式、ハッシュコードなど。- 一部のプロパティを監視対象とし、その他のプロパティは監視対象としない方法。
- 監視を行う際に使用する構造等価式と参照等価式の指定方法。
- システムへの「過度な期待」を減らす。システムの能力が過信されること(リストの差分取得の方法がすでにあると考えるなど)が少なくなるようにします。
- 監視の粒度をより直感的にする。
- リファクタリングにより、変数をクラスのプロパティにできる可能性を高める。
- 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 } ) }
(I409e8、b/152050010、b/146362815、b/146342522、b/143413369、b/135715219、b/143263925、b/139653744)
Compose のコンパイラにおけるコード生成の仕様を変更しました。変更前の Compose コンパイラでは、コンポーズ可能な関数の呼び出し部分を変換していました。変更後はコンポーズ可能な関数の本文を変換し、呼び出し部分での変換は一部を除いて行いません。
つまり、Compose ランタイムとのロジック上のやり取りは、呼び出し部分ではなく関数本文の開始部分で発生します。
この変更は Compose の使用方法に関わらずソース互換であり、Compose を使用していても通常はコードを更新する必要はありません。
この処理をサポートするため、すべてのコンポーズ可能な関数の JVM の署名が変更されました。コンポーズ可能な関数でパラメータを 1 つ受け取る場合、3 つのパラメータを受け取る関数に変換されます。追加されるパラメータは Composer と「key」整数です。ビットマスク整数として、呼び出しを通じてメタデータを伝達する際に使用されます。
なお、デフォルトの引数がコンポーズ可能な関数に変換されるようになっています。変換時に、関数の合成によるオーバーロードがデフォルトで行われることはないため、定義される関数の数は少なくなります。
今回の変更による確認済みの意図的な動作変更は次のとおりです。
- 一部の呼び出しが、変更前にはスキップされなかった箇所でスキップされる。
- デフォルトの引数を含む式で、コンポーズ可能な式が正しく登録および処理される。
最適化に関しては、次の内容が含まれます。 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 が更新され、コンパイル時パラメータが追加されました。(I60756、b/143464846)sortWith と removeRange を MutableVector に追加しました。(Icccf7)
CompositionLifecycleObserver のデフォルトのメソッド実装を追加しました。(I24289)
Applier には、コンポジションを破棄するための clear() メソッドが必要になりました。(Ibe697)
asMutableList() を MutableVector に追加しました。これにより、リスト全体をコピーしなくても公開 API に渡せるようになりました。(I298df)
コンポジション内の管理対象の CoroutineScope を取得するための rememberCoroutineScope() を追加して、イベントに応じてジョブを起動できるようにしました。(I0e264)
MutableVector は、標準の Collection インターフェースを実装しない新しいコレクションです。このコレクションは、他の要件を超える速度を提供し、内部実装でのみ使用されます。(I8ebd6)
Compose が必要とする Kotlin のバージョンの問題を避けるために、
StableMutableList
とStableMutableMap
を一時的に削除しました。これらのインターフェースは、Compose が問題のないバージョンの Kotlin に更新され次第、再導入される予定です。SnapshotStateList
とSnapshotStateMap
は現在公開されていますが、StableMutableList
とStableMutableMap
が再導入され次第、サポート終了となります。(Ia7769)アニメーションのタイミングをサポートする最上位レベルの withFrameNanos 関数を追加しました。(Ie34c5)
@Untracked アノテーションのサポートが終了しました。@ComposableContract(tracked=false) に置き換えます。(Id211e)
RestartableFunction および関連する API の名前が ComposableLambda などに変更されました。これらの API をターゲットとしていたのはコンパイラのみのため、通常はこの名前変更がソースレベルの互換性に影響することはありません。この名前変更の主な目的は、このクラスがスタック トレースに表示されたときにその長所を伝えるためです。(I7eb25)
@Composable アノテーションをクラスで使用できなくなりました。(Ia5f02)
Ambient<T>
が @Immutable ではなく @Stable になりました。(I0b4bb)この変更が行われる前、compose コンパイラ プラグインは、スコープ内の解決された「composer」に「emit 演算子」メソッドが見つかった場合、@Composable 関数内のコンストラクタの呼び出しに対して自明でないインターセプトを実行していました。(I5205a、b/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 になることがないように、初期値を事前入力できます(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#removeAt に変更されました。ComponentNode#emitMode の名前が ComponentNode#move に変更されました。(Idef00)ComposeFlags.COMPOSER_PARAM
フラグをtrue
に更新しました。これにより、compose プラグインのコード生成方法が変更されます。概略としては、ランタイムが実行を適切に管理できるようにするため、@Composable 関数が追加の合成パラメータで生成され、このパラメータがその後の @Composable 呼び出しに渡されます。これは互換性を破る重大なバイナリの変更ですが、compose のすべての許可される使用方法でソースレベルの互換性が保持されます。(I7971c)アンビエント API を大幅に変更しました。詳細については、ログと
Ambient<T>
のドキュメントをご覧ください(I4c7ee、b/143769776)ui-livedata(Live Data 用アダプタを含む新しいアーティファクト)を追加しました。使用例: val value by liveData.observeAsState()(Ie9e8c、b/150465596)
明示的な初期値のない Rx アダプタが非推奨になりました。null を使用することは、必ずしも最適なデフォルトではありません。たとえば、List を使用する場合は、emptyList() などの妥当なデフォルトから始めることをおすすめします。(I00025、b/161348384)
ui-rxjava2(RxJava2 用アダプタを含む新しいアーティファクト)を追加しました。使用例: val value by observable.subscribeAsState()(Ifab4b、b/153369097)
savedInstanceState()
で null 許容型を使用できるようになりました。(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 の各 composable もサポートが終了しました。代わりに androidx.ui.input.TextFieldValue を使用してください。(I4066d、b/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 プロパティが用意されました。(I91b9a、b/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() メソッドを追加しました。(Ibaced、b/152919067)
- ColoredRect のサポートが終了しました。代わりに
Box(Modifier.preferredSize(width, height).drawBackground(color))
を使用してください。(I499fa、b/152753731) - 修飾子と演算子を工場出荷時の拡張機能に置き換えました(I225e4)
- RowScope と ColumnScope のメンバーに、行と列の外部からアクセスできるようになりました。(I3a641)
- LayoutFlexible の名前を LayoutWeight に変更しました。このパラメータを補うために tight パラメータの名前を変更しました。(If4738)
- WithConstraint に LayoutDirection パラメータが追加されました(I6d6f7)
- background の名前が DrawBackground に変更され、デフォルトで記憶されるようになりました。(Ia0bd3)
- ButtonStyle を別の関数に置き換え、テキスト(文字列)オーバーロードを削除しました。使用方法については、更新済みのサンプルをご覧ください。(If63ab、b/146478620、b/146482131)
runOnIdleCompose
とrunOnUiThread
が ComposeTestRule のメソッドではなくグローバル関数になりました。(Icbe8f)
外部からの協力
- Looper や Handler などの不要な API が Compose Runtime 移植レイヤから削除されました。(I6847d)
- 初期値のない
Flow<T>.collectAsState()
が非推奨になりました。代わりにStateFlow<T>
を使用するか、明示的な初期値を渡してください。(I63f98、b/157674865)