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)
  1. Для чего нужен CompositionLocal?

    CompositionLocal используется для передачи значений по дереву композиций, позволяя компонентам получать доступ к данным без необходимости явно передавать их через параметры.

  1. Разница между compositionLocalOf и staticCompositionLocalOf?

    compositionLocalOf создаёт локальный контекст, который может изменяться в пределах композиции и поддерживает обновления. staticCompositionLocalOf создаёт статический локальный контекст, который сохраняет значение вне композиций и не обновляется при изменениях.

  1. Как LocalContext работает под капотом?

    LocalContext использует механизм Composition Local в Jetpack Compose для хранения и передачи контекста приложения. При вызове LocalContext.current возвращается контекст, связанный с текущей композицией. Это значение может изменяться при каждом обновлении композиции, обеспечивая доступ к правильному контексту для компонентов.