Какие задачи можно решать с помощью CompositionLocal в Jetpack Compose

«Какие задачи можно решать с помощью CompositionLocal в Jetpack Compose» — вопрос из категории Jetpack Compose, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

CompositionLocal позволяет передавать данные через дерево композиции без явной передачи через параметры. Полезен для:

  1. Глобальные зависимости (темы, локализация, конфигурации):
CompositionLocalProvider(LocalContentAlpha provides 0.5f) {  
    Text("Полупрозрачный текст")  
}  
  1. Контекстные значения (размеры экрана, навигация):
val density = LocalDensity.current  
val pxValue = with(density) { 16.dp.toPx() }  
  1. Кастомные провайдеры (логирование, DI):
val LocalLogger = staticCompositionLocalOf<Logger> { error("Logger not provided") }  

// Где-то в корне:  
CompositionLocalProvider(LocalLogger provides LoggerImpl()) {  
    MyApp()  
}  

⚠️ Осторожно! Злоупотребление может усложнить отладку. Используйте для действительно глобальных/контекстных данных.