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