Files
AndroidJetpack/Jetpack-Compose-Playground/docs/general/compositionlocal.md
T
2026-07-15 16:57:36 +08:00

86 lines
2.7 KiB
Markdown

<!---
This is the API of version 1.2.0
-->
# CompositionLocal
CompositionLocal is useful when you want to create a dependency in a higher node of the layout tree and use it on lower node without having to
pass it down the tree through every child Composable.
## How to create an CompositionLocal?
```kotlin
data class User(val name: String, val age: Int)
val LocalActiveUser = compositionLocalOf<User> { error("No user found!") }
```
Let's say you want to create an CompositionLocal with an User. You can use **compositionLocalOf**. Inside the function you can return an initial user object
or you can throw an exception when the user is missing.
## How to provide a value for an CompositionLocal?
```kotlin
@Composable
private fun MyUserScreen() {
val user = User("Jens", 31)
CompositionLocalProvider(LocalActiveUser provides user) {
UserInfo()
}
}
```
Somewhere above in your hierarchy you have to use CompositionLocalProvider to provide a value for your CompositionLocal.
The syntax is: "**CompositionLocal`<T>`** provides **T**".
All child @Composable of CompositionLocalProvider will implicitly be able to get the value of the CompositionLocals.
## How to use a value of an CompositionLocal?
```kotlin
@Preview
@Composable
fun UserInfo() {
Column {
Text("Name: " + LocalActiveUser.current.name)
Text("Age: " + LocalActiveUser.current.age)
}
}
```
Now you can use your CompositionLocal in your @Composable. Every CompositionLocal has a **current** property that contains the current value.
## Predefined CompositionLocals
The Compose libraries already contain some useful CompositionLocals. You can directly use them without needing add a Providers.
### LocalContext
Provides a [Context] that can be used by Android applications.
### LocalConfiguration
The [Configuration] is useful for determining how to organize the UI.
#### Device orientation
One of the things you can get from the LocalConfiguration is the orientation of your device. This can be used to give the user a different ui when the device is rotated.
```kotlin
val configuration = LocalConfiguration.current
when (configuration.orientation) {
Configuration.ORIENTATION_LANDSCAPE -> {
Text("Landscape")
}
else -> {
Text("Portrait")
}
}
```
### LocalLifecycleOwner
The CompositionLocal containing the current [LifecycleOwner].
### LocalView
The CompositionLocal containing the current Compose [View].
### LocalViewModelStoreOwner
The CompositionLocal containing the current [ViewModelStoreOwner].
## See also:
* [Official Docs](https://developer.android.com/reference/kotlin/androidx/compose/runtime/CompositionLocal)
* [Full Example Code]({{ site.samplefolder }}/general/CompositionLocalExample.kt)