Jetpack ComposeのCompositionLocalProviderとは

こんばんは。

Jetpack Composeの公式サンプルアプリの一つであるJetsurveyソースコードを読んでいてCompositionLoacalProviderというものが分からなかったため調べてみました。

どうやらCompositionLocalProviderのラムダ内では引数として渡さなくても事前定義した変数を使いまわせるみたいです。

例を見てましょう。

まず以下のようなデータクラスがあるとします。

data class CompositionData(
    val name: String = ""
)

次に `compositionLocalOf()' で変数のデフォルトを定義します。ラムダ内の処理がデフォルト値となるようです。

val LocalUser = compositionLocalOf {
    CompositionData()
}

最後に`CompositionLocalProvider()'を記述します。

CompositionLocalProvider(LocalUser provides CompositionData("gouta", 100)) {
    MyContent() //変数を使用したいCompose関数
}

'MyContent()'には引数として明示的にデータを渡していませんが以下のように使用することができます。

@Composable
fun MyContent() {
    val user = LocalUser.current
    Text(
        text = user.name,
        modifier = Modifier.fillMaxWidth(),
    )
}

まとめ

以上、CompositionLocalProviderの簡単な説明でした。変数がGlobalチックになるので使いまわしは危険そうです。しかし公式の実装にもあるようにContextの取得など他にも便利なものがあるので使ってみたいと思います。

  • LocalContext
  • 'LocalConfiguration'
  • 'LocalLifecycleOwner'

などなど

参考

Jetpack Compose Playground

Kenji Abeさんの記事