Как настроить диспетчера

Чтобы реализовать надежную систему навигации, приложению нужен централизованный способ обработки жестов "Назад" и других сигналов навигации. На этой странице рассказывается, как использовать 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), все обработчики, связанные с ним и его дочерними элементами, будут игнорироваться независимо от их индивидуального состояния.