CompositionLocal
https://developer.android.com/jetpack/compose/compositionlocal |
compositionLocalOf
Механизм, позволяющий передавать значения по иерархии композиций без явной передачи через параметры. Это работает как некий «локальный контекст», доступный в любой части дерева композиции, что упрощает доступ к общим данным, например, темам, конфигурациям, состояниям.
val LocalCounter = compositionLocalOf { 0 }
@Composable
fun ParentComponent() {
CompositionLocalProvider(LocalCounter provides 5) {
ChildComponent()
}
}
@Composable
fun ChildComponent() {
val counter = LocalCounter.current
Text("Counter: $counter")
}
CompositionLocalProvider
Используется для установки значений локальных переменных (CompositionLocals) на определённой части дерева композиций. Это позволяет изменить контекст для дочерних компонентов и сделать значение доступным в пределах этой части дерева. С помощью CompositionLocalProvider
можно предоставлять разные значения для различных ветвей дерева композиций, при этом не передавая их явно через параметры.
staticCompositionLocalOf
Используется для создания локальных значений (CompositionLocals), которые могут быть доступны в дереве композиций. Это позволяет создать локальную переменную с предопределённым значением, которое будет доступно для дочерних компонентов. Основное отличие от compositionLocalOf
заключается в том, что staticCompositionLocalOf
определяет локальное значение, которое будет статичным и неизменяемым. Это полезно, когда вы хотите иметь константное значение, доступное для всех компонентов, но не планируете изменять его в процессе работы.
val LocalTheme = staticCompositionLocalOf { Theme.default() }
@Composable
fun ThemedComponent() {
val theme = LocalTheme.current
// Используем тему в композируемом элементе
Text("Themed text", style = theme.textStyle)
}
LocalContext
Предоставляет доступ к текущему Context
приложения. Это полезно, когда вам нужно использовать ресурсы, доступные через Context
, такие как строки, цвета или методы для запуска Activity
.
val context = LocalContext.current
LocalDensity
Предоставляет информацию о текущей плотности экрана (density
) в dp. Это позволяет выполнять преобразования между px
и dp
.
val density = LocalDensity.current
Get Widget Height
val density: Density = LocalDensity.current
var columnHeightPx: Float by remember { mutableStateOf(0F) }
var columnHeightDp: Dp by remember { mutableStateOf(0.dp) }
Box(
modifier = Modifier
.onGloballyPositioned { layoutCoordinates ->
columnHeightPx = layoutCoordinates.size.height.toFloat()
columnHeightDp = with(density) { layoutCoordinates.size.height.toDp() }
}
)
LocalConfiguration
Предоставляет информацию о текущей конфигурации устройства, такой как ориентация экрана, плотность пикселей и размер экрана.
val configuration = LocalConfiguration.current
LocalWindowInfo
Предоставляет информацию о текущем окне приложения, включая его размеры и параметры. Это полезно для адаптации интерфейса в зависимости от размеров окна.
val windowInfo = LocalWindowInfo.current
LocalLayoutDirection
Используется для получения информации о направлении компоновки (например, слева направо или справа налево). Это важно для поддержки многоязычности и адаптивного дизайна.
val layoutDirection = LocalLayoutDirection.current
LocalAccessibilityManager
Используется для доступа к службам доступности устройства. Позволяет проверять состояние доступности и другие параметры, связанные с доступностью.
val accessibilityManager = LocalAccessibilityManager.current
LocalClipboardManager
Предоставляет доступ к менеджеру буфера обмена. Это позволяет копировать и вставлять данные из буфера обмена.
val clipboardManager = LocalClipboardManager.current
LocalFocusManager
Управляет фокусом в ваших компонентах. Он позволяет перемещать фокус между элементами пользовательского интерфейса и очищать его при необходимости.
val focusManager = LocalFocusManager.current
LocalHapticFeedback
Предоставляет доступ к тактильной обратной связи. Используется для вызова различных тактильных эффектов, например, при долгом нажатии на элемент.
val hapticFeedback = LocalHapticFeedback.current
LocalSoftwareKeyboardController
Управляет видимостью клавиатуры, позволяя вам скрывать или показывать клавиатуру в зависимости от действий пользователя.
val softwareKeyboardController = LocalSoftwareKeyboardController.current
LocalUriHandler
Предоставляет методы для открытия URI, что позволяет взаимодействовать с веб-ссылками и другими ресурсами.
val uriHandler = LocalUriHandler.current
uriHandler.openUri("https://www.example.com")
LocalTextStyle
Используется для получения текущего стиля текста, применяемого в контексте.
val textStyle = LocalTextStyle.current
LocalIndication
управляет визуальными эффектами нажатий и взаимодействий (индикациями) для компонентов пользовательского интерфейса.
val indication = LocalIndication.current
LocalRippleConfiguration
Позволяет настроить внешний вид и поведение Ripple-эффекта для всех компонентов внутри области композиции.
val rippleConfiguration = LocalRippleConfiguration.current
Вопросы на собесе (3)
- Для чего нужен CompositionLocal?
CompositionLocal используется для передачи значений по дереву композиций, позволяя компонентам получать доступ к данным без необходимости явно передавать их через параметры.
- Разница между compositionLocalOf и staticCompositionLocalOf?
compositionLocalOf
создаёт локальный контекст, который может изменяться в пределах композиции и поддерживает обновления.staticCompositionLocalOf
создаёт статический локальный контекст, который сохраняет значение вне композиций и не обновляется при изменениях.
- Как LocalContext работает под капотом?
LocalContext
использует механизм Composition Local в Jetpack Compose для хранения и передачи контекста приложения. При вызовеLocalContext.current
возвращается контекст, связанный с текущей композицией. Это значение может изменяться при каждом обновлении композиции, обеспечивая доступ к правильному контексту для компонентов.