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) 되었기 때문에 구글링할 때 참고한다.