Für ein robustes Navigationssystem benötigt Ihre App eine zentrale Möglichkeit, „Zurück“-Gesten und andere Navigationssignale zu verarbeiten. Auf dieser Seite wird beschrieben, wie Sie mit NavigationEventDispatcher diese Navigationsereignisse in Ihrer Anwendung koordinieren und verteilen.
NavigationEventDispatcher deklarieren
Der NavigationEventDispatcher ist die zentrale Komponente der NavigationEvent-Bibliothek. Er fungiert als Ereignis-Hub, der navigationsbezogene Ereignisse wie Zurück-Gesten und Navigationsübergänge an registrierte Listener in Ihrer App sendet. Komponenten können diese Ereignisse abonnieren, um auf Navigationsänderungen oder andere systemgesteuerte Navigationsaktionen zu reagieren.
Sie sollten NavigationEventDispatcher-Instanzen über eine NavigationEventDispatcherOwner bereitstellen. So können verschiedene Teile Ihrer App auf denselben Dispatcher zugreifen und Navigationsereignisse auf konsistente und koordinierte Weise beobachten.
class MyComponent: NavigationEventDispatcherOwner { override val navigationEventDispatcher: NavigationEventDispatcher = NavigationEventDispatcher() }
Wenn Sie sich in einem ComponentActivity befinden, können Sie den für Sie bereitgestellten Dispatcher abrufen, anstatt einen eigenen zu implementieren.
class MyCustomActivity : ComponentActivity() { fun addMyHandler() { // navigationEventDispatcher provided by the ComponentActivity navigationEventDispatcher.addHandler(myNavigationEventHandler) } }
NavigationEventInput hinzufügen
Nachdem Sie den Handler registriert haben, können Sie Ereignisse empfangen.
Sie müssen jedoch eine Quelle angeben, aus der die Ereignisse mit NavigationEventInput generiert werden.
NavigationEventInput ist die plattformspezifische Komponente, die die Rohsystemeingabe empfängt und in ein Standard-NavigationEvent übersetzt, das an den NavigationEventDispatcher gesendet wird.
Das folgende Beispiel ist eine benutzerdefinierte Implementierung eines NavigationEventInput:
public class MyInput : NavigationEventInput() { @MainThread public fun backStarted(event: NavigationEvent) { dispatchOnBackStarted(event) } @MainThread public fun backProgressed(event: NavigationEvent) { dispatchOnBackProgressed(event) } @MainThread public fun backCancelled() { dispatchOnBackCancelled() } @MainThread public fun backCompleted() { dispatchOnBackCompleted() } }
Geben Sie diese Eingabe als Nächstes an den Dispatcher weiter:
navigationEventDispatcher.addInput(MyInput())
Ressourcen mit dispose() bereinigen
Um Speicherlecks in einer dynamischen Benutzeroberfläche zu vermeiden, muss jede erstellte NavigationEventDispatcher-Instanz explizit mit der Methode dispose() aus der Hierarchie entfernt werden, wenn die Komponente, an die sie gebunden ist, gelöscht wird:
navigationEventDispatcher.dispose()
Die Methode dispose() sorgt für eine kaskadierende Bereinigung, indem der Dispatcher und alle seine Nachfolger (untergeordnete und untergeordnete Elemente) iterativ entfernt werden. So wird sichergestellt, dass alle zugehörigen Handler vom freigegebenen System abgemeldet werden.
Dispatcher-Hierarchie und -Steuerung
NavigationEventDispatcher unterstützt eine über- und untergeordnete Hierarchie, sodass Komponenten, die tief in einer Benutzeroberfläche verschachtelt sind (z. B. verschachtelte NavHosts oder Dialogfelder), an der Verarbeitung von Navigationsereignissen teilnehmen können.
Untergeordneten Dispatcher erstellen
Ein untergeordneter Dispatcher wird erstellt, indem während der Erstellung ein Verweis auf den übergeordneten Dispatcher übergeben wird. Alle Dispatcher in einer Hierarchie verwenden dieselbe NavigationEventProcessor, um eine globale LIFO-Ereignisreihenfolge (Last-In, First-Out) basierend auf der Priorität beizubehalten.
Hierarchische Aktivierung
Der Dispatcher enthält ein isEnabled-Attribut, mit dem Entwickler einen gesamten Unterbaum von Handlern auf einmal aktivieren oder deaktivieren können.
Wenn ein übergeordneter Dispatcher deaktiviert ist (isEnabled = false), werden alle Handler, die mit diesem übergeordneten Dispatcher und seinen untergeordneten Dispatchern verknüpft sind, ignoriert, unabhängig von ihrem individuellen Aktivierungsstatus.