Как устроен CompositionLocal под капотом

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

Ответ

CompositionLocal — это механизм в Jetpack Compose для передачи данных через дерево композиции без явной передачи параметров.

Как работает:

  1. Создание: CompositionLocal создаётся с помощью staticCompositionLocalOf (перекомпозиция при изменении) или compositionLocalOf (перекомпозиция только читающих композиций).
  2. Провайдер: CompositionLocalProvider устанавливает значение, которое становится доступным для всех дочерних композиций.
  3. Чтение: current возвращает текущее значение в контексте.

Пример:

val LocalTheme = compositionLocalOf { Theme.Light }  

@Composable  
fun App() {  
    CompositionLocalProvider(LocalTheme provides Theme.Dark) {  
        Child()  
    }  
}  

@Composable  
fun Child() {  
    val theme = LocalTheme.current // Theme.Dark  
}  

Под капотом:
Значения хранятся в CompositionLocalMap внутри Composer. При чтении current фреймворк ищет ближайшее значение вверх по дереву.