навигационное событие

Библиотека событий навигации предоставляет API KMP-first для обработки системных возвратов, а также предиктивных возвратов .
Последнее обновление Стабильный релиз Кандидат на релиз Бета-версия Альфа-релиз
30 июля 2025 г. - - - 1.0.0-альфа05

Объявление зависимостей

Чтобы добавить зависимость от navigationevent, необходимо добавить репозиторий Google Maven в свой проект. Подробнее см. в репозитории Google Maven .

Добавьте зависимости для необходимых артефактов в файл build.gradle вашего приложения или модуля:

Круто

dependencies {
    implementation "androidx.navigationevent:navigationevent:1.0.0-alpha05"
}

Котлин

dependencies {
    implementation("androidx.navigationevent:navigationevent:1.0.0-alpha05")
}

Дополнительные сведения о зависимостях см. в разделе Добавление зависимостей сборки .

Обратная связь

Ваши отзывы помогают улучшить Jetpack. Сообщите нам, если вы обнаружите новые проблемы или у вас есть идеи по улучшению этой библиотеки. Пожалуйста, ознакомьтесь с уже существующими проблемами в этой библиотеке, прежде чем создавать новую. Вы можете проголосовать за существующую проблему, нажав на кнопку со звёздочкой.

Создать новый выпуск

Более подробную информацию см. в документации по системе отслеживания проблем .

Заметок о выпуске для этого артефакта нет.

Версия 1.0

Версия 1.0.0-альфа05

30 июля 2025 г.

Выпущен androidx.navigationevent:navigationevent-*:1.0.0-alpha05 . Версия 1.0.0-alpha05 содержит следующие коммиты .

Поддержка иерархии «родитель-ребенок»:

NavigationEventDispatcher теперь может иметь родительские и дочерние диспетчеры, образуя иерархическую древовидную структуру. Это позволяет более гибко распространять события навигации и управлять ими в сложных компонентах пользовательского интерфейса Compose, отражая структурную иерархию пользовательского интерфейса посредством цепочек диспетчеров. ( I194ac )

  // Create a parent dispatcher that will manage navigation events at a higher level.
  val parentDispatcher = NavigationEventDispatcher()

  // Create a child dispatcher linked to the parent, forming a hierarchy.
  val childDispatcher = NavigationEventDispatcher(parentDispatcher)

Иерархическое свойство isEnabled позволяет управлять диспетчером сверху вниз. Если для диспетчера isEnabled значение false , он автоматически отключает все дочерние диспетчеры. Эта функция позволяет эффективно отключать целые ветви системы навигационных событий. ( I9e985 )

  // Disabling the child dispatcher disables all its callbacks and any of its children recursively.
  childDispatcher.isEnabled = false

Более того, свойство isEnabled объекта NavigationEventCallback теперь учитывает состояние включённого связанного с ним диспетчера. Это означает, что обратный вызов считается включённым только в том случае, если включены как сам обратный вызов, так и его диспетчер (включая его предков), что обеспечивает согласованный иерархический контроль над активацией обратного вызова. ( I1799a )

  // Create a test callback and add it to the child dispatcher.
  val callback1 = TestNavigationEventCallback(isEnabled = true)
  childDispatcher.addCallback(callback1)

  // Since the childDispatcher is disabled, the callback is effectively disabled as well.
  assertThat(callback1.isEnabled).isFalse()

Введён новый метод dispose() для корректной очистки диспетчеров и их дочерних объектов. Вызов dispose() останавливает прослушиватели для предотвращения утечек памяти, рекурсивно удаляет все дочерние диспетчеры, удаляет все обратные вызовы, зарегистрированные для диспетчера, и отсоединяет его от родительского объекта. Это гарантирует корректное освобождение ресурсов, когда диспетчеры больше не нужны. ( I9e985 )

  // Dispose the child dispatcher to clean up resources.
  childDispatcher.dispose()

При вызове любого открытого метода в ликвидированном диспетчере немедленно генерируется исключение IllegalStateException . Это предотвращает скрытые сбои и помогает разработчикам выявлять некорректное использование в процессе разработки. ( Ic2dc3 )

  val callback2 = TestNavigationEventCallback()

  // Attempting to use a disposed dispatcher will throw an exception.
  assertThrows<IllegalStateException> {
      childDispatcher.addCallback(callback2)
  }

Примечание: Мы представим новый компонуемый NavigationEventDispatcherOwner , который автоматически управляет дочерним диспетчером в интерфейсе Compose в aosp/3692572 . Однако это изменение не вошло в текущую версию и запланировано на следующую.

Библиотека навигационного тестирования

  • Добавить модуль navigationevent-testing для предоставления специальных утилит тестирования для библиотеки navigationevent . ( 0e50b6 )
  • Добавлен фиктивный служебный класс TestNavigationEventCallback для тестирования. Он записывает вызовы методов обратного вызова и сохраняет полученные элементы NavigationEvent для поддержки проверки. ( 4a0246 )
  • Добавьте фиктивную служебную функцию TestNavigationEvent для создания экземпляров NavigationEvent со значениями по умолчанию, упрощая модульные тесты для обработки событий навигации. ( 3b63f5 )
  • Добавлен фиктивный служебный класс TestNavigationEventDispatcherOwner для тестирования. Он отслеживает количество событий отката и изменения состояния включения для поддержки проверки взаимодействия в тестах. ( c8753e )

Изменения API

  • Переместить NavigationEventInputHandler из androidMain в commonMain , чтобы сделать его доступным в общем коде KMP. Добавить новые public send* для отправки событий. Измените функции отправки в NavigationEventDispatcher с public на internal ; теперь пользователи должны использовать NavigationEventInputHandler для отправки событий. ( Ia7114 )
  • Переименуйте NavigationInputHandler в OnBackInvokedInputHandler . ( I63405 )

Исправления ошибок

  • Реорганизуйте NavigationEventDispatcher , чтобы сократить накладные расходы за счет исключения промежуточных распределений списков и повышения производительности диспетчеризации обратных вызовов. ( I82702 , I1a9d9 )
  • Добавьте аннотации @FloatRange к полям touchX , touchY и progress в NavigationEvent чтобы обеспечить соблюдение допустимых диапазонов значений во время компиляции и повысить безопасность API. ( Iac0ec )

Версия 1.0.0-альфа04

2 июля 2025 г.

Выпущен androidx.navigationevent:navigationevent-*:1.0.0-alpha04 . Версия 1.0.0-alpha04 содержит следующие коммиты .

Исправления ошибок

  • Использовал implementedInJetBrainsFork для navigationevent-compose и добавил цель commonStubs для соответствия соглашениям Compose. Изменение запрошено JetBrains . ( f60c79 )
  • Исправлено применение плагина компилятора Compose для Kotlin/Native для обеспечения корректной генерации заглушек. Это не влияет на публичные API или поведение. ( 1890c9 )

Версия 1.0.0-альфа03

18 июня 2025 г.

Выпущен androidx.navigationevent:navigationevent-*:1.0.0-alpha03 . Версия 1.0.0-alpha03 содержит следующие коммиты .

Новые функции

  • Представлен новый модуль navigationevent-compose для поддержки функций Jetpack Compose в библиотеке navigationevent . ( 980d78 )
  • NavigationEvent Compose добавлена новая локальная композиция LocalNavigationEventDispatcherOwner . Она возвращает значение, допускающее значение NULL, для более точного определения её доступности в текущей композиции. NavigationEventHandler теперь выдаёт ошибку, если базовый владелец не найден. ( 62ffda )
  • NavigationEvent Compose добавил новый NavigationEventHandler Composable для обработки событий (предиктивного жеста «Назад»). Он предоставляет Flow объектов NavigationEvent , которые необходимо собрать в лямбда-выражении приостановки, которое вы предоставляете c42ba6 :
NavigationEventHandler { progress: Flow<NavigationEvent> ->
  // This block is executed when the back gesture begins.
  try {
    progress.collect { backEvent ->
      // Handle gesture progress updates here.
    }
    // This block is executed if the gesture completes successfully.
  } catch (e: CancellationException) {
    // This block is executed if the gesture is cancelled
    throw e
  } finally {
    // This block is executed either the gesture is completed or cancelled
  }
}

Изменения API

  • Каждый NavigationEventCallback теперь может быть зарегистрирован только с одним NavigationEventDispatcher одновременно; добавление его к нескольким диспетчерам вызывает исключение IllegalStateException . Обратите внимание, что это поведение отличается от OnBackPressedDispatcher , который допускает несколько диспетчеров. ( e82c19 )
  • isPassThrough сделан val для предотвращения мутаций во время навигации, которые могли бы нарушить диспетчеризацию NavigationEvent . ( I0b287 )

Версия 1.0.0-альфа02

4 июня 2025 г.

Выпущен androidx.navigationevent:navigationevent-*:1.0.0-alpha02 . Версия 1.0.0-alpha02 содержит следующие коммиты .

Изменения API

  • Замените вторичный конструктор NavigationEventDispatcher аргументами по умолчанию. ( I716a0 )
  • Удалите свойство priority из NavigationEventCallback . Вместо этого передайте приоритет в NavigationEventDispatcher.addCallback() . ( I13cae )

Исправления ошибок

  • Исправлено исключение ConcurrentModificationException , которое могло возникнуть при вызове NavigationEventCallback.remove() из-за одновременного изменения внутреннего списка закрываемых объектов. ( b/420919815 )

Версия 1.0.0-альфа01

20 мая 2025 г.

Выпущен androidx.navigationevent:navigationevent-*:1.0.0-alpha01 . Версия 1.0.0-alpha01 содержит следующие коммиты .

Новые функции

  • Библиотека androidx.navigationevent предоставляет API, ориентированный на KMP, для обработки системных событий, а также предиктивных событий . NavigationEventDispatcher служит общим API для регистрации одного или нескольких экземпляров NavigationEventCallback для получения системных событий.
  • Этот уровень располагается ниже ранее выпущенных API в androidx.activity и призван стать более гибкой заменой использованию API Activity в компонентах более высокого уровня или непосредственному использованию API OnBackInvokedDispatcher фреймворка Android. API androidx.activity были переписаны поверх API Navigation Event в рамках Activity 1.12.0-alpha01 .