Cómo configurar un dispatcher

Para implementar un sistema de navegación sólido, tu app necesita una forma centralizada de controlar los gestos 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 de NavigationEvent. Actúa como un centro de eventos que envía eventos relacionados con la navegación, como gestos de retroceso y transiciones de navegación, a los objetos de escucha registrados dentro de 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 diferentes partes de tu app puedan acceder al mismo despachador y observar los eventos de navegación de forma 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)
    }
}

Agrega un NavigationEventInput

Ahora que registraste el controlador, ya puedes recibir eventos. Sin embargo, debes proporcionar una fuente desde la que 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 en un NavigationEvent estándar para enviarla al NavigationEventDispatcher.

En el siguiente ejemplo, se muestra 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 despachador:

navigationEventDispatcher.addInput(MyInput())

Limpia recursos con dispose()

Para evitar fugas de memoria en una IU dinámica, cada instancia de NavigationEventDispatcher creada se debe quitar de forma explícita 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, ya que quita de forma iterativa el despachador y todos sus descendientes (elementos secundarios y nietos), lo que garantiza que todos los controladores asociados se cancelen del sistema compartido.

Jerarquía y control de despachadores

NavigationEventDispatcher admite una jerarquía de elementos superiores y secundarios, lo que permite que los componentes anidados en una IU (como NavHost o diálogos anidados) participen en el control de eventos de navegación.

Crea un despachador secundario

Para crear un despachador secundario, se pasa una referencia a su despachador superior durante la construcción. Todos los despachadores de una jerarquía comparten la misma NavigationEventProcessor para mantener un orden de eventos global de último en entrar, primero en salir (LIFO) según la prioridad.

Habilitación jerárquica

El despachador 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 despachador superior (isEnabled = false), se ignoran todos los controladores asociados con ese superior y cualquiera de sus elementos secundarios, independientemente de su estado habilitado individual.