Dispatcher einrichten

Für ein robustes Navigationssystem muss Ihre App eine zentrale Möglichkeit haben, Rückwärtsgesten und andere Navigationssignale zu verarbeiten. Auf dieser Seite wird beschrieben, wie Sie NavigationEventDispatcher verwenden, um diese Navigationsereignisse in Ihrer Anwendung zu koordinieren und zu verteilen.

NavigationEventDispatcher deklarieren

Die NavigationEventDispatcher ist die zentrale Komponente der NavigationEvent-Bibliothek. Sie fungiert als Ereignis-Hub, der navigationsbezogene Ereignisse wie Zurück-Gesten und Navigationsübergänge an registrierte Listener in Ihrer App weiterleitet. 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 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 rohe Systemeingaben empfängt und in einen Standard-NavigationEvent übersetzt, der an NavigationEventDispatcher gesendet wird.

Das folgende Beispiel zeigt eine benutzerdefinierte Implementierung eines NavigationEventInput-Objekts:

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 Ihren Dispatcher weiter:

navigationEventDispatcher.addInput(MyInput())

Ressourcen mit dispose() bereinigen

Um Speicherlecks in einer dynamischen Benutzeroberfläche zu vermeiden, muss jede erstellte NavigationEventDispatcher-Instanz explizit aus der Hierarchie entfernt werden. Verwenden Sie dazu die Methode dispose(), wenn die Komponente, an die sie gebunden ist, zerstört wird:

navigationEventDispatcher.dispose()

Die Methode dispose() sorgt für eine kaskadierende Bereinigung, indem der Dispatcher und alle seine untergeordneten Elemente (Kinder und Enkelkinder) iterativ entfernt werden. So wird sichergestellt, dass alle zugehörigen Handler aus dem freigegebenen System abgemeldet werden.

Dispatcher-Hierarchie und ‑Steuerung

Die NavigationEventDispatcher unterstützt eine Über- und Unterordnungsstruktur, 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 Konstruktion eine Referenz an den übergeordneten Dispatcher übergeben wird. Alle Dispatcher in einer Hierarchie verwenden denselben NavigationEventProcessor, um eine globale LIFO-Reihenfolge (Last-In, First-Out) für Ereignisse basierend auf der Priorität beizubehalten.

Hierarchische Aktivierung

Der Dispatcher enthält die Eigenschaft isEnabled, mit der Entwickler einen gesamten Unterbaum von Handlern gleichzeitig aktivieren oder deaktivieren können.

Wenn ein übergeordneter Dispatcher deaktiviert ist (isEnabled = false), werden alle Handler, die mit diesem übergeordneten Dispatcher und seinen untergeordneten Elementen verknüpft sind, ignoriert, unabhängig von ihrem individuellen Aktivierungsstatus.