DEV Community

Sato Shun
Sato Shun

Posted on • Updated on

Jetpack ComposeでListなどのクラスをStableにする

概要

Jetpack ComposeではListなどのクラスはunstable型としてマークされており、stableとして扱うためには、都度Wrapperクラスを定義する必要がありました。

@Stable
data class UserState(
  val users: List<User>,
  ...
)
Enter fullscreen mode Exit fullscreen mode

Compose Compiler1.5.5から stability configurationという機能が入り、Listなどの外部クラスをStableとして扱うことが出来るようなりました😀

使い方

次の2つを設定することで使うことが出来ます。

まず、freeCompilerArgsにstabilityConfigurationPathを設定します。

kotlinOptions {
 freeCompilerArgs += listOf(
   "-P",         

 "plugin:androidx.compose.compiler.plugins.kotlin:stabilityConfigurationPath=" +
    "${configurationPath}"
  )
}
Enter fullscreen mode Exit fullscreen mode

次に、上部で設定したconfigurationPathにファイルを作り、クラスを記述するだけです。

java.time.LocalDateTime
kotlin.collections.List
Enter fullscreen mode Exit fullscreen mode

これで、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")
}
Enter fullscreen mode Exit fullscreen mode
// 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>
)
Enter fullscreen mode Exit fullscreen mode

beforeではListがunstable、afterではstableになっていることが分かります。

これで都度Wrapperクラスを作っていた部分を省略することが出来ます😀

まとめ

いちいちwrapするのがめんどくさかったところをstability Configurationを使うことで、解決することが出来ました。readonly Listや、サードパーティが提供しているimmutableなクラスを定義に追加しておけば、自然とskip可能なComposable関数が作れるので、とりあえず色々と追加しておくのが良いと思います。
とはいえ、mutableなクラスを追加してしまうと、予期せぬ動作をする可能性があるので、しっかりとStableにしても良いかを確認することが大切です。

参考

Top comments (0)