CompositionLocal

Kim suho·2022년 3월 12일

staticCompositionLocal은 compose가 추적하지 않아서 변하지 않는 값이라면 ComsitionLocal에 비해 성능에 이점이 있다.
다만 바뀐다면 하위 tree 전체가 recomposition 되므로 이럴 경우 적합하지 않다.
CompositionLocal은 current로 가져오는 composable 함수만 recomposition 이 된다.
사용법은 아래와 같다.

아래의 error구문이 있는 lambda는 Provider로 값이 공급되지 않았을때 호출된다. 아래는 항상 최상위에서 Provider로 공급하므로 들어올 수 없는 구문이라 error를 출력하였고, 보통은 emptyDeviceInformation() 등으로 기본값을 리턴하게 유도한다.

val LocalDeviceInfo = staticCompositionLocalOf<DeviceInformation> {
    error("CompositionLocal LocalDeviceInfo not present")
}

CompositionLocalProvider 은 content로 입력받는 composable함수내에 CompositionLocal 의 값이 적용되도록 한다.

    CompositionLocalProvider(
        LocalDeviceInfo provides deviceInfo,
        content = content
    )

content하위의 composable에서는 LocalDeviceInfo.current로 deviceInfo의 값을 가져올 수 있다.

jetpack compose에서 제공하는 LocalContext등도 이런 방법으로 작성되어 있다.
CompositionLocal은 암시적인 데이터 전달이기 때문에 LocalXXX등으로 전달하는 것을 권고하고 있다.

또한 1.0.0-alpha12 이전까지는 CompositionLocal이 ambient로 불리었고 함수 이름들도 같이 변경(ex. staticAmbientOf -> staticCompositionLocalOf) 되었기 때문에 구글링할 때 참고한다.

profile
평범한 개발자

0개의 댓글