Para implementar um sistema de navegação robusto, o app precisa de uma maneira centralizada de
processar gestos de retorno e outros indicadores de navegação. Nesta página, descrevemos como
usar o NavigationEventDispatcher para coordenar e distribuir esses
eventos de navegação no aplicativo.
Declarar um NavigationEventDispatcher
O NavigationEventDispatcher é o componente central da biblioteca
NavigationEvent. Ele atua como um hub de eventos que envia
eventos relacionados à navegação, como gestos de voltar e transições de navegação, para
listeners registrados no app. Os componentes podem se inscrever nesses eventos
para reagir a mudanças de navegação ou outras ações de navegação orientadas pelo sistema.
Forneça instâncias de NavigationEventDispatcher usando um
NavigationEventDispatcherOwner. Isso garante que diferentes partes do
app possam acessar o mesmo agente e observar eventos de navegação de maneira consistente
e coordenada.
class MyComponent: NavigationEventDispatcherOwner { override val navigationEventDispatcher: NavigationEventDispatcher = NavigationEventDispatcher() }
Se você estiver em um ComponentActivity, em vez de implementar seu próprio
dispatcher, poderá recuperar o que foi fornecido para você.
class MyCustomActivity : ComponentActivity() { fun addMyHandler() { // navigationEventDispatcher provided by the ComponentActivity navigationEventDispatcher.addHandler(myNavigationEventHandler) } }
Adicionar um NavigationEventInput
Agora que você registrou o gerenciador, está tudo pronto para receber eventos.
No entanto, é necessário fornecer uma origem de onde os eventos são gerados com
NavigationEventInput.
NavigationEventInput é o componente específico da plataforma que recebe
a entrada bruta do sistema e a traduz em um NavigationEvent padrão a ser enviado
ao NavigationEventDispatcher.
O exemplo a seguir é uma implementação personalizada de um 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() } }
Em seguida, forneça essa entrada ao seu agente:
navigationEventDispatcher.addInput(MyInput())
Limpar recursos com dispose()
Para evitar vazamentos de memória em uma IU dinâmica, cada instância
NavigationEventDispatcher criada precisa ser explicitamente removida da
hierarquia usando o método dispose() quando o componente associado a ela é
destruído:
navigationEventDispatcher.dispose()
O método dispose() garante uma limpeza em cascata ao remover iterativamente
o agente de envio e todos os descendentes (filhos e netos),
garantindo que todos os gerenciadores associados sejam cancelados do sistema
compartilhado.
Hierarquia e controle do agente de envio
O NavigationEventDispatcher oferece suporte a uma hierarquia pai-filho, permitindo que
componentes aninhados em uma interface (como NavHosts ou caixas de diálogo aninhadas)
participem do processamento de eventos de navegação.
Criar um agente filho
Um dispatcher filho é criado transmitindo uma referência ao dispatcher pai
durante a construção. Todos os dispatchers em uma hierarquia compartilham o mesmo
NavigationEventProcessor para manter uma ordenação de eventos global
LIFO (último a entrar, primeiro a sair) com base na prioridade.
Ativação hierárquica
O dispatcher inclui uma propriedade isEnabled que permite aos desenvolvedores ativar
ou desativar uma subárvore inteira de gerenciadores de uma só vez.
Quando um dispatcher pai é desativado (isEnabled = false), todos os gerenciadores
associados a ele e aos filhos dele são ignorados, independentemente
do estado de ativação individual.