navigationevent
| Latest Update | Stable Release | Release Candidate | Beta Release | Alpha Release |
|---|---|---|---|---|
| October 8, 2025 | - | - | 1.0.0-beta01 | - |
Declaring dependencies
To add a dependency on navigationevent, you must add the Google Maven repository to your project. Read Google's Maven repository for more information.
Add the dependencies for the artifacts you need in the build.gradle file for
your app or module:
Groovy
dependencies { implementation "androidx.navigationevent:navigationevent:1.0.0-beta01" }
Kotlin
dependencies { implementation("androidx.navigationevent:navigationevent:1.0.0-beta01") }
For more information about dependencies, see Add build dependencies.
Feedback
Your feedback helps make Jetpack better. Let us know if you discover new issues or have ideas for improving this library. Please take a look at the existing issues in this library before you create a new one. You can add your vote to an existing issue by clicking the star button.
See the Issue Tracker documentation for more information.
There are no release notes for this artifact.
Version 1.0
Version 1.0.0-beta01
October 08, 2025
androidx.navigationevent:navigationevent-*:1.0.0-beta01 is released. Version 1.0.0-beta01 contains these commits.
API Changes
- Correct the
FloatRangeannotation forNavigationEvent.touchXandNavigationEvent.touchY. These values represent absolute pixel coordinates and do not have a1.0upper bound. (I4b205, b/445989313) - Refactor the
NavigationEventDispatcherOwnercomposable torememberNavigationEventDispatcherOwner. The function now returns theNavigationEventDispatcherOwnerdirectly. To provide this owner to a sub-composition, useCompositionLocalProvider. (I874b2, b/444446629)
Version 1.0.0-alpha09
September 24, 2025
androidx.navigationevent:navigationevent-*:1.0.0-alpha09 is released. Version 1.0.0-alpha09 contains these commits.
API Changes
- Use the
NavigationEventTransitionState.Idlesingleton object directly instead of instantiatingIdle(). (Ic7d9e, b/444734264) - Make convenience constructors internal; obtain instances via public
NavigationEventDispatcher.historyinstead of direct construction. (I3b7e0, b/444734264) - Require creating
NavigationEventStateviarememberNavigationEventState; constructor is now internal. (Ie143c, b/444734264) - Adopt
onBackCompletedFallbackreplacefallbackOnBackPressedusages and constructor parameter. Behavior is unchanged; invoked only on completed, unhandled back events. (Idabe9, b/444734264) - The primary constructor of
NavigationEventHistory(mergedHistory, currentIndex)is nowinternal. External consumers must use the public constructors (either the empty constructor or the partition-based constructor) to create instances. (I1c047, b/444734264) - Make
View.setViewTreeNavigationEventDispatcherOwneraccept nullable owner (Ic9eb6, b/444436762) NavigationEventInfois now anabstract classinstead of aninterface. Update all custom implementations to inherit from the class (e.g,data class MyInfo : NavigationEventInfo()). (I1e59c, b/444734264)- The legacy
NavigationEventDispatcher.stateproperty andgetState<T>()function have been removed. Use the new, separatedispatcher.transitionState(for gesture progress) anddispatcher.history(for the navigation stack) flows. (Ic2ceb, b/444734264) - The
NavigationEventInput.onInfoChanged(...)callback is replaced. Implement the newonHistoryChanged(history: NavigationEventHistory)callback to receive updates as a singleNavigationEventHistoryobject. (I23e0b, b/444734264) - Introduce a new global
NavigationEventDispatcher.historyStateFlow. This non-generic flow allows observers to subscribe only to changes to the navigation stack and remains stable during gesture progress. This is the counterpart totransitionState. (I1db10, b/444734264) - Introduce a new global
NavigationEventDispatcher.transitionStateStateFlow. This non-generic flow allows observers to subscribe only to the physical gesture state (Idle/InProgress), separate from history. (I171fa, b/444734264) - Introduce the
NavigationEventHistoryStateclass. This will serve as the core API for observing navigation information history, separate from gesture state. (I81ca5, b/444734264) NavigationEventis now marked as@Immutable, allowing the Compose Compiler to optimize recompositions. (If78c7, b/444734264)- The
navigationevent-composehandler APIs are updated.NavigationEventHandlerandNavigationBackHandler(and variants) now support a new overload that accepts a hoistedNavigationEventStates. The simple overloads (takingcurrentInfo) are preserved and now use this new state model internally. (Ic3251, b/444734264) - Add the new
@StableNavigationEventState<T>state holder to thenavigationevent-composelibrary. This object combines local history with local gesture state and will be the primary link betweenrememberNavigationEventStateandNavigationEventHandler. (Ifb69f, b/444734264) - Add a new public, read-only
transitionState: TransitionStateproperty toNavigationEventHandler. Handlers now maintain their own transition state, which external systems can observe. (I9acd2, b/444734264) - Introduce the new
TransitionStatesealed class. This will serve as the core API for observing gesture state, separate from navigation history. (Id4beb, b/444734264) - Expose
currentInfo,backInfo, andforwardInfoas public, read-only properties onNavigationEventHandler. (Ia7636, b/444734264) - Implementations of
NavigationEventHandlermust now provide aninitialInfo: Tvalue to the base constructor. (Idcfea, b/444734264) - Replace
OnBackInvokedInputwithOnBackInvokedOverlayInputorOnBackInvokedDefaultInput. (I5323f, b/428948766) - Mark
NavigationEventStateas@Immutable. This improves Compose performance by ensuring Composables observing this state can correctly skip recomposition. (I399c8) - Rename
NavigationEventInfo.NotProvidedtoNavigationEventInfo.None;update references. No behavior change. (I5e2d4) NavigationEventInfois now marked as@Immutable, allowing the Compose Compiler to optimize recompositions. (I7c112)- Improve Java ergonomics with fun interface for back completion fallback. (I8a860)
- Rename
onHasEnabledHandlerChangedtoonHasEnabledHandlersChanged. This clarifies that the callback reports on the collective enablement state of all handlers, not just one. (I1af61, b/443711297) - Remove
hasEnabledHandler()fromNavigationEventDispatcher;useNavigationEventInput.onHasEnabledHandlersChangedinstead. (Idef72, b/443711297) - Add
onInfoChangedcallback toNavigationEventInputto notify listeners of changes to the navigation history. This provides the full context of the current, back, and forward stacks, enabling Inputs to react to the contextual information. (I69a8b, b/443282983) - Make
NavigationEvent'sswipeEdgean@IntDef(Icee54, b/443950342) - Add a
priorityparameter toNavigationEventDispatcher.addInputto scope a dispatcher to one priority; events such asonHasEnabledCallbacksChangednow fire only when callbacks at that priority change. (I3e488, b/443711297) - Rename
NavigationEventDispatcherparam fromparentDispatcherto parent for clarity. (Id4f1f, b/443801782) - Remove
NavigationEventPriorityin favor of@IntDeffor Java users (I10a9f, b/440514265) - Enforce navigation handler contract. If your
NavigationEventHandlersetsisBackEnabledorisForwardEnabledtotrue, you must now overrideonBackCompletedoronForwardCompletedrespectively. The default implementations now throw an exception to prevent silent failures. (I17c62) - Enforce valid priority values when adding navigation event handlers. Calling
addHandlerwith an unsupported priority will now throw anIllegalArgumentException, providing immediate feedback for incorrect usage across all target platforms. (I3c474)
Bug Fixes
- Make
addHandleridempotent; ignore duplicate registrations. (I052aa, b/444734264) - Keep
NavigationEventStateproperties in sync during recomposition. (Ib3b4d, b/444734264) - Ensure
NavigationEventInputsreceive the current contextual info (current, back, forward) immediately upon registration. (Ie65bf, b/443282983)
Version 1.0.0-alpha08
September 10, 2025
androidx.navigationevent:navigationevent-*:1.0.0-alpha08 is released. Version 1.0.0-alpha08 contains these commits.
New Features
- Introduce a lambda-based
NavigationEventHandlerAPI that replaces the Flow-based handler. Handle back and forward gestures with simple callbacks instead of collecting flows, reducing boilerplate and avoiding cancellation issues. ProvideNavigationBackHandlerandNavigationForwardHandleras targeted convenience APIs. Remove the Flow-basedNavigationEventHandler; migrate to the new callbacks. (I23bac, b/436248277) - Allow passive listeners to access the full navigation back stack through combined back info. Enable UIs to render previews and nested navigation history instead of being limited to the top-most callback. (I7a510, b/436248277)
- Introduce an explicit back/current/forward model to clarify navigation state and support forward navigation with nested handlers. (Ib86da, b/420443609)
- Add
onForward*methods andisForwardEnabledtoNavigationEventCallback. (Ic100f, b/436248290) - Add forward navigation support to
NavigationEventInput. (I5734b)
API Changes
- Enable testing of forward navigation events with
TestNavigationEventCallback. UseisForwardEnabledandonForward*hooks. (I21fb5, b/420443609) - Rename
onEvent*callbacks toonBack*inNavEvent. (I228b3, b/436248290) - Convert
SwipeEdgeto an inline class. (Id5e01) - Make the
navigationeventlibrary interoperable with Java. All public APIs are now fully accessible from Java code, enabling seamless integration into mixed-language or Java-only projects. (Ibc944,I5465f, I9fb1e, b/440532890b/443040294) - Clarify API roles by renaming
NavigationEventCallbacktoNavigationEventHandler. This change better reflects the class's purpose of handling multi-stage navigation gestures. The correspondingaddCallbackmethod is nowaddHandler. (I2492a, b/443040331)
Bug Fixes
- Prevent back fallback from running on forward navigation. (I74814, b/436248290)
- Add support for predictive forward navigation.
NavigationEventAPIs now handle both back and forward gestures, enabling consistent animations for both navigation directions. (Idc98c, b/436248290) - Prevent an
IllegalStateExceptioncrash during recomposition when a childNavigationEventDispatcherOwneris removed. (Iff50c, b/412629020) - Passive listeners can now access the full navigation back stack through combined back info, enabling UIs to render previews and nested navigation history instead of being limited to the top-most callback. (I7a510, b/436248277)
Version 1.0.0-alpha07
August 27, 2025
androidx.navigationevent:navigationevent-*:1.0.0-alpha07 is released. Version 1.0.0-alpha07 contains these commits.
API Changes
- Remove
NavigationEventDispatcher.onHasEnabledCallbacksChanged. (I50e97) - Make
NavigationEventCallback.onEventCompleted()abstract. (I36b38) - Change
NavigationEventCallback#on*methods toprotected. Update calling code to override them. (I6b691) - Rename
DirectNavigationEventInputfunctions. (Iffb62) - Rename
NavigationEventInput.onAttachtoonAdded. (I2d0b8) - Rename
NavigationEventInput.onDetachtoonRemoved. (I2d0b8) - Rename
NavigationEventInputHandlertoNavigationEventInput. (I676a4) - Add
@EmptySupertoNavigationEventInput.onHasEnabledCallbacksChanged. (If9853) - Implement
onAttachinNavigationEventInputHandler. (I03648) - Implement
onDetachinNavigationEventInputHandler. (I03648) - Default
NavigationEventCallbackto enabled upon creation. (Ic0188) - Replace
NavigationEventInput.addOnHasEnabledCallbacksChangedCallbackwithNavigationEventInput.onHasEnabledCallbacksChanged. (I64e93) - Require the main thread for
NavigationEventDispatcher.addInput. (Ic2930) - Require the main thread for
NavigationEventDispatcher.removeInput. (Ic2930) - Remove
Dispatcher.addOnHasEnabledCallbacksChangedCallback. Replace withDispatcher.onHasEnabledCallbacksChanged. (Ida3e3, b/436530096)
Bug Fixes
- Fix bug where adding an already-attached handler or removing an unattached one triggered incorrect lifecycle logic. (I9e47b)
Version 1.0.0-alpha06
August 13, 2025
androidx.navigationevent:navigationevent-*:1.0.0-alpha06 is released. Version 1.0.0-alpha06 contains these commits.
New Features
Passive Listeners API
You can now pass custom contextual information from any navigation host and passively listen to gesture state changes from anywhere in your UI. This enables context-aware animations for predictive back and other gesture-driven navigation.
This feature has two parts:
- Providing Info - Use
NavigationEventInfoto carry custom data. - Consuming State - Use
dispatcher.state(NavigationEventState) to observe gesture progress and context.
NavigationEventCallbacknow exposessetInfo(currentInfo, previousInfo)method to set gesture context in one call (I1d5e7, b/424470518).NavigationEventHandleradds a new overload that acceptscurrentInfoandpreviousInfo, making it the primary API for supplying context in Compose apps (I6ecd3, b/424470518).
Example:
data class MyScreenInfo(val screenName: String) : NavigationEventInfo
NavigationEventHandler(
enabled = true,
currentInfo = MyScreenInfo("Details Screen"),
previousInfo = MyScreenInfo("Home Screen")
) { /* Handle back completion */ }
NavigationEventDispatchernow exposesdispatcher.stateanddispatcher.getState<T>()(If7fae, Ia90ca, b/424470518). TheseStateFlow-based APIs let any UI observe gesture progress and contextual data without handling the event directly.
Example:
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 */ }
}
Add
progressproperty toNavigationEventState(I7b196) that returnslatestEvent.progresswhen in progress, or0Fotherwise:val progress = state.progressAdd
NavigationEventDispatcherOwnercomposable to create, link, and dispose ofNavigationEventDispatcherinstances hierarchically. Enable dynamic control of the dispatcher's enabled state and automatic cleanup.@Composable fun Sample() { NavigationEventDispatcherOwner(enabled = true) { val localDispatcherOwner = LocalNavigationEventDispatcherOwner.current } }
API Changes
- The
isPassthroughparameter has been removed from theNavigationEventCallback. (I99028, b/424470518) NavigationEventStateconstructors are now internal. For testing, update the state (defaults toIdle) via theDirectNavigationEventInputHandler. CallhandleOnStartedorhandleOnProgressedto set state toInProgress, andhandleOnCompletedorhandleOnCancelledto return it toIdle. To updateNavigationEventInfo, useNavigationEventCallback.setInfo. (I93dca, b/424470518)- Added default parameters to
NavigationEventto allow for easier instantiation and to simplify testing which should be used in place ofTestNavigationEvent. (I5dc49, I232f4) - Added a
TestNavigationEventCallbackfor testing navigation events with specific current/previous states. (Idd22e, b/424470518) NavigationEventInputHandlerhas been made into an abstract class to replace the previousAbstractNavigationEventInputHandlerwith an implementation inDirectNavigationEventInputHandler(Iadde5, Ifed40I3897c, b/432616296, b/435416924)- The
send*functions inNavigationEventInputHandlerhave had their prefixes renamed tohandle*. (Iffcaf) OnBackInvokedInputHandlernow extends the newlyabstractNavigationInputHandler. (Ib45aa)- Changed
NavigationEventDispatcherOwnerto require a parent dispatcher where you must explicitly passnullto create a root dispatcher. (Ia6f64, b/431534103)
Bug Fixes
- Improved efficiency by avoiding collection copies in
NavigationEventDispatcher.dispose(). (I4ab09) - Fixed an issue where the
NavigationEventHandlerdid not correctly respond to changes in its enabled state. (Ia5268,I19bec, I5be5c, b/431534103)
Docs Updates
- KDocs for
NavigationEventexpanded to clarify its role as a unified event wrapper and detail property behavior across different navigation types (gestures, clicks). (I91e8d) - Updated documentation for system back handling Compose APIs (
BackHandler,PredictiveBackHandler,NavigationEventHandler) to call out behavior specifically around callback order. (I7ab94, )
Dependency Update
NavigationEventnow depends on Compose Runtime 1.9.0-beta03 which allows thenavigationevent-composeartifact to support all KMP targets. (Ia1b87)
Version 1.0.0-alpha05
July 30, 2025
androidx.navigationevent:navigationevent-*:1.0.0-alpha05 is released. Version 1.0.0-alpha05 contains these commits.
Parent-Child Hierarchy Support:
A NavigationEventDispatcher can now have parent and child dispatchers, forming a hierarchical tree structure. This enables navigation events to propagate and be managed more flexibly across complex Compose UI components by reflecting the UI’s structural hierarchy through chained dispatchers. (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)
The hierarchical isEnabled property allows for top-down control of a dispatcher. When isEnabled is set to false on a dispatcher, it automatically disables all its descendant dispatchers. This feature enables entire branches of the navigation event system to be toggled off efficiently. (I9e985)
// Disabling the child dispatcher disables all its callbacks and any of its children recursively.
childDispatcher.isEnabled = false
Moreover, the isEnabled property on NavigationEventCallback now respects the enabled state of its associated dispatcher. This means a callback is considered enabled only if both the callback itself and its dispatcher (including its ancestors) are enabled, ensuring consistent hierarchical control over callback activation. (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()
A new dispose() method has been introduced for proper cleanup of dispatchers and their children. Calling dispose() stops listeners to prevent memory leaks, recursively disposes all child dispatchers, removes all callbacks registered to the dispatcher, and unlinks it from its parent. This guarantees resources are released correctly when dispatchers are no longer needed. (I9e985)
// Dispose the child dispatcher to clean up resources.
childDispatcher.dispose()
If any public method is called on a disposed dispatcher, an IllegalStateException is thrown immediately. This prevents silent failures and helps developers identify improper usage during development. (Ic2dc3)
val callback2 = TestNavigationEventCallback()
// Attempting to use a disposed dispatcher will throw an exception.
assertThrows<IllegalStateException> {
childDispatcher.addCallback(callback2)
}
Note: We will introduce a new NavigationEventDispatcherOwner Composable that automatically manages a child dispatcher within Compose UI in aosp/3692572. However, this change did not make it into the current release cut and is planned for the next one.
Navigation Testing Library
- Add
navigationevent-testingmodule to provide dedicated testing utilities for thenavigationeventlibrary. (0e50b6) - Add
TestNavigationEventCallbackfake utility class for testing. It records callback method calls and stores receivedNavigationEventitems to support verification. (4a0246) - Add
TestNavigationEventfake utility function to createNavigationEventinstances with default values, simplifying unit tests for navigation event processing. (3b63f5) - Add
TestNavigationEventDispatcherOwnerfake utility class for testing. It tracks fallback and enabled-state-changed event counts to support interaction verification in tests. (c8753e)
API Changes
- Move
NavigationEventInputHandlerfromandroidMaintocommonMainto make it available in KMP common code. Add newpublic send*methods for dispatching events. Change dispatch functions onNavigationEventDispatcherfrompublictointernal; users must now useNavigationEventInputHandlerto send events. (Ia7114) - Rename
NavigationInputHandlertoOnBackInvokedInputHandler. (I63405)
Bug Fixes
- Refactor
NavigationEventDispatcherto reduce overhead by avoiding intermediate list allocations and improving callback dispatch performance. (I82702, I1a9d9) - Add
@FloatRangeannotations totouchX,touchY, andprogressfields inNavigationEventto enforce valid value ranges at compile time and improve API safety. (Iac0ec)
Version 1.0.0-alpha04
July 2, 2025
androidx.navigationevent:navigationevent-*:1.0.0-alpha04 is released. Version 1.0.0-alpha04 contains these commits.
Bug Fixes
- Used
implementedInJetBrainsForktonavigationevent-composeand added acommonStubstarget to match Compose conventions. Change requested by JetBrains. (f60c79) - Fixed application of the Compose compiler plugin for Kotlin/Native to ensure correct stub generation. No impact on public APIs or behavior. (1890c9)
Version 1.0.0-alpha03
June 18, 2025
androidx.navigationevent:navigationevent-*:1.0.0-alpha03 is released. Version 1.0.0-alpha03 contains these commits.
New Features
- Introduced a new
navigationevent-composemodule to support Jetpack Compose features in thenavigationeventlibrary. (980d78) NavigationEventCompose has added a newLocalNavigationEventDispatcherOwnerlocal composition. It returns a nullable value to better determine whether it is available in the current composition.NavigationEventHandlerwill now throw an error if the underlying owner is not found. (62ffda)NavigationEventCompose has added a newNavigationEventHandlerComposable to handle (predictive back gesture) events. It provides aFlowofNavigationEventobjects that must be collected in the suspending lambda you provide 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 Changes
- Each
NavigationEventCallbackcan now be registered with only oneNavigationEventDispatcherat a time; adding it to multiple dispatchers throws anIllegalStateException. Note that this behavior differs fromOnBackPressedDispatcher, which allows multiple dispatchers. (e82c19) - Made
isPassThroughavalto prevent mutation during navigation, which could breakNavigationEvent's dispatching. (I0b287)
Version 1.0.0-alpha02
June 4, 2025
androidx.navigationevent:navigationevent-*:1.0.0-alpha02 is released. Version 1.0.0-alpha02 contains these commits.
API Changes
- Replace
NavigationEventDispatcher's secondary constructor with default arguments. (I716a0) - Remove priority property from
NavigationEventCallback. Pass priority toNavigationEventDispatcher.addCallback()instead. (I13cae)
Bug Fixes
- Fixed a
ConcurrentModificationExceptionthat could occur whenNavigationEventCallback.remove()was called due to simultaneously modifying the internal list of closeables. (b/420919815)
Version 1.0.0-alpha01
May 20, 2025
androidx.navigationevent:navigationevent-*:1.0.0-alpha01 is released. Version 1.0.0-alpha01 contains these commits.
New Features
- The
androidx.navigationeventlibrary provides a KMP-first API for handling system back as well as Predictive Back. TheNavigationEventDispatcherserves as a common APIs for registering one or moreNavigationEventCallbackinstances for receiving system back events. - This layer sits below the previously released APIs in
androidx.activityand aims to be a less opinionated replacement for using the Activity APIs in higher level components or directly using the Android frameworkOnBackInvokedDispatcherAPIs. Theandroidx.activityAPIs have been rewritten on top of the Navigation Event APIs as part of Activity 1.12.0-alpha01.