[TIL] ๐ผ24/05/16๐ผ#CompositionLocal
CompositionLocal
๐์ฐธ๊ณ ์๋ฃ
- ์ผ๋ฐ์ ์ผ๋ก UI Tree์ ์์ Composable์์ ํ์ Composable๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ๋ฐ์ดํฐ ๋ช
์์ ์ผ๋ก ์ ๋ฌ
-> ์์ Composable๊ณผ ํ์ Composable์ UI Tree์์์ ๊น์ด ์ฐจ์ด๊ฐ ํฐ ๊ฒฝ์ฐ, ๋ฒ๊ฑฐ๋ก์!
- CompositionLocal?
Composition ์๋๋ก ๋ฐ์ดํฐ๋ฅผ ์์์ ์ผ๋ก ์ ๋ฌํ๋ ๋๊ตฌ
- CompositionLocal instance is scoped to a part of the Composition
- UI tree์์์ ๊น์ด ๋ณ๋ก ๋ค๋ฅธ CompositionLocal ์ ๊ณต ๊ฐ๋ฅ
CompositionLocal.current
: ํด๋น Composition์ ๊ฐ์ฅ ๊ฐ๊น์ด ์กฐ์์ CompositionLocal ์ธ์คํด์ค ๊ฐ
- CompositionLocal ์์ฑ ๋ฐฉ๋ฒ
compositionLocalOf
- current ํ๋กํผํฐ๋ฅผ ํตํด ๊ฐ์ ์ ๊ทผํ๋ Composition๋ค์ Compose๊ฐ ํธ๋ํนํจ
-> ๊ฐ์ด ๋ณ๊ฒฝ๋์์ ๋, ํด๋น Composition๋ค๋ง recompose๋จ
staticCompositionLocalOf
- Compose๊ฐ ํธ๋ํนํ์ง X
-> ๊ฐ์ด ๋ณ๊ฒฝ๋์์ ๋, content ๋๋ค ๋ด๋ถ์ ๋ชจ๋ Compositione๋ค recompose๋จ
- ๊ฑฐ์/์ ๋ ๋ณ๊ฒฝ๋์ง ์์ ๊ฐ์ ์ ๊ณตํ ๋ ์ฌ์ฉ -> performance benefits
data class Elevations(val card: Dp = 0.dp, val default: Dp = 0.dp)
val LocalElevations = compositionLocalOf { Elevations() }
class MyActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
val elevations = if (isSystemInDarkTheme()) {
Elevations(card = 1.dp, default = 1.dp)
} else {
Elevations(card = 0.dp, default = 0.dp)
}
CompositionLocalProvider(LocalElevations provides elevations) {
}
}
}
}
@Composable
fun SomeComposable() {
Card(elevation = LocalElevations.current.card) {
}
}