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.