컴포즈를 사용하다보면 종종 CompositionLocal 을 마주치곤 한다.
테마를 커스텀하고 싶을때 사용하곤 했는데
CompositionLocal 은 어떻게 동작하길래 테마 커스텀에서 사용됐는지 개념을 알아보자.
CompositionLocal 이 필요한 이유
컴포저블 함수들은 트리형태로 구성된다.
그래서 상태의 관리를 편하게 하기 위해서 보통 상태 호이스팅이라는 개념으로
상위 노드에서 관리하고 하위 노드로 전파한다.
그런데 극단적으로 트리의 깊이가 100개면 어떨까. 이 상태를 아래까지 다 전파하는건
쉽지 않을거다.
이때 CompositionLocal을 유용하게 써먹을 수 있는데
너무 대충 그렸지만 아래 같은 느낌으로
컴포지션로컬의 영역에 있는 컴포저블끼리는 하위에서 상위 노드의 상태에 접근하도록 제공하는 역할을 한다.
그림은 저렇게 한정 범위만 영역으로 잡히도록 그려졌지만
가장 상위에서 CompositionLocal 의 범위를 지정한다면 모든 영역에 제공하게 될 것이다.
CompositionLocal 을 사용하는 방법
CompositionLocal을 만드는 2가지 방법은 다음과 같다.
// StaticProvidableCompositionLocal로 만들기
val LocalLinkZipColor = staticCompositionLocalOf {
Color.Blue
}
// DynamicProvidableCompositionLocal로 만들기
val dynamicCompositionLocal = compositionLocalOf {
lightColors() //상태
}
두가지 방법이 있는데 , 차이에 대해선 따로 설명하겠다.
위 처럼 만들어주고 아래처럼 CompositionLocalProvider 를 이용해서 상위 컴포저블에서 하위 컴포저블로 제공되도록 만들어준다.
@Composable
fun Composable1() {
...
//여기서 Red로 지정해줬다.
CompositionLocalProvider(LocalLinkZipColor.provides(Color.Red)) {
Composable4()
}
}
@Composable
fun Composable4() {
Text(
//이 컴포저블의 상위 컴포저블인 Composable1 에서 Red로 제공했기 때문에 여기서 current 는 Red가 된다
//또 다시 변경하면 이후에 생기는 하위의 컴포저블들은 변경된 값으로 적용되게 된다.
modifier = Modifier.background(color = LocalLinkZipColor.current),
text = "Composable4"
)
...
}
staticCompositionLocalOf, compositionLocalOf 차이
staticCompositionLocalOf() 는 자주 변경되지 않는 상태를 저장할때 사용하면 좋다.
상태가 변경될때 할당된 노드의 하위 노드를 모두 다시 그리게 된다.
불필요한 리소스를 사용하게 된다.
반대로 compositionLocalOf 는 자주 변경되는 상태를 저장할때 사용하면 좋다.
현재 상태에 접근하는 노드에 대해서만 재구성을 수행하기 때문이다.
상황에 맞게 적절히 사용하면 된다.
'Android > Android Compose' 카테고리의 다른 글
안드로이드 compose 비트맵으로 캡쳐하기 (3) | 2024.09.02 |
---|---|
Android Compose 의 @Immutable 와 @Stable (0) | 2024.08.20 |
컴포즈의 Side-Effect 형제들에 대해서 알아보자 - 2 (0) | 2024.04.28 |
컴포즈의 Side-Effect 형제들에 대해서 알아보자 - 1 (0) | 2024.04.21 |
스와이프 삭제 구현 (0) | 2024.03.10 |
[안드로이드 컴포즈] 스와이프 삭제 구현 (1) | 2024.01.14 |
안드로이드 컴포즈 dialog 커스텀 하기 (0) | 2023.12.20 |
Jetpack Compose 에서 Lifecycle 관리하기 (0) | 2023.05.11 |