3. @Immutable と @Stable の使い分け - Ki-Kobayashi/Android-Wiki GitHub Wiki
https://medium.com/@KaushalVasava/stable-and-immutable-in-jetpack-compose-10e34295bc1c
🟩 @Immutable
- 利用するクラスが、絶対不変である場合に利用(すべてのpropがval)
- compose compiler が変更はないということを理解して recompose がスキップされる
🟩 @Stable
-
内部にState等を保持していて絶対不変とは言えない場合に利用(var)
-
値の更新をcomposeに通知しながら、recomposeを減らしてUIの更新を行う
※Interfaceも安定していないとみなされる
🟩 そもそも「安定している」とは?
- その型が不変である場合
- 再コンポーズの間にその値が変更されたかどうかを Compose が認識できる場合
🟡以下の型は、@Stableがなくても安定しているとみなされる(val)
- すべてのプリミティブ値型: Boolean、Int、Long、Float、Char など
- 文字列
- すべての関数型(ラムダ)
- 安定しているが可変である型の代表例は、Compose の MutableState 型 ※MutableStateも監視対象 https://developer.android.com/reference/kotlin/androidx/compose/runtime/MutableState
コンポーザブルにパラメータとして渡される ”すべて”の型 が安定している場合、UI ツリー内のコンポーザブルの位置に基づいてパラメータ値が等しいかどうかが比較されます。前回の呼び出し以降、すべての値が変化していなければ、再コンポジションはスキップされます。
https://developer.android.com/jetpack/compose/lifecycle?hl=ja#skipping