Ответ
CompositionLocal — это механизм в Jetpack Compose для передачи данных через дерево композиции без явной передачи параметров.
Как работает:
- Создание:
CompositionLocalсоздаётся с помощьюstaticCompositionLocalOf(перекомпозиция при изменении) илиcompositionLocalOf(перекомпозиция только читающих композиций). - Провайдер:
CompositionLocalProviderустанавливает значение, которое становится доступным для всех дочерних композиций. - Чтение:
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 фреймворк ищет ближайшее значение вверх по дереву.