Configurer un coordinateur

Pour implémenter un système de navigation robuste, votre application a besoin d'un moyen centralisé de gérer les gestes de retour et les autres signaux de navigation. Cette page explique comment utiliser NavigationEventDispatcher pour coordonner et distribuer ces événements de navigation dans votre application.

Déclarer un NavigationEventDispatcher

NavigationEventDispatcher est le composant central de la bibliothèque NavigationEvent. Il sert de hub d'événements qui distribue les événements liés à la navigation, tels que les gestes de retour et les transitions de navigation, aux écouteurs enregistrés dans votre application. Les composants peuvent s'abonner à ces événements pour réagir aux changements de navigation ou à d'autres actions de navigation déclenchées par le système.

Vous devez fournir des instances NavigationEventDispatcher via un NavigationEventDispatcherOwner. Cela garantit que différentes parties de votre application peuvent accéder au même répartiteur et observer les événements de navigation de manière cohérente et coordonnée.

class MyComponent: NavigationEventDispatcherOwner {
    override val navigationEventDispatcher: NavigationEventDispatcher =
        NavigationEventDispatcher()
}

Si vous vous trouvez dans un ComponentActivity, au lieu d'implémenter votre propre répartiteur, vous pouvez récupérer celui qui vous est fourni.

class MyCustomActivity : ComponentActivity() {
    fun addMyHandler() {
        // navigationEventDispatcher provided by the ComponentActivity
        navigationEventDispatcher.addHandler(myNavigationEventHandler)
    }
}

Ajouter : NavigationEventInput

Maintenant que vous avez enregistré le gestionnaire, vous êtes prêt à recevoir des événements. Toutefois, vous devez fournir une source à partir de laquelle les événements sont générés avec NavigationEventInput.

NavigationEventInput est le composant spécifique à la plate-forme qui reçoit les entrées système brutes et les traduit en NavigationEvent standard à envoyer à NavigationEventDispatcher.

L'exemple suivant est une implémentation personnalisée d'un 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()
    }
}

Ensuite, fournissez cette entrée à votre répartiteur :

navigationEventDispatcher.addInput(MyInput())

Nettoyer les ressources avec dispose()

Pour éviter les fuites de mémoire dans une UI dynamique, chaque instance NavigationEventDispatcher créée doit être explicitement supprimée de la hiérarchie à l'aide de la méthode dispose() lorsque le composant auquel elle est liée est détruit :

navigationEventDispatcher.dispose()

La méthode dispose() assure un nettoyage en cascade en supprimant de manière itérative le répartiteur et tous ses descendants (enfants et petits-enfants), garantissant que tous les gestionnaires associés sont désenregistrés du système partagé.

Hiérarchie et contrôle des répartiteurs

NavigationEventDispatcher est compatible avec une hiérarchie parent-enfant, ce qui permet aux composants imbriqués en profondeur dans une UI (tels que les NavHost ou les boîtes de dialogue imbriqués) de participer à la gestion des événements de navigation.

Créer un coordinateur enfant

Un répartiteur enfant est créé en transmettant une référence à son répartiteur parent lors de la construction. Tous les répartiteurs d'une hiérarchie partagent le même NavigationEventProcessor pour maintenir un ordre d'événements dernier entré, premier sorti (LIFO) global basé sur la priorité.

Activation hiérarchique

Le répartiteur inclut une propriété isEnabled qui permet aux développeurs d'activer ou de désactiver simultanément un sous-arbre entier de gestionnaires.

Lorsqu'un répartiteur parent est désactivé (isEnabled = false), tous les gestionnaires associés à ce parent et à l'un de ses enfants sont ignorés, quel que soit leur état d'activation individuel.