概要
Jetpack ComposeではListなどのクラスはunstable型としてマークされており、stableとして扱うためには、都度Wrapperクラスを定義する必要がありました。
@Stable
data class UserState(
val users: List<User>,
...
)
Compose Compiler1.5.5から stability configurationという機能が入り、Listなどの外部クラスをStableとして扱うことが出来るようなりました😀
使い方
次の2つを設定することで使うことが出来ます。
まず、freeCompilerArgsにstabilityConfigurationPathを設定します。
kotlinOptions {
freeCompilerArgs += listOf(
"-P",
"plugin:androidx.compose.compiler.plugins.kotlin:stabilityConfigurationPath=" +
"${configurationPath}"
)
}
次に、上部で設定したconfigurationPathにファイルを作り、クラスを記述するだけです。
java.time.LocalDateTime
kotlin.collections.List
これで、ListとLocalDateTimeをそれぞれStableにマークすることが出来ます。
詳しい定義の仕方は https://github.com/skydoves/landscapist/pull/417 このPRが参考になります。
確認方法
Composeのmetric reportsで確認することが出来ます。
metrics reportsはComposable関数の状態を確認することが出来る機能です。
詳細な使い方はChrisさんのブログによくまとまっておりおすすめです。 https://chrisbanes.me/posts/composable-metrics/
これを使い、before/afterを比較すると次のようになりました。
@Composable
fun Test(names: List<String>) {
Text(text = "$names")
}
// before
restartable scheme("[androidx.compose.ui.UiComposable]") fun
Test(
unstable names: List<String>
)
// after
restartable skippable scheme("[androidx.compose.ui.UiComposable]") fun Test(
stable names: List<String>
)
beforeではListがunstable、afterではstableになっていることが分かります。
これで都度Wrapperクラスを作っていた部分を省略することが出来ます😀
まとめ
いちいちwrapするのがめんどくさかったところをstability Configurationを使うことで、解決することが出来ました。readonly Listや、サードパーティが提供しているimmutableなクラスを定義に追加しておけば、自然とskip可能なComposable関数が作れるので、とりあえず色々と追加しておくのが良いと思います。
とはいえ、mutableなクラスを追加してしまうと、予期せぬ動作をする可能性があるので、しっかりとStableにしても良いかを確認することが大切です。
Top comments (0)