событие навигации
| Последнее обновление | Стабильный релиз | Предварительная версия релиза | Бета-версия | Альфа-версия |
|---|---|---|---|---|
| 28 января 2026 г. | 1.0.2 | - | - | - |
Объявление зависимостей
Чтобы добавить зависимость от navigationevent, необходимо добавить репозиторий Google Maven в ваш проект. Для получения дополнительной информации ознакомьтесь с информацией в репозитории Google Maven .
Добавьте зависимости для необходимых артефактов в файл build.gradle вашего приложения или модуля:
Круто
dependencies { implementation "androidx.navigationevent:navigationevent:1.0.2" }
Котлин
dependencies { implementation("androidx.navigationevent:navigationevent:1.0.2") }
Для получения дополнительной информации о зависимостях см. раздел «Добавление зависимостей сборки» .
Обратная связь
Ваши отзывы помогают улучшить Jetpack. Сообщите нам, если вы обнаружите новые проблемы или у вас есть идеи по улучшению этой библиотеки. Пожалуйста, ознакомьтесь с существующими проблемами в этой библиотеке, прежде чем создавать новую. Вы можете проголосовать за существующую проблему, нажав кнопку со звездочкой.
Для получения более подробной информации см. документацию по системе отслеживания ошибок .
Для этого артефакта отсутствуют примечания к выпуску.
Версия 1.0
Версия 1.0.2
28 января 2026 г.
Выпущена версия androidx.navigationevent:navigationevent-*:1.0.2 . Версия 1.0.2 содержит следующие коммиты .
Исправлены ошибки
- Исправлена ошибка, приводящая к сбою при использовании
NavigationEventHandlerв режиме предварительного просмотра Android Studio. Теперь обработчик определяет режим проверки и ничего не делает, позволяя предварительному просмотру отображаться без предоставленного диспетчера. ( I370f2 , b/454313986 ).
Версия 1.0.1
3 декабря 2025 г.
Выпущена версия androidx.navigationevent:navigationevent-*:1.0.1 . Версия 1.0.1 содержит следующие коммиты .
Исправлены ошибки
- Исправлена ошибка
ConcurrentModificationExceptionпри освобождении ресурсов дочернегоNavigationEventDispatcher, например, созданного с помощьюrememberNavigationEventDispatcherOwner(). ( ec68a9 , b/454363524 )
Версия 1.0.0
19 ноября 2025 г.
Выпущена версия androidx.navigationevent:navigationevent-*:1.0.0 . Версия 1.0.0 содержит следующие коммиты .
Основные особенности версии 1.0.0:
Библиотека Navigation Event теперь стабильна! Navigation Event — это библиотека AndroidX для обработки взаимодействий на системном уровне, таких как системный возврат и предиктивный возврат в Android (и других платформах).
Для обработки событий
NavigationEventвы можете реализовать собственныйNavigationEventHandler, который переопределяет необходимые функции. Затем вам нужно добавить обработчик вNavigationEventDispatcher. Начиная с версии Activity1.12.0,ComponentActivityреализует новый интерфейсNavigationEventDispatcherOwner, который предоставляет готовый к использованию диспетчер событий:// The NavigationEventInfo provides information about a navigation state object CurrentInfo : NavigationEventInfo() // you can retrieve this from any component that is a NavigationEventDispatcherOwner // or you can instantiate your own custom dispatcher val dispatcher = myActivity.navigationEventDispatcher val myHandler = object : NavigationEventHandler<NavigationEventInfo>( initialInfo = CurrentInfo, isBackEnabled = true ) { override fun onBackStarted(event: NavigationEvent) { // Prepare for the back event } override fun onBackProgressed(event: NavigationEvent) { // Use event.progress for predictive animations } // This is the required method for final event handling override fun onBackCompleted() { // Complete the back event } override fun onBackCancelled() { // Cancel the back event } } dispatcher.addHandler(myHandler)Модуль
navigationevent:navigationevent-composeпредоставляет удобную функциюNavigationBackHandler, которая автоматически связывает обработчик с ближайшим объектомNavigationEventDispatcherиз классаLocalNavigationEventDispatcherOwnerи позволяет разработчикам передавать желаемое поведение в качестве параметров:object CurrentInfo : NavigationEventInfo() object PreviousInfo : NavigationEventInfo() val navEventState = rememberNavigationEventState( currentInfo = CurrentInfo, backInfo = PreviousInfo ) // Inside composition NavigationBackHandler( State = navEventState, isBackEnabled = true, // optional onBackCancelled = { // Cancel the back event }, // required onBackCompleted = { // Complete the back event } , )
Использование этого шаблона в Compose значительно упрощает перенос состояния NavigationEventState и позволяет отслеживать его различными компонентами Composable (например, в случае Navigation3, где можно перенести состояние из NavDisplay ).
Каждый
NavigationEventDispatcherможет указывать родительский диспетчер как в случае использования конструкции, так и без неё. Это позволяет разработчикам создавать иерархическую структуру, в которой несколько диспетчеров могут управляться одним родительским диспетчером. Наличие родительского диспетчера значительно упрощает обработку групп диспетчеров, которые могут нуждаться в отключении или освобождении ресурсов:// Non-Compose val parentDispatcher = NavigationEventDispatcher() val childDispatcher = NavigationEventDispatcher(parent = parentDispatcher) // Compose val composeChildDispatcher = rememberNavigationEventDispatcher( // This defaults to `LocalNavigationEventDispatcherOwner.current` // Must explicitly provide null to have an unparented dispatcher created here parent = NavigationEventDispatch() )Библиотека также позволяет передавать сигналы непосредственно в
NavigationEventDispatcherчерезNavigationEventInput.NavigationEventInputвыступает в качестве «входной» части системы навигации, преобразуя специфичные для платформы события (например, системные жесты возврата или нажатия кнопок) в стандартизированные события, которые могут быть отправлены вNavigationEventDispatcher. Модульnavigationevent:navigationeventв настоящее время предоставляет 2NavigationEventInput: более универсальныйDirectNavigationEventInput, позволяющий отправлять любые события, и специфичный для AndroidOnBackInvokedInput, который позволяетNavigationEventDispatcherподдерживать системный жест возврата и предиктивный жест возврата. Если вы реализуете собственный диспетчер (вместо использования диспетчера, предоставляемогоComponentActivity), вам необходимо вручную добавить свой вход:val dispatcher = NavigationEventDispatcher() dispatcher.addInput(DirectNavigationEventInput()) dispatcher.addInput(OnBackInvokedDefaultInput(invoker))
Версия 1.0.0-rc01
5 ноября 2025 г.
Выпущена версия androidx.navigationevent:navigationevent-*:1.0.0-rc01 . Версия 1.0.0-rc01 содержит следующие коммиты .
Версия 1.0.0-beta01
8 октября 2025 г.
Выпущена версия androidx.navigationevent:navigationevent-*:1.0.0-beta01 . Версия 1.0.0-beta01 содержит следующие коммиты .
Изменения в API
- Исправьте аннотацию
FloatRangeдляNavigationEvent.touchXиNavigationEvent.touchY. Эти значения представляют собой абсолютные координаты пикселей и не имеют верхней границы1.0. ( I4b205 , b/445989313 ) - Переработайте составной объект
NavigationEventDispatcherOwnerдобавив в негоrememberNavigationEventDispatcherOwner. Теперь функция возвращаетNavigationEventDispatcherOwnerнапрямую. Чтобы предоставить этот владелец подкомпозиции, используйтеCompositionLocalProvider. ( I874b2 , b/444446629 )
Версия 1.0.0-alpha09
24 сентября 2025 г.
Выпущена версия androidx.navigationevent:navigationevent-*:1.0.0-alpha09 . Версия 1.0.0-alpha09 содержит следующие коммиты .
Изменения в API
- Используйте объект-синглтон
NavigationEventTransitionState.Idleнапрямую, вместо создания экземпляраIdle(). ( Ic7d9e , b/444734264 ) - Сделайте конструкторы вспомогательными внутренними; получайте экземпляры через публичный класс
NavigationEventDispatcher.historyвместо прямого создания. ( I3b7e0 , b/444734264 ) - Требуется создание
NavigationEventStateчерезrememberNavigationEventState; конструктор теперь является внутренним. ( IE143c , b/444734264 ) - Замените использование метода
fallbackOnBackPressedи параметр конструктораonBackCompletedFallback. Поведение остается неизменным; метод вызывается только при завершенных, необработанных событиях возврата. ( Idabe9 , b/444734264 ) - Основной конструктор
NavigationEventHistory(mergedHistory, currentIndex)теперь являетсяinternal. Внешние потребители должны использовать открытые конструкторы (либо пустой конструктор, либо конструктор на основе разделов) для создания экземпляров. ( I1c047 , b/444734264 ) - Заставить
View.setViewTreeNavigationEventDispatcherOwnerпринимать значение nullable owner ( Ic9eb6 , b/444436762 ) -
NavigationEventInfoтеперь являетсяabstract classа неinterface. Обновите все пользовательские реализации, чтобы они наследовали от этого класса (например,data class MyInfo : NavigationEventInfo()). ( I1e59c , b/444734264 ) - Устаревшее свойство
NavigationEventDispatcher.stateи функцияgetState<T>()были удалены. Используйте новые, отдельные потокиdispatcher.transitionState(для отслеживания прогресса жестов) иdispatcher.history(для стека навигации). ( Ic2ceb , b/444734264 ) - Заменен коллбэк
NavigationEventInput.onInfoChanged(...). Реализован новый коллбэкonHistoryChanged(history: NavigationEventHistory)для получения обновлений в виде единого объектаNavigationEventHistory. ( I23e0b , b/444734264 ) - Вводится новый глобальный
StateFlowNavigationEventDispatcher.history. Этот негенерический поток позволяет наблюдателям подписываться только на изменения в стеке навигации и остается стабильным на протяжении всего выполнения жеста. Это аналогtransitionState. ( I1db10 , b/444734264 ) - Вводится новый глобальный
StateFlowNavigationEventDispatcher.transitionState. Этот негенерический поток позволяет наблюдателям подписываться только на физическое состояние жеста (Idle/InProgress), отдельно от истории. ( I171fa , b/444734264 ) - Вводится класс
NavigationEventHistoryState. Он будет служить основным API для отслеживания истории навигационной информации, отдельно от состояния жестов. ( I81ca5 , b/444734264 ) - Теперь
NavigationEventпомечен как@Immutable, что позволяет компилятору Compose оптимизировать перекомпозиции. ( If78c7 , b/444734264 ) - API обработчиков
navigationevent-composeобновлены.NavigationEventHandlerиNavigationBackHandler(и их варианты) теперь поддерживают новую перегрузку, которая принимает поднятое состояниеNavigationEventState. Простые перегрузки (принимающиеcurrentInfo) сохранены и теперь используют эту новую модель состояния внутри. ( Ic3251 , b/444734264 ) - Добавьте новый объект
@StableNavigationEventState<T>в библиотекуnavigationevent-compose. Этот объект объединяет локальную историю с локальным состоянием жестов и будет основным связующим звеном междуrememberNavigationEventStateиNavigationEventHandler. ( Ifb69f , b/444734264 ) - В
NavigationEventHandlerдобавлено новое общедоступное свойствоtransitionState: TransitionState, доступное только для чтения. Теперь обработчики поддерживают собственное состояние перехода, которое могут отслеживать внешние системы. ( I9acd2 , b/444734264 ) - Представляем новый закрытый класс
TransitionState. Он будет служить основным API для отслеживания состояния жестов, отдельно от истории навигации. ( Id4beb , b/444734264 ) - Предоставить
currentInfo,backInfoиforwardInfoв качестве общедоступных свойств только для чтения вNavigationEventHandler. ( Ia7636 , b/444734264 ) - Теперь реализациям
NavigationEventHandlerнеобходимо передавать значениеinitialInfo: Tбазовому конструктору. ( Idcfea , b/444734264 ) - Замените
OnBackInvokedInputнаOnBackInvokedOverlayInputилиOnBackInvokedDefaultInput. ( I5323f , b/428948766 ) - Пометьте
NavigationEventStateкак@Immutable. Это повысит производительность Compose, гарантируя, что Composable-объекты, отслеживающие это состояние, смогут корректно пропускать перекомпозицию. ( I399c8 ) - Переименовать
NavigationEventInfo.NotProvidedвNavigationEventInfo.None;обновить ссылки. Изменений в поведении нет. ( I5e2d4 ) - Теперь
NavigationEventInfoпомечен как@Immutable, что позволяет компилятору Compose оптимизировать перекомпозиции. ( I7c112 ) - Улучшите эргономику Java с помощью удобного интерфейса для резервного варианта автозавершения. ( I8a860 )
- Переименуйте
onHasEnabledHandlerChangedвonHasEnabledHandlersChanged. Это уточнит, что функция обратного вызова сообщает о совокупном состоянии включения всех обработчиков, а не только одного. ( I1af61 , b/443711297 ) - Удалите
hasEnabledHandler()изNavigationEventDispatcher;вместо него используйтеNavigationEventInput.onHasEnabledHandlersChanged. ( Idef72 , b/443711297 ) - Добавьте функцию обратного вызова
onInfoChangedкNavigationEventInput, чтобы уведомлять слушателей об изменениях в истории навигации. Это обеспечивает полный контекст текущего, предыдущего и следующего стеков, позволяя элементам ввода реагировать на контекстную информацию. ( I69a8b , b/443282983 ) - Сделайте свойство `
swipeEdgeобъекта `NavigationEvent@IntDef( `Icee54` , b/443950342` ) - Добавьте параметр
priorityкNavigationEventDispatcher.addInput, чтобы ограничить диспетчер одним приоритетом; события, такие какonHasEnabledCallbacksChangedтеперь срабатывают только при изменении коллбэков с этим приоритетом. ( I3e488 , b/443711297 ) - Для большей ясности переименуйте параметр
NavigationEventDispatcherизparentDispatcherв parent. ( Id4f1f , b/443801782 ) - Удалите
NavigationEventPriorityв пользу@IntDefдля пользователей Java ( I10a9f , b/440514265 ) - Необходимо обеспечить соблюдение контракта обработчика навигации. Если ваш
NavigationEventHandlerустанавливаетisBackEnabledилиisForwardEnabledвtrue, теперь необходимо переопределить методыonBackCompletedилиonForwardCompletedсоответственно. Реализации по умолчанию теперь генерируют исключение, чтобы предотвратить скрытые сбои. ( I17c62 ) - При добавлении обработчиков событий навигации необходимо обеспечить корректность значений приоритета. Вызов
addHandlerс неподдерживаемым приоритетом теперь будет вызывать исключениеIllegalArgumentException, обеспечивая немедленную обратную связь при некорректном использовании на всех целевых платформах. ( I3c474 )
Исправлены ошибки
- Сделать
addHandlerидемпотентным; игнорировать повторяющиеся регистрации. ( I052aa , b/444734264 ) - Поддерживайте синхронизацию свойств
NavigationEventStateво время перекомпозиции. ( Ib3b4d , b/444734264 ) - Убедитесь, что
NavigationEventInputsполучают текущую контекстную информацию (текущая, назад, вперед) сразу после регистрации. ( Ie65bf , b/443282983 )
Версия 1.0.0-alpha08
10 сентября 2025 г.
Выпущена версия androidx.navigationevent:navigationevent-*:1.0.0-alpha08 . Версия 1.0.0-alpha08 содержит следующие коммиты .
Новые функции
- Ввести API
NavigationEventHandlerна основе лямбда-функций, заменяющий обработчик на основе потоков. Обработка жестов "назад" и "вперед" с помощью простых коллбэков вместо сбора потоков, что уменьшит шаблонный код и позволит избежать проблем с отменой. ПредоставитьNavigationBackHandlerиNavigationForwardHandlerв качестве целевых удобных API. УдалитьNavigationEventHandlerна основе потоков; перейти к новым коллбэкам. ( I23bac , b/436248277 ) - Разрешить пассивным слушателям доступ к полному стеку возврата навигации через объединенную информацию о возврате. Разрешить пользовательским интерфейсам отображать предварительный просмотр и вложенную историю навигации, вместо того чтобы ограничиваться самым верхним коллбэком. ( I7a510 , b/436248277 )
- Ввести явную модель "назад/текущее/вперед" для уточнения состояния навигации и поддержки навигации вперед с вложенными обработчиками. ( Ib86da , b/420443609 )
- Добавьте методы
onForward*иisForwardEnabledвNavigationEventCallback. ( Ic100f , b/436248290 ) - Добавить поддержку навигации вперед в
NavigationEventInput. ( I5734b )
Изменения в API
- Включите тестирование событий прямой навигации с помощью
TestNavigationEventCallback. Используйте хукиisForwardEnabledиonForward*. ( I21fb5 , b/420443609 ) - Переименуйте коллбэки
onEvent*вonBack*вNavEvent. ( I228b3 , b/436248290 ) - Преобразовать
SwipeEdgeво встроенный класс. ( Id5e01 ) - Обеспечьте совместимость библиотеки
navigationeventс Java. Все общедоступные API теперь полностью доступны из кода Java, что позволяет беспрепятственно интегрировать ее в проекты, использующие разные языки программирования или только Java. ( Ibc944 , I5465f , I9fb1e , b/440532890 b/443040294 ) - Уточните роли API, переименовав
NavigationEventCallbackвNavigationEventHandler. Это изменение лучше отражает назначение класса — обработку многоэтапных навигационных жестов. Соответствующий методaddCallbackтеперь называетсяaddHandler. ( I2492a , b/443040331 )
Исправлены ошибки
- Предотвратить запуск резервного варианта при навигации вперед. ( I74814 , b/436248290 )
- Добавлена поддержка предиктивной навигации вперед. API
NavigationEventтеперь обрабатывают жесты как назад, так и вперед, обеспечивая согласованную анимацию для обоих направлений навигации. ( Idc98c , b/436248290 ) - Предотвращение сбоя
IllegalStateExceptionво время перекомпозиции при удалении дочернегоNavigationEventDispatcherOwner. ( Iff50c , b/412629020 ) - Теперь пассивные обработчики событий могут получить доступ ко всему стеку возврата навигации через объединенную информацию о возврате, что позволяет пользовательским интерфейсам отображать предварительный просмотр и вложенную историю навигации, вместо того чтобы ограничиваться самым верхним коллбэком. ( I7a510 , b/436248277 )
Версия 1.0.0-alpha07
27 августа 2025 г.
Выпущена версия androidx.navigationevent:navigationevent-*:1.0.0-alpha07 . Версия 1.0.0-alpha07 содержит следующие коммиты .
Изменения в API
- Удалите
NavigationEventDispatcher.onHasEnabledCallbacksChanged. ( I50e97 ) - Сделайте
NavigationEventCallback.onEventCompleted()абстрактным. ( I36b38 ) - Измените методы
NavigationEventCallback#on*наprotected. Обновите вызывающий код, чтобы он их переопределял. ( I6b691 ) - Переименуйте функции
DirectNavigationEventInput. ( Iffb62 ) - Переименуйте
NavigationEventInput.onAttachвonAdded. ( I2d0b8 ) - Переименуйте
NavigationEventInput.onDetachвonRemoved. ( I2d0b8 ) - Переименуйте
NavigationEventInputHandlerвNavigationEventInput. ( I676a4 ) - Добавьте
@EmptySuperвNavigationEventInput.onHasEnabledCallbacksChanged. ( If9853 ) - Реализуйте
onAttachвNavigationEventInputHandler. ( I03648 ) - Реализуйте
onDetachвNavigationEventInputHandler. ( I03648 ) -
NavigationEventCallbackпо умолчанию включается при создании объекта. ( Ic0188 ) - Замените
NavigationEventInput.addOnHasEnabledCallbacksChangedCallbackнаNavigationEventInput.onHasEnabledCallbacksChanged. ( I64e93 ) - Для вызова
NavigationEventDispatcher.addInputтребуется основной поток. ( IC2930 ) - Для вызова
NavigationEventDispatcher.removeInputтребуется основной поток. ( IC2930 ) - Удалите
Dispatcher.addOnHasEnabledCallbacksChangedCallback. Замените наDispatcher.onHasEnabledCallbacksChanged. ( Ida3e3 , b/436530096 )
Исправлены ошибки
- Исправлена ошибка, из-за которой добавление уже прикрепленного обработчика или удаление неприкрепленного приводило к некорректной логике жизненного цикла. ( I9e47b )
Версия 1.0.0-alpha06
13 августа 2025 г.
Выпущена версия androidx.navigationevent:navigationevent-*:1.0.0-alpha06 . Версия 1.0.0-alpha06 содержит следующие коммиты .
Новые функции
API пассивных слушателей
Теперь вы можете передавать пользовательскую контекстную информацию с любого хоста навигации и пассивно отслеживать изменения состояния жестов из любой точки пользовательского интерфейса. Это позволяет создавать контекстно-зависимые анимации для предиктивной навигации назад и других навигаций, управляемых жестами.
Эта функция состоит из двух частей:
- Предоставление информации — используйте
NavigationEventInfoдля передачи пользовательских данных. - Использование состояния — применяйте
dispatcher.state(NavigationEventState) для отслеживания хода выполнения жеста и контекста.
- Теперь
NavigationEventCallbackпредоставляет методsetInfo(currentInfo, previousInfo)для установки контекста жеста за один вызов ( I1d5e7 , b/424470518 ). -
NavigationEventHandlerдобавляет новую перегрузку, которая принимаетcurrentInfoиpreviousInfo, что делает его основным API для предоставления контекста в приложениях Compose ( I6ecd3 , b/424470518 ).
Пример:
data class MyScreenInfo(val screenName: String) : NavigationEventInfo
NavigationEventHandler(
enabled = true,
currentInfo = MyScreenInfo("Details Screen"),
previousInfo = MyScreenInfo("Home Screen")
) { /* Handle back completion */ }
- Теперь
NavigationEventDispatcherпредоставляетdispatcher.stateиdispatcher.getState<T>()( If7fae , Ia90ca , b/424470518 ). Эти API на основеStateFlowпозволяют любому пользовательскому интерфейсу отслеживать прогресс жестов и контекстные данные без прямой обработки события.
Пример:
val gestureState by LocalNavigationEventDispatcherOwner.current!!
.navigationEventDispatcher
.state
.collectAsState()
val progress = gestureState.progress // Returns latestEvent.progress or 0F
when (val state = gestureState) {
is InProgress -> {
val toScreen = state.currentInfo as MyScreenInfo
val fromScreen = state.previousInfo as MyScreenInfo
println("Navigating from ${fromScreen.screenName} to ${toScreen.screenName}")
}
is Idle -> { /* Idle state */ }
}
Добавьте свойство
progressвNavigationEventState( I7b196 ), которое возвращаетlatestEvent.progressкогда событие выполняется, или0Fв противном случае:val progress = state.progressДобавьте компонуемый класс
NavigationEventDispatcherOwnerдля иерархического создания, связывания и удаления экземпляровNavigationEventDispatcher. Включите динамическое управление состоянием включения диспетчера и автоматическую очистку.@Composable fun Sample() { NavigationEventDispatcherOwner(enabled = true) { val localDispatcherOwner = LocalNavigationEventDispatcherOwner.current } }
Изменения в API
- Параметр
isPassthroughбыл удален изNavigationEventCallback. ( I99028 , b/424470518 ) - Конструкторы
NavigationEventStateтеперь являются внутренними. Для тестирования обновите состояние (по умолчаниюIdle) с помощьюDirectNavigationEventInputHandler. ВызовитеhandleOnStartedилиhandleOnProgressed, чтобы установить состояние вInProgress, иhandleOnCompletedилиhandleOnCancelled, чтобы вернуть его вIdle. Для обновленияNavigationEventInfoиспользуйтеNavigationEventCallback.setInfo. ( I93dca , b/424470518 ) - Добавлены параметры по умолчанию для
NavigationEvent, чтобы упростить создание экземпляров и тестирование; их следует использовать вместоTestNavigationEvent. ( I5dc49 , I232f4 ) - Добавлена функция
TestNavigationEventCallbackдля тестирования событий навигации с конкретными текущими/предыдущими состояниями. ( Idd22e , b/424470518 ) -
NavigationEventInputHandlerбыл преобразован в абстрактный класс, заменяющий предыдущийAbstractNavigationEventInputHandlerреализацией изDirectNavigationEventInputHandler( Iadde5 , Ifed40 I3897c , b/432616296 , b/435416924 ). - Функции
send*вNavigationEventInputHandlerполучили новые префиксы, теперь они называютсяhandle*. ( Iffcaf ) -
OnBackInvokedInputHandlerтеперь расширяет новыйabstractNavigationInputHandler. ( Ib45aa ) - Изменено
NavigationEventDispatcherOwnerтеперь требуется родительский диспетчер, тогда как для создания корневого диспетчера необходимо явно передатьnull. ( Ia6f64 , b/431534103 )
Исправлены ошибки
- Повышена эффективность за счет предотвращения копирования коллекций в
NavigationEventDispatcher.dispose(). ( I4ab09 ) - Исправлена ошибка, из-за которой
NavigationEventHandlerнекорректно реагировал на изменения своего состояния включения. ( Ia5268 , I19bec , I5be5c , b/431534103 )
Обновления документации
- Документация KDocs для
NavigationEventрасширена, чтобы уточнить его роль как унифицированной оболочки событий и подробно описать поведение свойств для различных типов навигации (жесты, клики). ( I91e8d ) - Обновлена документация по API Compose для обработки возврата (
BackHandler,PredictiveBackHandler,NavigationEventHandler), чтобы описывать поведение, конкретно связанное с порядком обратных вызовов. ( I7ab94 )
Обновление зависимостей
- Теперь
NavigationEventзависит от Compose Runtime 1.9.0-beta03, что позволяет артефактуnavigationevent-composeподдерживать все цели KMP. ( Ia1b87 )
Версия 1.0.0-alpha05
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)
}
Примечание: В aosp/3692572 мы добавим новый компонент NavigationEventDispatcherOwner Composable, который будет автоматически управлять дочерним диспетчером в пользовательском интерфейсе Compose. Однако это изменение не вошло в текущий релиз и запланировано на следующий.
Библиотека для тестирования навигации
- Добавить модуль
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-alpha04
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-alpha03
18 июня 2025 г.
Выпущена версия androidx.navigationevent:navigationevent-*:1.0.0-alpha03 . Версия 1.0.0-alpha03 содержит следующие коммиты .
Новые функции
- Введен новый модуль
navigationevent-composeдля поддержки функций Jetpack Compose в библиотекеnavigationevent. ( 980d78 ) -
NavigationEventCompose добавлен новый локальный компонентLocalNavigationEventDispatcherOwner. Он возвращает значение, допускающее значение null, чтобы лучше определить, доступен ли компонент в текущем компоненте.NavigationEventHandlerтеперь будет выдавать ошибку, если базовый владелец не найден. ( 62ffda ) -
NavigationEventCompose добавлен новый компонентNavigationEventHandlerComposable для обработки событий (например, предиктивного жеста «назад»). Он предоставляет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-alpha02
4 июня 2025 г.
Выпущена версия androidx.navigationevent:navigationevent-*:1.0.0-alpha02 . Версия 1.0.0-alpha02 содержит следующие коммиты .
Изменения в API
- Замените вторичный конструктор
NavigationEventDispatcherаргументами по умолчанию. ( I716a0 ) - Удалите свойство priority из
NavigationEventCallback. Вместо этого передавайте priority вNavigationEventDispatcher.addCallback(). ( I13cae )
Исправлены ошибки
- Исправлена ошибка
ConcurrentModificationException, которая могла возникнуть при вызовеNavigationEventCallback.remove()из-за одновременного изменения внутреннего списка закрываемых элементов. ( b/420919815 )
Версия 1.0.0-alpha01
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 в компонентах более высокого уровня или прямому использованию APIOnBackInvokedDispatcherфреймворка Android. APIandroidx.activityбыли переписаны поверх API Navigation Event в рамках Activity 1.12.0-alpha01 .