Configurare un dispatcher

Per implementare un sistema di navigazione efficace, la tua app ha bisogno di un modo centralizzato per gestire i gesti Indietro e altri segnali di navigazione. Questa pagina descrive come utilizzare NavigationEventDispatcher per coordinare e distribuire questi eventi di navigazione nell'applicazione.

Dichiarare un NavigationEventDispatcher

NavigationEventDispatcher è il componente centrale della libreria NavigationEvent. Funge da hub di eventi che invia eventi correlati alla navigazione, come i gesti Indietro e le transizioni di navigazione, ai listener registrati all'interno dell'app. I componenti possono abbonarsi a questi eventi per reagire alle modifiche alla navigazione o ad altre azioni di navigazione basate sul sistema.

Devi fornire istanze di NavigationEventDispatcher tramite un NavigationEventDispatcherOwner. In questo modo, le diverse parti dell'app possono accedere allo stesso dispatcher e osservare gli eventi di navigazione in modo coerente e coordinato.

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

Se ti trovi all'interno di un ComponentActivity, anziché implementare il tuo dispatcher, puoi recuperare quello fornito.

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

Aggiungi una dimensione NavigationEventInput

Ora che hai registrato il gestore, puoi ricevere gli eventi. Tuttavia, devi fornire un'origine da cui vengono generati gli eventi con NavigationEventInput.

NavigationEventInput è il componente specifico della piattaforma che riceve l'input di sistema non elaborato e lo traduce in un NavigationEvent standard da inviare a NavigationEventDispatcher.

L'esempio seguente è un'implementazione personalizzata di 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()
    }
}

Successivamente, fornisci l'input al dispatcher:

navigationEventDispatcher.addInput(MyInput())

Ripulisci le risorse con dispose()

Per evitare perdite di memoria in un'interfaccia utente dinamica, ogni istanza NavigationEventDispatcher creata deve essere rimossa esplicitamente dalla gerarchia utilizzando il metodo dispose() quando il componente a cui è associata viene eliminato:

navigationEventDispatcher.dispose()

Il metodo dispose() garantisce una pulizia a cascata rimuovendo in modo iterativo il dispatcher e tutti i relativi discendenti (figli e nipoti), garantendo che tutti gli intent associati vengano annullati dalla registrazione dal sistema condiviso.

Gerarchia e controllo del dispatcher

NavigationEventDispatcher supporta una gerarchia padre-figlio, consentendo ai componenti nidificati in profondità all'interno di un'interfaccia utente (come NavHost o dialoghi nidificati) di partecipare alla gestione degli eventi di navigazione.

Crea un dispatcher secondario

Un dispatcher secondario viene creato passando un riferimento al dispatcher principale durante la costruzione. Tutti i dispatcher di una gerarchia condividono lo stesso NavigationEventProcessor per mantenere un ordinamento globale degli eventi Last-In, First-Out (LIFO) in base alla priorità.

Abilitazione gerarchica

Il dispatcher include una proprietà isEnabled che consente agli sviluppatori di attivare o disattivare contemporaneamente un intero sottoalbero di gestori.

Quando un dispatcher principale è disattivato (isEnabled = false), tutti i gestori associati a questo dispatcher e a uno qualsiasi dei suoi dispatcher secondari verranno ignorati, indipendentemente dal loro stato di attivazione individuale.