Настройте диспетчера

Для реализации надежной системы навигации вашему приложению необходим централизованный способ обработки жестов «назад» и других навигационных сигналов. На этой странице описано, как использовать NavigationEventDispatcher для координации и распределения этих навигационных событий по всему приложению.

Объявите диспетчер NavigationEventDispatcher .

Компонент NavigationEventDispatcher является центральным элементом библиотеки NavigationEvent . Он выступает в качестве центра обработки событий, который отправляет события, связанные с навигацией, такие как жесты возврата и переходы между страницами навигации, зарегистрированным слушателям в вашем приложении. Компоненты могут подписываться на эти события, чтобы реагировать на изменения навигации или другие действия навигации, управляемые системой.

Экземпляры NavigationEventDispatcher следует предоставлять через NavigationEventDispatcherOwner . Это гарантирует, что различные части вашего приложения смогут обращаться к одному и тому же диспетчеру и отслеживать события навигации согласованным и скоординированным образом.

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

Если вы находитесь внутри ComponentActivity , вместо реализации собственного диспетчера вы можете получить доступ к предоставленному вам диспетчеру.

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

Добавьте NavigationEventInput

Теперь, когда вы зарегистрировали обработчик, вы готовы получать события. Однако вам необходимо указать источник, из которого будут генерироваться события, с помощью NavigationEventInput .

NavigationEventInput — это платформоспецифичный компонент, который получает необработанные системные данные и преобразует их в стандартное NavigationEvent для отправки в NavigationEventDispatcher .

В следующем примере представлена ​​пользовательская реализация элемента 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()
    }
}

Далее передайте эти данные диспетчеру:

navigationEventDispatcher.addInput(MyInput())

Очистка ресурсов с помощью dispose()

Чтобы предотвратить утечки памяти в динамическом пользовательском интерфейсе, каждый созданный экземпляр NavigationEventDispatcher должен быть явно удален из иерархии с помощью метода dispose() при уничтожении компонента, к которому он привязан:

navigationEventDispatcher.dispose()

Метод dispose() обеспечивает каскадную очистку путем итеративного удаления диспетчера и всех его потомков (дочерних и внучатых элементов), гарантируя, что все связанные обработчики будут отменены в общей системе.

Иерархия и управление диспетчером

Компонент NavigationEventDispatcher поддерживает иерархию «родитель-потомок», позволяя компонентам, вложенным глубоко в пользовательский интерфейс (например, вложенным NavHost или диалоговым окнам), участвовать в обработке событий навигации.

Создать дочерний диспетчер

Дочерний диспетчер создается путем передачи ссылки на родительский диспетчер во время его построения. Все диспетчеры в иерархии используют один и тот же NavigationEventProcessor для поддержания глобального порядка обработки событий по принципу «последний вошел — первый вышел» (LIFO) на основе приоритета.

Иерархическое обеспечение

Диспетчер включает свойство isEnabled , которое позволяет разработчикам включать или отключать сразу все поддерево обработчиков.

Когда родительский диспетчер отключен ( isEnabled = false ), все обработчики, связанные с этим родительским диспетчером и любыми его дочерними элементами, будут игнорироваться независимо от их индивидуального состояния включения.