Aby wdrożyć niezawodny system nawigacji, aplikacja musi mieć scentralizowany sposób obsługi gestów wstecz i innych sygnałów nawigacyjnych. Na tej stronie dowiesz się, jak używać NavigationEventDispatcher do koordynowania i rozpowszechniania tych zdarzeń nawigacji w aplikacji.
Zadeklaruj NavigationEventDispatcher
NavigationEventDispatcher to centralny komponent biblioteki NavigationEvent. Działa jako centrum zdarzeń, które wysyła zdarzenia związane z nawigacją, takie jak gesty cofania i przejścia nawigacyjne, do zarejestrowanych odbiorców w aplikacji. Komponenty mogą subskrybować te zdarzenia, aby reagować na zmiany nawigacji lub inne działania nawigacyjne wywoływane przez system.
Musisz podać NavigationEventDispatcher w ramach elementu NavigationEventDispatcherOwner. Dzięki temu różne części aplikacji mogą uzyskiwać dostęp do tego samego mechanizmu dispatcher i obserwować zdarzenia nawigacyjne w spójny i skoordynowany sposób.
class MyComponent: NavigationEventDispatcherOwner { override val navigationEventDispatcher: NavigationEventDispatcher = NavigationEventDispatcher() }
Jeśli znajdujesz się w ComponentActivity, zamiast implementować własny dyspozytor możesz pobrać ten, który jest dostępny.
class MyCustomActivity : ComponentActivity() { fun addMyHandler() { // navigationEventDispatcher provided by the ComponentActivity navigationEventDispatcher.addHandler(myNavigationEventHandler) } }
Dodaj: NavigationEventInput
Po zarejestrowaniu modułu obsługi możesz już otrzymywać zdarzenia.
Musisz jednak podać źródło, z którego pochodzą zdarzenia, z NavigationEventInput.
NavigationEventInput to komponent specyficzny dla platformy, który odbiera surowe dane wejściowe systemu i przekształca je w standardowy NavigationEvent, który ma zostać wysłany do NavigationEventDispatcher.
Poniższy przykład przedstawia niestandardową implementację 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() } }
Następnie przekaż te dane do dyspozytora:
navigationEventDispatcher.addInput(MyInput())
Zwalnianie miejsca w zasobach za pomocą dispose()
Aby zapobiec wyciekom pamięci w dynamicznym interfejsie, każde utworzone wystąpienie NavigationEventDispatcher musi zostać wyraźnie usunięte z hierarchii za pomocą metody dispose(), gdy komponent, z którym jest powiązane, zostanie zniszczony:
navigationEventDispatcher.dispose()
Metoda dispose() zapewnia kaskadowe czyszczenie przez iteracyjne usuwanie dyspozytora i wszystkich jego elementów podrzędnych (dzieci i wnuków), co gwarantuje, że wszystkie powiązane z nim moduły obsługi zostaną wyrejestrowane ze wspólnego systemu.
Hierarchia i kontrola dyspozytora
NavigationEventDispatcher obsługuje hierarchię nadrzędny-podrzędny, co umożliwia komponentom zagnieżdżonym głęboko w interfejsie (np. zagnieżdżonym NavHost lub oknom) uczestniczenie w obsłudze zdarzeń nawigacyjnych.
Tworzenie dyspozytora podrzędnego
Dyspozytor podrzędny jest tworzony przez przekazanie odwołania do dyspozytora nadrzędnego podczas konstrukcji. Wszyscy dyspozytorzy w hierarchii mają ten sam NavigationEventProcessor, aby zachować globalne porządkowanie zdarzeń według zasady ostatnie weszło, pierwsze wyszło (LIFO) na podstawie priorytetu.
Włączanie hierarchiczne
Dispatcher zawiera właściwość isEnabled, która umożliwia deweloperom włączanie lub wyłączanie całego poddrzewa modułów obsługi naraz.
Gdy dyspozytor nadrzędny jest wyłączony (isEnabled = false), wszystkie moduły obsługi powiązane z tym dyspozytorem i jego elementami podrzędnymi będą ignorowane niezależnie od ich indywidualnego stanu włączenia.