Konfigurowanie dyspozytora

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.