Cómo configurar un dispatcher

Para implementar un sistema de navegación sólido, tu app necesita una forma centralizada de controlar los gestos de atrás y otros indicadores de navegación. En esta página, se describe cómo usar NavigationEventDispatcher para coordinar y distribuir estos eventos de navegación en tu aplicación.

Declara un NavigationEventDispatcher

NavigationEventDispatcher es el componente central de la biblioteca NavigationEvent. Actúa como un centro de eventos que envía eventos relacionados con la navegación, como gestos de atrás y transiciones de navegación, a los listeners registrados en tu app. Los componentes pueden suscribirse a estos eventos para reaccionar a los cambios de navegación o a otras acciones de navegación controladas por el sistema.

Debes proporcionar instancias de NavigationEventDispatcher a través de un NavigationEventDispatcherOwner. Esto garantiza que las diferentes partes de tu app puedan acceder al mismo dispatcher y observar los eventos de navegación de una manera coherente y coordinada.

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

Si estás dentro de un ComponentActivity, en lugar de implementar tu propio despachador, puedes recuperar el que se te proporciona.

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

Agregar NavigationEventInput

Ahora que registraste el controlador, ya puedes recibir eventos. Sin embargo, debes proporcionar una fuente desde la cual se generen los eventos con NavigationEventInput.

NavigationEventInput es el componente específico de la plataforma que recibe la entrada sin procesar del sistema y la traduce a un NavigationEvent estándar para enviarlo al NavigationEventDispatcher.

El siguiente ejemplo es una implementación personalizada de 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()
    }
}

A continuación, proporciona esa entrada a tu dispatcher:

navigationEventDispatcher.addInput(MyInput())

Limpia los recursos con dispose()

Para evitar pérdidas de memoria en una IU dinámica, cada instancia de NavigationEventDispatcher creada debe quitarse explícitamente de la jerarquía con el método dispose() cuando se destruye el componente al que está vinculada:

navigationEventDispatcher.dispose()

El método dispose() garantiza una limpieza en cascada quitando de forma iterativa el dispatcher y todos sus descendientes (hijos y nietos), lo que garantiza que todos los controladores asociados se anulen del sistema compartido.

Jerarquía y control del despachador

El NavigationEventDispatcher admite una jerarquía principal-secundaria, lo que permite que los componentes anidados en lo profundo de una IU (como los NavHosts o los diálogos anidados) participen en el control de eventos de navegación.

Crea un dispatcher secundario

Se crea un dispatcher secundario pasando una referencia a su dispatcher principal durante la construcción. Todos los despachadores de una jerarquía comparten el mismo NavigationEventProcessor para mantener un orden global de eventos último en entrar, primero en salir (LIFO) según la prioridad.

Habilitación jerárquica

El dispatcher incluye una propiedad isEnabled que permite a los desarrolladores habilitar o inhabilitar un subárbol completo de controladores a la vez.

Cuando se inhabilita un dispatcher principal (isEnabled = false), se ignorarán todos los controladores asociados con ese dispatcher principal y cualquiera de sus secundarios, independientemente de su estado habilitado individual.