강력한 탐색 시스템을 구현하려면 앱에 뒤로 동작과 기타 탐색 신호를 처리하는 중앙 집중식 방법이 필요합니다. 이 페이지에서는 NavigationEventDispatcher를 사용하여 애플리케이션 전반에서 이러한 탐색 이벤트를 조정하고 분배하는 방법을 설명합니다.
NavigationEventDispatcher 선언
NavigationEventDispatcher은 NavigationEvent 라이브러리의 중심 구성요소입니다. 뒤로 동작 및 탐색 전환과 같은 탐색 관련 이벤트를 앱 내에 등록된 리스너에게 디스패치하는 이벤트 허브 역할을 합니다. 구성요소는 이러한 이벤트를 구독하여 탐색 변경사항이나 기타 시스템 기반 탐색 작업에 반응할 수 있습니다.
NavigationEventDispatcherOwner를 통해 NavigationEventDispatcher 인스턴스를 제공해야 합니다. 이렇게 하면 앱의 여러 부분에서 동일한 디스패처에 액세스하고 일관되고 조정된 방식으로 탐색 이벤트를 관찰할 수 있습니다.
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는 원시 시스템 입력을 수신하고 이를 NavigationEventDispatcher에 전송할 표준 NavigationEvent로 변환하는 플랫폼별 구성요소입니다.
다음은 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()로 리소스 정리
동적 UI에서 메모리 누수를 방지하려면 생성된 모든 NavigationEventDispatcher 인스턴스가 연결된 구성요소가 소멸될 때 dispose() 메서드를 사용하여 계층 구조에서 명시적으로 삭제되어야 합니다.
navigationEventDispatcher.dispose()
dispose() 메서드는 디스패처와 모든 하위 요소 (자식 및 손자)를 반복적으로 삭제하여 연속 정리를 보장하고, 연결된 모든 핸들러가 공유 시스템에서 등록 취소되도록 보장합니다.
디스패처 계층 구조 및 제어
NavigationEventDispatcher는 상위-하위 계층 구조를 지원하므로 UI 내에 깊이 중첩된 구성요소 (예: 중첩된 NavHost 또는 대화상자)가 탐색 이벤트 처리에 참여할 수 있습니다.
하위 디스패처 만들기
하위 디스패처는 생성 중에 상위 디스패처에 대한 참조를 전달하여 생성됩니다. 계층 구조의 모든 디스패처는 우선순위에 따라 전역 후입 선출 (LIFO) 이벤트 순서를 유지하기 위해 동일한 NavigationEventProcessor를 공유합니다.
계층적 사용 설정
디스패처에는 개발자가 핸들러의 전체 하위 트리를 한 번에 사용 설정하거나 중지할 수 있는 isEnabled 속성이 포함되어 있습니다.
상위 디스패처가 사용 중지 (isEnabled = false)되면 해당 상위 요소 및 하위 요소와 연결된 모든 핸들러는 개별 사용 설정 상태와 관계없이 무시됩니다.