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