navigationevent

  
Die Navigation Event-Bibliothek bietet eine KMP-basierte API für die Verarbeitung von System-Zurück-Vorgängen sowie Predictive Back.
Letzte Aktualisierung Stabile Version Releasekandidat Beta-Ausgabe Alpharelease
13. August 2025 - - 1.0.0-alpha06

Abhängigkeiten deklarieren

Wenn Sie eine Abhängigkeit von „navigationevent“ hinzufügen möchten, müssen Sie Ihrem Projekt das Google Maven-Repository hinzufügen. Weitere Informationen finden Sie im Maven-Repository von Google.

Fügen Sie der Datei build.gradle für Ihre App oder Ihr Modul die Abhängigkeiten für die benötigten Artefakte hinzu:

Groovy

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

Kotlin

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

Weitere Informationen zu Abhängigkeiten finden Sie unter Build-Abhängigkeiten hinzufügen.

Feedback

Ihr Feedback hilft uns, Jetpack zu verbessern. Lassen Sie es uns wissen, wenn Sie neue Probleme entdecken oder Ideen zur Verbesserung dieser Bibliothek haben. Sehen Sie sich die vorhandenen Probleme in dieser Bibliothek an, bevor Sie ein neues erstellen. Sie können für ein vorhandenes Problem abstimmen, indem Sie auf die Schaltfläche mit dem Stern klicken.

Neues Problem erstellen

Weitere Informationen finden Sie in der Dokumentation zur Problemverfolgung.

Für dieses Artefakt gibt es keine Versionshinweise.

Version 1.0

Version 1.0.0-alpha06

13. August 2025

androidx.navigationevent:navigationevent-*:1.0.0-alpha06 wird veröffentlicht. Version 1.0.0-alpha06 enthält diese Commits.

Neue Funktionen

Passive Listeners API

Sie können jetzt benutzerdefinierte Kontextinformationen von einem beliebigen Navigationshost übergeben und passiv auf Änderungen des Gestenstatus an einer beliebigen Stelle in der Benutzeroberfläche warten. So werden kontextbezogene Animationen für die intelligente „Zurück“-Touchgeste und andere gestengesteuerte Navigationsfunktionen ermöglicht.

Diese Funktion besteht aus zwei Teilen:

  1. Informationen bereitstellen: Verwenden Sie NavigationEventInfo, um benutzerdefinierte Daten zu übertragen.
  2. Consuming State: Verwenden Sie dispatcher.state (NavigationEventState), um den Fortschritt und Kontext der Geste zu beobachten.
  • NavigationEventCallback bietet jetzt die Methode setInfo(currentInfo, previousInfo) zum Festlegen des Kontextes für Gesten in einem Aufruf (I1d5e7, b/424470518).
  • Mit NavigationEventHandler wird eine neue Überladung hinzugefügt, die currentInfo und previousInfo akzeptiert. Damit ist sie die primäre API zum Bereitstellen von Kontext in Compose-Apps (I6ecd3, b/424470518).

Beispiel:

  data class MyScreenInfo(val screenName: String) : NavigationEventInfo

  NavigationEventHandler(
      enabled = true,
      currentInfo = MyScreenInfo("Details Screen"),
      previousInfo = MyScreenInfo("Home Screen")
  ) { /* Handle back completion */ }
  • NavigationEventDispatcher stellt jetzt dispatcher.state und dispatcher.getState<T>() bereit (If7fae, Ia90ca, b/424470518). Mit diesen StateFlow-basierten APIs kann jede Benutzeroberfläche den Fortschritt von Gesten und Kontextdaten beobachten, ohne das Ereignis direkt zu verarbeiten.

Beispiel:

  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 */ }
  }
  • Fügen Sie das Attribut progress zu NavigationEventState (I7b196) hinzu, das bei laufender Aktion latestEvent.progress und ansonsten 0F zurückgibt:

    val progress = state.progress
    
  • Fügen Sie die zusammensetzbare Funktion NavigationEventDispatcherOwner hinzu, um NavigationEventDispatcher-Instanzen hierarchisch zu erstellen, zu verknüpfen und zu verwerfen. Aktivieren Sie die dynamische Steuerung des aktivierten Status des Dispatchers und die automatische Bereinigung.

    @Composable
    fun Sample() {
        NavigationEventDispatcherOwner(enabled = true) {
            val localDispatcherOwner = LocalNavigationEventDispatcherOwner.current
        }
    }
    

API-Änderungen

  • Der Parameter isPassthrough wurde aus NavigationEventCallback entfernt. (I99028, b/424470518)
  • NavigationEventState-Konstruktoren sind jetzt intern. Aktualisieren Sie für Tests den Status (Standardwert ist Idle) über die DirectNavigationEventInputHandler. Rufen Sie handleOnStarted oder handleOnProgressed auf, um den Status auf InProgress festzulegen, und handleOnCompleted oder handleOnCancelled, um ihn auf Idle zurückzusetzen. Verwenden Sie NavigationEventCallback.setInfo, um NavigationEventInfo zu aktualisieren. (I93dca, b/424470518)
  • NavigationEvent wurden Standardparameter hinzugefügt, um die Instanziierung zu vereinfachen und Tests zu vereinfachen, die anstelle von TestNavigationEvent verwendet werden sollten. (I5dc49, I232f4)
  • Es wurde ein TestNavigationEventCallback zum Testen von Navigationsereignissen mit bestimmten aktuellen/vorherigen Status hinzugefügt. (Idd22e, b/424470518)
  • NavigationEventInputHandler wurde in eine abstrakte Klasse umgewandelt, um die vorherige AbstractNavigationEventInputHandler durch eine Implementierung in DirectNavigationEventInputHandler zu ersetzen (Iadde5, Ifed40I3897c, b/432616296, b/435416924)
  • Die Präfixe der send*-Funktionen in NavigationEventInputHandler wurden in handle* umbenannt. (Iffcaf)
  • OnBackInvokedInputHandler wird jetzt auf die neu abstract NavigationInputHandler erweitert. (Ib45aa)
  • Für NavigationEventDispatcherOwner ist jetzt ein übergeordneter Dispatcher erforderlich. Sie müssen null explizit übergeben, um einen Root-Dispatcher zu erstellen. (Ia6f64, b/431534103)

Fehlerkorrekturen

  • Verbesserte Effizienz durch Vermeidung von Sammlungskopien in NavigationEventDispatcher.dispose(). (I4ab09)
  • Ein Problem wurde behoben, bei dem NavigationEventHandler nicht richtig auf Änderungen des Aktivierungsstatus reagierte. (Ia5268,I19bec, I5be5c, b/431534103)

Docs-Updates

  • Die KDocs für NavigationEvent wurden erweitert, um die Rolle als einheitlicher Ereignis-Wrapper und das Verhalten von Detail-Properties bei verschiedenen Navigationstypen (Gesten, Klicks) zu verdeutlichen. (I91e8d)
  • Die Dokumentation für die Compose-APIs für die Verarbeitung von Systemrückgaben (BackHandler, PredictiveBackHandler, NavigationEventHandler) wurde aktualisiert, um das Verhalten speziell in Bezug auf die Reihenfolge der Callbacks zu beschreiben. (I7ab94, )

Abhängigkeitsupdate

  • NavigationEvent hängt jetzt von Compose Runtime 1.9.0-beta03 ab, wodurch das navigationevent-compose-Artefakt alle KMP-Ziele unterstützt. (Ia1b87)

Version 1.0.0-alpha05

30. Juli 2025

androidx.navigationevent:navigationevent-*:1.0.0-alpha05 wird veröffentlicht. Version 1.0.0-alpha05 enthält diese Commits.

Unterstützung von Über- und Untergeordneten-Hierarchien:

Ein NavigationEventDispatcher kann jetzt übergeordnete und untergeordnete Dispatcher haben, wodurch eine hierarchische Baumstruktur entsteht. So können Navigationsereignisse flexibler über komplexe Compose-UI-Komponenten hinweg weitergegeben und verwaltet werden, indem die strukturelle Hierarchie der Benutzeroberfläche durch verkettete Dispatcher abgebildet wird. (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)

Mit dem hierarchischen Attribut isEnabled lässt sich ein Dispatcher von oben nach unten steuern. Wenn isEnabled für einen Dispatcher auf false gesetzt ist, werden alle untergeordneten Dispatcher automatisch deaktiviert. Mit dieser Funktion lassen sich ganze Zweige des Navigationsereignissystems effizient deaktivieren. (I9e985)

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

Außerdem wird bei der isEnabled-Property für NavigationEventCallback jetzt der aktivierte Status des zugehörigen Dispatchers berücksichtigt. Das bedeutet, dass ein Callback nur dann als aktiviert gilt, wenn sowohl der Callback selbst als auch sein Dispatcher (einschließlich seiner übergeordneten Elemente) aktiviert sind. So wird eine konsistente hierarchische Steuerung der Callback-Aktivierung gewährleistet. (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()

Es wurde eine neue dispose()-Methode eingeführt, um Dispatcher und ihre untergeordneten Elemente richtig zu bereinigen. Durch Aufrufen von dispose() werden Listener beendet, um Speicherlecks zu verhindern. Außerdem werden alle untergeordneten Dispatcher rekursiv verworfen, alle für den Dispatcher registrierten Callbacks entfernt und die Verknüpfung mit dem übergeordneten Element aufgehoben. So wird sichergestellt, dass Ressourcen korrekt freigegeben werden, wenn Dispatcher nicht mehr benötigt werden. (I9e985)

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

Wenn eine öffentliche Methode für einen verworfenen Dispatcher aufgerufen wird, wird sofort eine IllegalStateException ausgelöst. So werden stille Fehler verhindert und Entwickler können eine unsachgemäße Verwendung während der Entwicklung erkennen. (Ic2dc3)

  val callback2 = TestNavigationEventCallback()

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

Hinweis:Wir führen eine neue NavigationEventDispatcherOwner-Composable ein, die automatisch einen untergeordneten Dispatcher in der Compose-Benutzeroberfläche in aosp/3692572 verwaltet. Diese Änderung wurde jedoch nicht in den aktuellen Release aufgenommen und ist für den nächsten geplant.

Navigation Testing Library

  • Fügen Sie das navigationevent-testing-Modul hinzu, um spezielle Testdienstprogramme für die navigationevent-Bibliothek bereitzustellen. (0e50b6)
  • Fügen Sie TestNavigationEventCallback als gefälschte Utility-Klasse zum Testen hinzu. Es werden Aufrufe von Callback-Methoden aufgezeichnet und empfangene NavigationEvent-Elemente zur Unterstützung der Bestätigung gespeichert. (4a0246)
  • Fügen Sie die TestNavigationEvent-Fake-Hilfsfunktion hinzu, um NavigationEvent-Instanzen mit Standardwerten zu erstellen. Dadurch werden Unittests für die Verarbeitung von Navigationsereignissen vereinfacht. (3b63f5)
  • Fügen Sie TestNavigationEventDispatcherOwner als gefälschte Utility-Klasse zum Testen hinzu. Es werden Fallback- und Ereigniszahlen für den geänderten Aktivierungsstatus erfasst, um die Interaktionsüberprüfung in Tests zu unterstützen. (c8753e)

API-Änderungen

  • Verschieben Sie NavigationEventInputHandler von androidMain nach commonMain, damit es im gemeinsamen KMP-Code verfügbar ist. Neue public send*-Methoden zum Senden von Ereignissen hinzufügen Ändern Sie die Dispatch-Funktionen in NavigationEventDispatcher von public zu internal. Nutzer müssen jetzt NavigationEventInputHandler verwenden, um Ereignisse zu senden. (Ia7114)
  • Benennen Sie NavigationInputHandler in OnBackInvokedInputHandler um. (I63405)

Fehlerkorrekturen

  • Refaktorieren Sie NavigationEventDispatcher, um den Overhead zu reduzieren, indem Sie die Zuweisung von Zwischenlisten vermeiden und die Leistung des Callback-Dispatching verbessern. (I82702, I1a9d9)
  • Fügen Sie @FloatRange-Annotationen zu den Feldern touchX, touchY und progress in NavigationEvent hinzu, um gültige Wertebereiche zur Kompilierzeit zu erzwingen und die API-Sicherheit zu verbessern. (Iac0ec)

Version 1.0.0-alpha04

2. Juli 2025

androidx.navigationevent:navigationevent-*:1.0.0-alpha04 wird veröffentlicht. Version 1.0.0-alpha04 enthält diese Commits.

Fehlerkorrekturen

  • implementedInJetBrainsFork wurde für navigationevent-compose verwendet und ein commonStubs-Ziel wurde hinzugefügt, um den Compose-Konventionen zu entsprechen. Die Änderung wurde von JetBrains angefordert. (f60c79)
  • Die Anwendung des Compose-Compiler-Plug-ins für Kotlin/Native wurde korrigiert, um die korrekte Stub-Generierung zu gewährleisten. Es gibt keine Auswirkungen auf öffentliche APIs oder das Verhalten. (1890c9)

Version 1.0.0-alpha03

18. Juni 2025

androidx.navigationevent:navigationevent-*:1.0.0-alpha03 wird veröffentlicht. Version 1.0.0-alpha03 enthält diese Commits.

Neue Funktionen

  • Es wurde ein neues navigationevent-compose-Modul eingeführt, um Jetpack Compose-Funktionen in der navigationevent-Bibliothek zu unterstützen. (980d78)
  • NavigationEvent Compose hat eine neue lokale Komposition LocalNavigationEventDispatcherOwner hinzugefügt. Es wird ein Nullable-Wert zurückgegeben, um besser feststellen zu können, ob er in der aktuellen Komposition verfügbar ist. NavigationEventHandler gibt jetzt einen Fehler aus, wenn der zugrunde liegende Eigentümer nicht gefunden wird. (62ffda)
  • NavigationEvent Compose hat ein neues NavigationEventHandler-Composable hinzugefügt, um Ereignisse für die vorhersagende Zurück-Geste zu verarbeiten. Es enthält ein Flow von NavigationEvent-Objekten, die in der von Ihnen bereitgestellten Lambda-Funktion für die Sperrung erfasst werden müssen 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-Änderungen

  • Jeder NavigationEventCallback kann jetzt nur bei einem NavigationEventDispatcher gleichzeitig registriert werden. Wenn er mehreren Dispatchern hinzugefügt wird, wird ein IllegalStateException ausgegeben. Dieses Verhalten unterscheidet sich von OnBackPressedDispatcher, das mehrere Dispatcher zulässt. (e82c19)
  • isPassThrough wurde zu einem val gemacht, um Mutationen während der Navigation zu verhindern, die die Weiterleitung von NavigationEvent unterbrechen könnten. (I0b287)

Version 1.0.0-alpha02

4. Juni 2025

androidx.navigationevent:navigationevent-*:1.0.0-alpha02 wird veröffentlicht. Version 1.0.0-alpha02 enthält diese Commits.

API-Änderungen

  • Ersetzen Sie den sekundären Konstruktor von NavigationEventDispatcher durch Standardargumente. (I716a0)
  • Entfernen Sie die Prioritätseigenschaft aus NavigationEventCallback. Übergeben Sie die Priorität stattdessen an NavigationEventDispatcher.addCallback(). (I13cae)

Fehlerkorrekturen

  • Ein ConcurrentModificationException wurde behoben, das auftreten konnte, wenn NavigationEventCallback.remove() aufgerufen wurde, weil die interne Liste der Closeables gleichzeitig geändert wurde. (b/420919815)

Version 1.0.0-alpha01

20. Mai 2025

androidx.navigationevent:navigationevent-*:1.0.0-alpha01 wird veröffentlicht. Version 1.0.0-alpha01 enthält diese Commits.

Neue Funktionen

  • Die androidx.navigationevent-Bibliothek bietet eine KMP-First-API für die Verarbeitung von System-Back-Vorgängen sowie Predictive Back. Die NavigationEventDispatcher dient als gemeinsame API zum Registrieren einer oder mehrerer NavigationEventCallback-Instanzen für den Empfang von System-Back-Events.
  • Diese Ebene liegt unter den zuvor veröffentlichten APIs in androidx.activity und soll ein weniger meinungsbezogener Ersatz für die Verwendung der Activity APIs in Komponenten höherer Ebene oder die direkte Verwendung der OnBackInvokedDispatcher-APIs des Android-Frameworks sein. Die androidx.activity APIs wurden im Rahmen von Activity 1.12.0-alpha01 auf Basis der Navigation Event APIs neu geschrieben.