Реагировать на фокусировку

Каждый раз, когда в дереве композиции происходит смена фокуса, Compose генерирует событие фокусировки, которое могут отслеживать родительские и дочерние модификаторы. Вы можете использовать модификатор onFocusChanged для отслеживания переходов состояния фокуса, запроса свойств текущего фокуса и запуска обновлений пользовательского интерфейса, управляемых состоянием.

Отслеживайте состояние фокуса с помощью события onFocusChange.

Модификатор onFocusChanged предоставляет объект FocusState всякий раз, когда элемент получает или теряет фокус.

Например, вы можете отслеживать изменения фокуса для обновления состояния пользовательского компонента (например, изменения цвета границы элемента или запуска анимации):

var color by remember { mutableStateOf(Color.White) }
Card(
    modifier = Modifier
        .onFocusChanged {
            color = if (it.isFocused) Red else White
        }
        .border(5.dp, color)
) {}

В этом примере remember сохраняет цвет границы при каждом изменении композиции, и цвет границы обновляется всякий раз, когда изменяется состояние фокуса элемента.

Свойства FocusState

Объект FocusState , передаваемый в onFocusChanged содержит три ключевых свойства:

  • isFocused : Возвращает true если конкретный компонент, к которому прикреплен этот модификатор, в данный момент имеет активный фокус ввода.
  • hasFocus : Возвращает true если данный компонент или любой из его дочерних компонентов в данный момент находится в фокусе. Это полезно для родительских контейнеров (например, карточек или панелей инструментов), которым необходимо знать, когда любой дочерний элемент внутри них активен.
  • isCaptured : Возвращает true если фокус в данный момент заблокирован на элементе (например, во время модальных взаимодействий с использованием captureFocus() ). Пока фокус захвачен, попытки переместить его на другие элементы не приводят к его сбросу.
Modifier.onFocusChanged { focusState ->
    val isFocused = focusState.isFocused
    val hasFocus = focusState.hasFocus
    val isCaptured = focusState.isCaptured
}
{% verbatim %} {% endverbatim %} {% verbatim %} {% endverbatim %}