Jetpack Compose๋ฅผ ์ฐ๋ค ๋ณด๋ฉด
โจ Composable ํธ๋ฆฌ ๊น์์ด ์๋ ๊ณณ๊น์ง ๊ณตํต ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ณ ์ถ์ ๋๊ฐ ์์ด์.
์๋ฅผ ๋ค์ด, ์ฑ ์ ์ฒด์์ ์ฌ์ฉํ
๊ฐ์ ๊ฒ๋ค์ด์ฃ .
์ด๋ด ๋ ๋ฐ๋ก ๋ฑ์ฅํ๋ ๊ฒ ๋ฐ๋ก CompositionLocal์
๋๋ค.
์ค๋์ compositionLocalOf์ CompositionLocalProvider๋ฅผ ์ค์ฌ์ผ๋ก
๊ทธ ๊ฐ๋
๊ณผ ์ฌ์ฉ๋ฒ์ ์ ๋ฆฌํด ๋ณด๊ฒ ์ต๋๋ค. ๐
CompositionLocal์ Compose์์ ์ ๊ณตํ๋ ์์กด์ฑ ์ ๋ฌ ๋ฉ์ปค๋์ฆ์ด์์.
์ฝ๊ฒ ๋งํด, Context๋ ์ ์ญ ์ํ๋ฅผ Composable ํธ๋ฆฌ ์ ์ฒด์ ๊ณต์ ํ ์ ์๋ ๋ฐฉ๋ฒ์
๋๋ค.
Context๋ฅผ ์ด๋์๋ ๊บผ๋ด ์ฐ๋ ๊ฒ์ฒ๋ผ CompositionLocal์ ํตํด ํธ๋ฆฌ ์์์์ ์ ์ธ โ ํ์์์ ์ ๊ทผํ ์ ์์ต๋๋ค. ๐ ์ค์ํ ์ ์, Composable ๊ฐ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ฉด์๋ ๋ฐ์ดํฐ ์ ๋ฌ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฑฐ์์.
compositionLocalOfcompositionLocalOf๋ CompositionLocal์ ๋ง๋๋ ํจ์์
๋๋ค.
์ฆ, ์ ์ญ์ผ๋ก ์ ์ธํ ์ ์๋ ํค๋ฅผ ๋ง๋ ๋ค๊ณ ์๊ฐํ๋ฉด ๋ผ์.
// User ์ด๋ฆ์ ์ ๋ฌํ๊ธฐ ์ํ CompositionLocal ์ ์
val LocalUserName = compositionLocalOf<String> { error("No User Found") }
์ฌ๊ธฐ์ error("No User Found")๋
๋ง์ฝ Provider์์ ๊ฐ์ ์ฃผ์ง ์์๋๋ฐ ์ ๊ทผํ๋ฉด ๋ฐ์ํ ๊ธฐ๋ณธ ๋์์ ์ ์ํ ๊ฑฐ์์.
staticCompositionLocalOfcompositionLocalOf์ ๋น์ทํ๊ฒ, ์ปดํ์ผ ํ์์์ ๊ธฐ๋ณธ๊ฐ์ ๋ณด์ฅํ๊ณ ์ถ๋ค๋ฉด
staticCompositionLocalOf๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
data class BackgroundTheme(val color: Color)
val LocalBackgroundTheme = staticCompositionLocalOf {
BackgroundTheme(color = Color.White)
}
staticCompositionLocalOf๋ ๊ธฐ๋ณธ๊ฐ์ด ํญ์ ์ ํจํด์ผ ํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํฉ๋๋ค. BackgroundTheme์ฒ๋ผ ๊ธฐ๋ณธ ์์์ ๋ฐ๋์ ์ง์ ํด ๋์ด์ผ ํ ๋ ์ ์ฉํฉ๋๋ค. ๐ ์ผ๋ฐ์ ์ผ๋ก๋ staticCompositionLocalOf ์ฌ์ฉ์ ๊ถ์ฅํ๊ณ ,
ํน๋ณํ ๋ฐํ์์๋ง ๊ธฐ๋ณธ๊ฐ์ ๋ค๋ค์ผ ํ๋ ๊ฒฝ์ฐ์ ํํด compositionLocalOf๋ฅผ ์ ํํฉ๋๋ค.
CompositionLocalProvider๊ทธ๋ ๋ค๋ฉด ๊ฐ์ ์ด๋ป๊ฒ ๋ฃ์๊น์?
๋ฐ๋ก CompositionLocalProvider๋ฅผ ์ฌ์ฉํฉ๋๋ค.
@Composable
fun UserScreen() {
CompositionLocalProvider(LocalUserName provides "Jerry") {
Greeting()
}
}
@Composable
fun Greeting() {
// LocalUserName ๊ฐ์ ์ ๊ทผ
val user = LocalUserName.current
Text(text = "Hello, $user!")
}
CompositionLocalProvider๋ LocalUserName์ "Jerry"๋ผ๋ ๊ฐ์ ๊ณต๊ธํฉ๋๋ค. Greeting()์์๋ LocalUserName.current๋ฅผ ํธ์ถํด ๊ทธ ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค. ์ฆ, Provider โ Consumer ๊ตฌ์กฐ๋ก ๋ฐ์ดํฐ๊ฐ ํ๋ฅด๋ ๊ฑฐ์์.
val LocalDarkMode = compositionLocalOf { false }
@Composable
fun App() {
var dark by remember { mutableStateOf(false) }
Column {
Button(onClick = { dark = !dark }) {
Text("Toggle Dark Mode")
}
CompositionLocalProvider(LocalDarkMode provides dark) {
ThemedText()
}
}
}
@Composable
fun ThemedText() {
val darkMode = LocalDarkMode.current
Text(
text = if (darkMode) "๐ Dark Mode" else "โ๏ธ Light Mode",
color = if (darkMode) Color.White else Color.Black
)
}
dark ๊ฐ์ ๋ฐ๋ผ Provider๊ฐ ๋ฐ๋๊ณ , ThemedText()๋ ์๋์ผ๋ก ๋คํฌ/๋ผ์ดํธ ๋ชจ๋์ ๋ง๋ UI๋ฅผ ๊ทธ๋ฆฝ๋๋ค. ์ค๋์ Compose์
compositionLocalOf ๐ CompositionLocal ์์ฑ staticCompositionLocalOf ๐ ์ฑ๋ฅ/์์ ์ฑ ํฅ์๋ CompositionLocal ์์ฑ CompositionLocalProvider ๐ CompositionLocal ๊ฐ ์ฃผ์
์ ์ดํด๋ดค์ต๋๋ค.
์ด ์กฐํฉ๋ง ์ ์จ๋
๊ฐ์ ๊ธฐ๋ฅ์ ๊น๋ํ๊ฒ ๊ตฌํํ ์ ์์ด์.
๐ ๊ฒฐ๋ก :
ํ์ํ Context๋ฅผ ์ ์ญ์ฒ๋ผ ์ฐ๋, Compose ์ฒ ํ์ ๋ง๊ฒ ์์ ํ๊ณ ์ ์ฐํ๊ฒ ๊ด๋ฆฌํ์!