navigationevent

  
Biblioteka Navigation Event udostępnia interfejs API oparty na KMP do obsługi systemowego przycisku Wstecz oraz przewidywanego powrotu.
Najnowsza aktualizacja Wersja stabilna Wersja kandydująca do publikacji Wersja beta Wersja Alfa
19 listopada 2025 r. 1.0.0 - - -

Deklarowanie zależności

Aby dodać zależność od navigationevent, musisz dodać repozytorium Google Maven do projektu. Więcej informacji znajdziesz w repozytorium Maven Google.

Dodaj zależności dotyczące potrzebnych artefaktów w pliku build.gradle aplikacji lub modułu:

Groovy

dependencies {
    implementation "androidx.navigationevent:navigationevent:1.0.0"
}

Kotlin

dependencies {
    implementation("androidx.navigationevent:navigationevent:1.0.0")
}

Więcej informacji o zależnościach znajdziesz w artykule Dodawanie zależności kompilacji.

Opinia

Twoja opinia pomoże nam ulepszyć Jetpacka. Jeśli odkryjesz nowe problemy lub masz pomysły na ulepszenie tej biblioteki, daj nam znać. Zanim utworzysz nową kartę, zapoznaj się z dotychczasowymi problemami w tej bibliotece. Możesz dodać swój głos do istniejącego problemu, klikając przycisk gwiazdki.

Tworzenie nowego problemu

Więcej informacji znajdziesz w dokumentacji narzędzia Issue Tracker.

Nie ma informacji o wersji tego artefaktu.

Wersja 1.0

Wersja 1.0.0

19 listopada 2025 r.

Publikacja androidx.navigationevent:navigationevent-*:1.0.0 Wersja 1.0.0 zawiera te zmiany.

Najważniejsze funkcje wersji 1.0.0:

Biblioteka Navigation Event jest już stabilna. Navigation Event to biblioteka AndroidX do obsługi interakcji na poziomie systemu, takich jak cofanie systemowe i przewidywane cofanie w Androidzie (i na innych platformach).

  • Aby obsługiwać NavigationEvent, możesz wdrożyć własny NavigationEventHandler, który zastąpi wybrane funkcje. Następnie musisz dodać moduł obsługi do NavigationEventDispatcher. Od wersji Activity 1.12.0 ComponentActivity implementuje nowy interfejs NavigationEventDispatcherOwner, który udostępnia gotowy do użycia dyspozytor :

    // The NavigationEventInfo provides information about a navigation state
    object CurrentInfo : NavigationEventInfo()
    
    // you can retrieve this from any component that is a NavigationEventDispatcherOwner
    // or you can instantiate your own custom dispatcher
    val dispatcher = myActivity.navigationEventDispatcher
    
    val myHandler = object : NavigationEventHandler<NavigationEventInfo>(
                initialInfo = CurrentInfo,
                isBackEnabled = true
            ) {
                override fun onBackStarted(event: NavigationEvent) {
                    // Prepare for the back event
                }
    
                override fun onBackProgressed(event: NavigationEvent) {
                    // Use event.progress for predictive animations
                }
    
                // This is the required method for final event handling
                override fun onBackCompleted() {
                    // Complete the back event
                }
    
                override fun onBackCancelled() {
                    // Cancel the back event
                }
            }
    
    dispatcher.addHandler(myHandler)
    
  • Moduł navigationevent:navigationevent-compose udostępnia wygodną funkcję tworzenia NavigationBackHandler, która automatycznie łączy procedurę obsługi z najbliższymi elementami LocalNavigationEventDispatcherOwnerNavigationEventDispatcher i umożliwia deweloperom określanie żądanego działania za pomocą parametrów:

    object CurrentInfo : NavigationEventInfo()
    object PreviousInfo : NavigationEventInfo()
    
    val navEventState = rememberNavigationEventState(
      currentInfo = CurrentInfo,
      backInfo = PreviousInfo
    )
    
    // Inside composition
    NavigationBackHandler(
        State = navEventState,
        isBackEnabled = true,
        // optional
        onBackCancelled = { // Cancel the back event },
        // required
        onBackCompleted = { // Complete the back event } ,
    )
    

Użycie tego wzorca w Compose bardzo ułatwia przeniesienie NavigationEventState i umożliwia obserwowanie go przez różne funkcje kompozycyjne (np. w przypadku Navigation3, gdzie można przenieść stan z NavDisplay).

  • Każdy NavigationEventDispatcher może udostępniać nadrzędny moduł wysyłający zarówno w przypadku tworzenia, jak i nie. Umożliwia to deweloperom tworzenie struktury hierarchicznej, w której wieloma dyspozytorami może zarządzać jeden dyspozytor nadrzędny. Posiadanie elementu nadrzędnego sprawia, że obsługa grup dyspozytorów, które mogą wymagać wyłączenia lub usunięcia, jest stosunkowo prosta:

    // Non-Compose
    val parentDispatcher = NavigationEventDispatcher()
    val childDispatcher = NavigationEventDispatcher(parent = parentDispatcher)
    
    // Compose
    val composeChildDispatcher = rememberNavigationEventDispatcher(
        // This defaults to `LocalNavigationEventDispatcherOwner.current`
        // Must explicitly provide null to have an unparented dispatcher created here
        parent = NavigationEventDispatch() 
    )
    
  • Biblioteka umożliwia też przekazywanie sygnałów bezpośrednio do NavigationEventDispatcher za pomocą NavigationEventInput. NavigationEventInputs działa jako „wejście” systemu nawigacji, tłumacząc zdarzenia specyficzne dla platformy (takie jak gesty cofania systemowego lub kliknięcia przycisków) na standardowe zdarzenia, które można wysyłać do NavigationEventDispatcher. Moduł navigationevent:navigationevent udostępnia obecnie 2 NavigationEventInput: bardziej ogólny DirectNavigationEventInput, który umożliwia wysyłanie dowolnego zdarzenia, oraz OnBackInvokedInput specyficzny dla Androida, który pozwala NavigationEventDispatcher obsługiwać gesty cofania systemowego i przewidywanego. Jeśli wdrażasz własny moduł wysyłający (zamiast korzystać z tego, który udostępnia ComponentActivity), musisz ręcznie dodać dane wejściowe:

    val dispatcher = NavigationEventDispatcher()
    
    dispatcher.addInput(DirectNavigationEventInput())
    dispatcher.addInput(OnBackInvokedDefaultInput(invoker))
    

Wersja 1.0.0-rc01

5 listopada 2025 r.

Publikacja androidx.navigationevent:navigationevent-*:1.0.0-rc01 Wersja 1.0.0-rc01 zawiera te zmiany.

Wersja 1.0.0-beta01

8 października 2025 r.

Publikacja androidx.navigationevent:navigationevent-*:1.0.0-beta01 Wersja 1.0.0-beta01 zawiera te zmiany.

Zmiany w interfejsie API

  • Popraw adnotację FloatRange dotyczącą usług NavigationEvent.touchXNavigationEvent.touchY. Wartości te reprezentują bezwzględne współrzędne pikseli i nie mają górnej granicy 1.0. (I4b205, b/445989313)
  • Zmień komponent NavigationEventDispatcherOwner na rememberNavigationEventDispatcherOwner. Funkcja zwraca teraz bezpośrednio wartość NavigationEventDispatcherOwner. Aby przekazać tego właściciela do subkompozycji, użyj atrybutu CompositionLocalProvider. (I874b2, b/444446629)

Wersja 1.0.0-alpha09

24 września 2025 r.

Publikacja androidx.navigationevent:navigationevent-*:1.0.0-alpha09 Wersja 1.0.0-alpha09 zawiera te zmiany.

Zmiany w interfejsie API

  • Zamiast tworzyć instancję Idle(), używaj bezpośrednio obiektu singleton NavigationEventTransitionState.Idle. (Ic7d9e, b/444734264)
  • Ustaw konstruktory wygody jako wewnętrzne; uzyskuj instancje za pomocą publicznego NavigationEventDispatcher.history zamiast bezpośredniej konstrukcji. (I3b7e0, b/444734264)
  • Wymaga tworzenia NavigationEventState za pomocą rememberNavigationEventState; konstruktor jest teraz wewnętrzny. (Ie143c, b/444734264)
  • Zastosuj onBackCompletedFallback zamiast fallbackOnBackPressed i parametru konstruktora. Zachowanie pozostaje bez zmian; wywoływane tylko w przypadku ukończonych, nieobsłużonych zdarzeń powrotu. (Idabe9, b/444734264)
  • Konstruktor podstawowy klasy NavigationEventHistory(mergedHistory, currentIndex) to teraz internal. Użytkownicy zewnętrzni muszą używać publicznych konstruktorów (pustego konstruktora lub konstruktora opartego na partycjach) do tworzenia instancji. (I1c047, b/444734264)
  • Make View.setViewTreeNavigationEventDispatcherOwner accept nullable owner (Ic9eb6, b/444436762)
  • NavigationEventInfo jest teraz abstract class zamiast interface. Zaktualizuj wszystkie niestandardowe implementacje, aby dziedziczyły z klasy (np.data class MyInfo : NavigationEventInfo()). (I1e59c, b/444734264)
  • Usunięto starszą właściwość NavigationEventDispatcher.state i funkcję getState<T>(). Używaj nowych, osobnych przepływów dispatcher.transitionState (postęp gestu) i dispatcher.history (stos nawigacji). (Ic2ceb, b/444734264)
  • Wywołanie NavigationEventInput.onInfoChanged(...) zostało zastąpione. Zaimplementuj nowe wywołanie zwrotne onHistoryChanged(history: NavigationEventHistory), aby otrzymywać aktualizacje jako pojedynczy obiekt NavigationEventHistory. (I23e0b, b/444734264)
  • Wprowadź nowy globalny NavigationEventDispatcher.history StateFlow. Ten nieogólny przepływ umożliwia obserwatorom subskrybowanie tylko zmian w stosie nawigacji i pozostaje stabilny podczas wykonywania gestów. Jest to odpowiednik transitionState. (I1db10, b/444734264)
  • Wprowadź nowy globalny NavigationEventDispatcher.transitionState StateFlow. Ten nieogólny przepływ umożliwia obserwatorom subskrybowanie tylko stanu gestu fizycznego (Idle/InProgress), niezależnie od historii. (I171fa, b/444734264)
  • Przedstaw klasę NavigationEventHistoryState. Będzie to podstawowy interfejs API do obserwowania historii informacji o nawigacji, niezależny od stanu gestu. (I81ca5, b/444734264)
  • NavigationEvent jest teraz oznaczona jako @Immutable, co umożliwia kompilatorowi Compose optymalizację ponownego komponowania. (If78c7, b/444734264)
  • Zaktualizowano interfejsy API modułu obsługi navigationevent-compose. NavigationEventHandlerNavigationBackHandler (oraz ich warianty) obsługują teraz nowe przeciążenie, które akceptuje podniesione NavigationEventState. Proste przeciążenia (przyjmujące currentInfo) są zachowywane i teraz wewnętrznie korzystają z tego nowego modelu stanu. (Ic3251, b/444734264)
  • Dodaj nowy uchwyt stanu @Stable NavigationEventState<T> do biblioteki navigationevent-compose. Ten obiekt łączy historię lokalną ze stanem gestu lokalnego i będzie głównym łącznikiem między rememberNavigationEventStateNavigationEventHandler. (Ifb69f, b/444734264)
  • Dodaj nową publiczną właściwość transitionState: TransitionState tylko do odczytu do NavigationEventHandler. Obsługujący mają teraz własny stan przejścia, który mogą obserwować systemy zewnętrzne. (I9acd2, b/444734264)
  • Przedstawiamy nową klasę TransitionState. Będzie to podstawowy interfejs API do obserwowania stanu gestu, niezależny od historii nawigacji. (Id4beb, b/444734264)
  • Udostępnij właściwości currentInfo, backInfoforwardInfo jako publiczne właściwości tylko do odczytu w NavigationEventHandler. (Ia7636, b/444734264)
  • Implementacje interfejsu NavigationEventHandler muszą teraz przekazywać wartość initialInfo: T do konstruktora klasy bazowej. (Idcfea, b/444734264)
  • Zastąp OnBackInvokedInput tekstem OnBackInvokedOverlayInput lub OnBackInvokedDefaultInput. (I5323f, b/428948766)
  • Oznacz NavigationEventState jako @Immutable. Zwiększa to wydajność Compose, ponieważ komponenty kompozycyjne obserwujące ten stan mogą prawidłowo pomijać ponowną kompozycję. (I399c8)
  • Zmień nazwę NavigationEventInfo.NotProvided na NavigationEventInfo.None; i zaktualizuj odwołania. Bez zmian w działaniu. (I5e2d4)
  • NavigationEventInfo jest teraz oznaczona jako @Immutable, co umożliwia kompilatorowi Compose optymalizację ponownego komponowania. (I7c112)
  • Ulepszyliśmy ergonomię Javy dzięki ciekawemu interfejsowi do wycofywania uzupełniania. (I8a860)
  • Zmień nazwę onHasEnabledHandlerChanged na onHasEnabledHandlersChanged. Wyjaśnia to, że wywołanie zwrotne raportuje zbiorczy stan włączenia wszystkich modułów obsługi, a nie tylko jednego z nich. (I1af61, b/443711297)
  • Usuń polecenie hasEnabledHandler() z polecenia NavigationEventDispatcher; i zamiast niego użyj polecenia NavigationEventInput.onHasEnabledHandlersChanged. (Idef72, b/443711297)
  • Dodaj wywołanie zwrotne onInfoChanged do NavigationEventInput, aby powiadamiać detektory o zmianach w historii nawigacji. Dzięki temu można uzyskać pełny kontekst bieżących, poprzednich i następnych stosów, co umożliwia reagowanie na informacje kontekstowe. (I69a8b, b/443282983)
  • Make NavigationEvent's swipeEdge an @IntDef (Icee54, b/443950342)
  • Dodaj parametr priority do NavigationEventDispatcher.addInput, aby ograniczyć zakres dyspozytora do jednego priorytetu. Zdarzenia takie jak onHasEnabledCallbacksChanged będą teraz wywoływane tylko wtedy, gdy zmienią się wywołania zwrotne o tym priorytecie. (I3e488, b/443711297)
  • Zmieniono nazwę parametru NavigationEventDispatcherparentDispatcher na parent, aby zwiększyć przejrzystość. (Id4f1f, b/443801782)
  • Usunięto NavigationEventPriority na rzecz @IntDef dla użytkowników Javy (I10a9f, b/440514265)
  • Wymuszanie umowy obsługi nawigacji. Jeśli NavigationEventHandler ustawia isBackEnabled lub isForwardEnabled na true, musisz teraz zastąpić odpowiednio onBackCompleted lub onForwardCompleted. Domyślne implementacje zgłaszają teraz wyjątek, aby zapobiec cichym błędom. (I17c62)
  • Wymuszanie prawidłowych wartości priorytetu podczas dodawania procedur obsługi zdarzeń nawigacji. Wywołanie addHandler z nieobsługiwanym priorytetem spowoduje teraz zgłoszenie błędu IllegalArgumentException, co zapewni natychmiastową informację zwrotną o nieprawidłowym użyciu na wszystkich platformach docelowych. (I3c474)

Poprawki błędów

  • Spraw, aby funkcja addHandler była idempotentna; ignoruj zduplikowane rejestracje. (I052aa, b/444734264)
  • Synchronizuj właściwości NavigationEventState podczas ponownego komponowania. (Ib3b4d, b/444734264)
  • Upewnij się, że NavigationEventInputs otrzymuje aktualne informacje kontekstowe (bieżące, poprzednie, następne) natychmiast po rejestracji. (Ie65bf, b/443282983)

Wersja 1.0.0-alpha08

10 września 2025 r.

Publikacja androidx.navigationevent:navigationevent-*:1.0.0-alpha08 Wersja 1.0.0-alpha08 zawiera te zmiany.

Nowe funkcje

  • Wprowadź interfejs API oparty na funkcji Lambda NavigationEventHandler, który zastępuje moduł obsługi oparty na przepływie. Obsługuj gesty cofania i przewijania do przodu za pomocą prostych wywołań zwrotnych zamiast zbierania przepływów, co zmniejsza ilość kodu i pozwala uniknąć problemów z anulowaniem. Udostępnij interfejsy NavigationBackHandlerNavigationForwardHandler jako docelowe interfejsy API ułatwiające pracę. Usuń NavigationEventHandler oparte na Flow i przejdź na nowe wywołania zwrotne. (I23bac, b/436248277)
  • Umożliwia pasywnym słuchaczom dostęp do pełnej listy poprzednich ekranów za pomocą połączonych informacji o wstecznych ekranach. Umożliwia interfejsom renderowanie podglądów i zagnieżdżonej historii nawigacji zamiast ograniczać się do wywołania zwrotnego najwyższego poziomu. (I7a510, b/436248277)
  • Wprowadź wyraźny model wstecz/bieżący/do przodu, aby wyjaśnić stan nawigacji i umożliwić nawigację do przodu za pomocą zagnieżdżonych modułów obsługi. (Ib86da, b/420443609)
  • Dodaj metody onForward* i isForwardEnabled do NavigationEventCallback. (Ic100f, b/436248290)
  • Dodaliśmy obsługę nawigacji do przodu do elementu NavigationEventInput. (I5734b)

Zmiany w interfejsie API

  • Włącz testowanie zdarzeń nawigacji do przodu za pomocą TestNavigationEventCallback. Użyj haczyków isForwardEnabledonForward*. (I21fb5, b/420443609)
  • Zmień nazwy wywołań zwrotnych onEvent* na onBack* w NavEvent. (I228b3, b/436248290)
  • Przekształć SwipeEdge w klasę w tekście. (Id5e01)
  • Spraw, aby biblioteka navigationevent była interoperacyjna z Javą. Wszystkie publiczne interfejsy API są teraz w pełni dostępne z kodu Java, co umożliwia bezproblemową integrację z projektami w różnych językach lub tylko w języku Java. (Ibc944,I5465f, I9fb1e, b/440532890b/443040294)
  • Wyjaśnienie ról interfejsu API przez zmianę nazwy NavigationEventCallback na NavigationEventHandler. Ta zmiana lepiej odzwierciedla przeznaczenie klasy, czyli obsługę gestów nawigacji wieloetapowej. Odpowiednia metoda addCallback to teraz addHandler. (I2492a, b/443040331)

Poprawki błędów

  • Zapobiega uruchamianiu funkcji powrotu przy przejściu do przodu. (I74814, b/436248290)
  • Dodanie obsługi predykcyjnej nawigacji do przodu. NavigationEvent Interfejsy API obsługują teraz gesty wstecz i do przodu, co umożliwia spójne animacje w obu kierunkach nawigacji. (Idc98c, b/436248290)
  • Zapobiega awarii IllegalStateException podczas ponownego komponowania, gdy dziecko NavigationEventDispatcherOwner zostanie usunięte. (Iff50c, b/412629020)
  • Pasywni słuchacze mogą teraz uzyskać dostęp do pełnej historii nawigacji wstecznej dzięki połączonym informacjom o wstecznej nawigacji, co umożliwia interfejsom renderowanie podglądów i zagnieżdżonej historii nawigacji zamiast ograniczać się do wywołania zwrotnego najwyższego poziomu. (I7a510, b/436248277)

Wersja 1.0.0-alpha07

27 sierpnia 2025 roku

Publikacja androidx.navigationevent:navigationevent-*:1.0.0-alpha07 Wersja 1.0.0-alpha07 zawiera te zmiany.

Zmiany w interfejsie API

  • Usuń NavigationEventDispatcher.onHasEnabledCallbacksChanged. (I50e97)
  • Uczyń NavigationEventCallback.onEventCompleted() abstrakcyjnym. (I36b38)
  • Zmień metody NavigationEventCallback#on* na protected. Zaktualizuj kod połączenia, aby je zastąpić. (I6b691)
  • Zmień nazwę funkcji DirectNavigationEventInput. (Iffb62)
  • Zmień nazwę NavigationEventInput.onAttach na onAdded. (I2d0b8)
  • Zmień nazwę NavigationEventInput.onDetach na onRemoved. (I2d0b8)
  • Zmień nazwę NavigationEventInputHandler na NavigationEventInput. (I676a4)
  • Dodano @EmptySuper do NavigationEventInput.onHasEnabledCallbacksChanged. (If9853)
  • Wdróż onAttach w aplikacji NavigationEventInputHandler. (I03648)
  • Wdróż onDetach w aplikacji NavigationEventInputHandler. (I03648)
  • Domyślnie NavigationEventCallback jest włączona po utworzeniu. (Ic0188)
  • Zastąp NavigationEventInput.addOnHasEnabledCallbacksChangedCallback tekstem NavigationEventInput.onHasEnabledCallbacksChanged. (I64e93)
  • Wymagaj głównego wątku dla NavigationEventDispatcher.addInput. (Ic2930)
  • Wymagaj głównego wątku dla NavigationEventDispatcher.removeInput. (Ic2930)
  • Usuń Dispatcher.addOnHasEnabledCallbacksChangedCallback. Zastąp elementem Dispatcher.onHasEnabledCallbacksChanged. (Ida3e3, b/436530096)

Poprawki błędów

  • Naprawiono błąd, w wyniku którego dodanie już dołączonego modułu obsługi lub usunięcie nieprzyłączonego modułu wywoływało nieprawidłową logikę cyklu życia. (I9e47b)

Wersja 1.0.0-alpha06

13 sierpnia 2025 r.

Publikacja androidx.navigationevent:navigationevent-*:1.0.0-alpha06 Wersja 1.0.0-alpha06 zawiera te zmiany.

Nowe funkcje

Passive Listeners API

Teraz możesz przekazywać niestandardowe informacje kontekstowe z dowolnego hosta nawigacji i pasywnie nasłuchiwać zmian stanu gestów z dowolnego miejsca w interfejsie. Umożliwia to animacje zależne od kontekstu w przypadku przewidywanego przejścia wstecz i innych gestów nawigacyjnych.

Ta funkcja składa się z 2 części:

  1. Przekazywanie informacji – używaj parametru NavigationEventInfo do przekazywania danych niestandardowych.
  2. Stan konsumpcji – użyj dispatcher.state (NavigationEventState), aby obserwować postęp i kontekst gestu.
  • NavigationEventCallback udostępnia teraz metodę setInfo(currentInfo, previousInfo) do ustawiania kontekstu gestu w jednym wywołaniu (I1d5e7, b/424470518).
  • NavigationEventHandler dodaje nowe przeciążenie, które akceptuje currentInfopreviousInfo, co czyni go głównym interfejsem API do dostarczania kontekstu w aplikacjach Compose (I6ecd3, b/424470518).

Przykład:

  data class MyScreenInfo(val screenName: String) : NavigationEventInfo

  NavigationEventHandler(
      enabled = true,
      currentInfo = MyScreenInfo("Details Screen"),
      previousInfo = MyScreenInfo("Home Screen")
  ) { /* Handle back completion */ }
  • NavigationEventDispatcher udostępnia teraz dispatcher.statedispatcher.getState<T>() (If7fae, Ia90ca, b/424470518). Te interfejsy API oparte na StateFlow umożliwiają dowolnemu interfejsowi obserwowanie postępu gestu i danych kontekstowych bez bezpośredniej obsługi zdarzenia.

Przykład:

  val gestureState by LocalNavigationEventDispatcherOwner.current!!
      .navigationEventDispatcher
      .state
      .collectAsState()

  val progress = gestureState.progress // Returns latestEvent.progress or 0F

  when (val state = gestureState) {
      is InProgress -> {
          val toScreen = state.currentInfo as MyScreenInfo
          val fromScreen = state.previousInfo as MyScreenInfo
          println("Navigating from ${fromScreen.screenName} to ${toScreen.screenName}")
      }
      is Idle -> { /* Idle state */ }
  }
  • Dodaj właściwość progress do elementu NavigationEventState (I7b196), która zwraca wartość latestEvent.progress, gdy proces jest w toku, lub 0F w przeciwnym razie:

    val progress = state.progress
    
  • Dodaj funkcję NavigationEventDispatcherOwner composable, aby tworzyć, łączyć i usuwać instancje NavigationEventDispatcher w sposób hierarchiczny. Włącz dynamiczne sterowanie stanem włączonym dyspozytora i automatyczne czyszczenie.

    @Composable
    fun Sample() {
        NavigationEventDispatcherOwner(enabled = true) {
            val localDispatcherOwner = LocalNavigationEventDispatcherOwner.current
        }
    }
    

Zmiany w interfejsie API

  • Parametr isPassthrough został usunięty z funkcji NavigationEventCallback. (I99028, b/424470518)
  • Konstruktory NavigationEventState są teraz wewnętrzne. Na potrzeby testowania zaktualizuj stan (domyślnie Idle) za pomocą DirectNavigationEventInputHandler. Zadzwoń pod numer handleOnStarted lub handleOnProgressed, aby ustawić stan na InProgress, a pod numer handleOnCompleted lub handleOnCancelled, aby przywrócić stan Idle. Aby zaktualizować NavigationEventInfo, użyj NavigationEventCallback.setInfo. (I93dca, b/424470518)
  • Dodano parametry domyślne do NavigationEvent, aby ułatwić tworzenie instancji i uprościć testowanie, które powinno być używane zamiast TestNavigationEvent. (I5dc49, I232f4)
  • Dodano TestNavigationEventCallback do testowania zdarzeń nawigacji z określonymi stanami bieżącymi i poprzednimi. (Idd22e, b/424470518)
  • NavigationEventInputHandler został przekształcony w klasę abstrakcyjną, aby zastąpić poprzedni element AbstractNavigationEventInputHandler implementacją w DirectNavigationEventInputHandler (Iadde5, Ifed40I3897c, b/432616296, b/435416924).
  • Prefiksy funkcji send*NavigationEventInputHandler zostały zmienione na handle*. (Iffcaf)
  • OnBackInvokedInputHandler obejmuje teraz nową abstract NavigationInputHandler. (Ib45aa)
  • Zmieniono NavigationEventDispatcherOwner, aby wymagać dyspozytora nadrzędnego, w którym musisz jawnie przekazać null, aby utworzyć dyspozytora głównego. (Ia6f64, b/431534103)

Poprawki błędów

  • Zwiększona wydajność dzięki unikaniu kopiowania kolekcji w NavigationEventDispatcher.dispose(). (I4ab09)
  • Rozwiązaliśmy problem, który powodował, że NavigationEventHandler nie reagował prawidłowo na zmiany stanu włączenia. (Ia5268,I19bec, I5be5c, b/431534103)

Nowości w Dokumentach

  • Dokumentacja KDocs dla NavigationEvent została rozszerzona, aby wyjaśnić jej rolę jako ujednoliconego kontenera zdarzeń i szczegółowe działanie właściwości w przypadku różnych typów nawigacji (gesty, kliknięcia). (I91e8d)
  • Zaktualizowaliśmy dokumentację interfejsów API Compose do obsługi powrotu do poprzedniego ekranu (BackHandler, PredictiveBackHandler, NavigationEventHandler), aby zwrócić uwagę na zachowanie związane z kolejnością wywoływania zwrotnego. (I7ab94, )

Aktualizacja zależności

  • NavigationEvent zależy teraz od Compose Runtime w wersji 1.9.0-beta03, co umożliwia artefaktowi navigationevent-compose obsługę wszystkich platform KMP. (Ia1b87)

Wersja 1.0.0-alpha05

30 lipca 2025 r.

Publikacja androidx.navigationevent:navigationevent-*:1.0.0-alpha05 Wersja 1.0.0-alpha05 zawiera te zmiany.

Obsługa hierarchii rodzic–dziecko:

NavigationEventDispatcher może teraz mieć dyspozytorów nadrzędnych i podrzędnych, tworząc hierarchiczną strukturę drzewa. Umożliwia to propagowanie zdarzeń nawigacji i elastyczniejsze zarządzanie nimi w złożonych komponentach interfejsu Compose dzięki odzwierciedleniu hierarchii strukturalnej interfejsu za pomocą połączonych dyspozytorów. (I194ac)

  // Create a parent dispatcher that will manage navigation events at a higher level.
  val parentDispatcher = NavigationEventDispatcher()

  // Create a child dispatcher linked to the parent, forming a hierarchy.
  val childDispatcher = NavigationEventDispatcher(parentDispatcher)

Hierarchiczna właściwość isEnabled umożliwia sterowanie dyspozytorem od góry do dołu. Gdy w przypadku dyspozytora ustawisz isEnabled na false, automatycznie wyłączysz wszystkich jego dyspozytorów podrzędnych. Ta funkcja umożliwia sprawne wyłączanie całych gałęzi systemu zdarzeń nawigacyjnych. (I9e985)

  // Disabling the child dispatcher disables all its callbacks and any of its children recursively.
  childDispatcher.isEnabled = false

Dodatkowo właściwość isEnabledNavigationEventCallback uwzględnia teraz stan włączenia lub wyłączenia powiązanego z nią dyspozytora. Oznacza to, że wywołanie zwrotne jest uznawane za włączone tylko wtedy, gdy włączone jest samo wywołanie zwrotne i jego dyspozytor (wraz z elementami nadrzędnymi), co zapewnia spójną kontrolę hierarchiczną nad aktywacją wywołania zwrotnego. (I1799a)

  // Create a test callback and add it to the child dispatcher.
  val callback1 = TestNavigationEventCallback(isEnabled = true)
  childDispatcher.addCallback(callback1)

  // Since the childDispatcher is disabled, the callback is effectively disabled as well.
  assertThat(callback1.isEnabled).isFalse()

Wprowadziliśmy nową dispose() metodę prawidłowego czyszczenia dyspozytorów i ich elementów podrzędnych. Wywołanie dispose() zatrzymuje odbiorców, aby zapobiec wyciekom pamięci, rekurencyjnie usuwa wszystkie podrzędne dyspozytory, usuwa wszystkie wywołania zwrotne zarejestrowane w dyspozytorze i odłącza go od dyspozytora nadrzędnego. Gwarantuje to prawidłowe zwalnianie zasobów, gdy dyspozytorzy nie są już potrzebni. (I9e985)

  // Dispose the child dispatcher to clean up resources.
  childDispatcher.dispose()

Jeśli w przypadku usuniętego dyspozytora zostanie wywołana jakakolwiek metoda publiczna, natychmiast zostanie zgłoszony wyjątek IllegalStateException. Zapobiega to cichym błędom i pomaga programistom wykrywać nieprawidłowe użycie podczas tworzenia aplikacji. (Ic2dc3)

  val callback2 = TestNavigationEventCallback()

  // Attempting to use a disposed dispatcher will throw an exception.
  assertThrows<IllegalStateException> {
      childDispatcher.addCallback(callback2)
  }

Uwaga: wprowadzimy nowy NavigationEventDispatcherOwner komponent, który automatycznie zarządza dyspozytorem podrzędnym w interfejsie Compose w aosp/3692572. Ta zmiana nie została jednak uwzględniona w bieżącej wersji i jest planowana w następnej.

Biblioteka testów nawigacji

  • Dodaj moduł navigationevent-testing, aby udostępnić narzędzia do testowania biblioteki navigationevent. (0e50b6)
  • Dodaj TestNavigationEventCallback fałszywą klasę narzędziową do testowania. Rejestruje wywołania metody wywołania zwrotnego i przechowuje otrzymane NavigationEvent, aby umożliwić weryfikację. (4a0246)
  • Dodaj fałszywą funkcję narzędziową TestNavigationEvent, aby tworzyć instancje NavigationEvent z wartościami domyślnymi, co uprości testy jednostkowe przetwarzania zdarzeń nawigacji. (3b63f5)
  • Dodaj TestNavigationEventDispatcherOwner fałszywą klasę narzędziową do testowania. Śledzi liczbę zdarzeń związanych z włączeniem i wyłączeniem funkcji rezerwowej, aby obsługiwać weryfikację interakcji w testach. (c8753e)

Zmiany w interfejsie API

  • Przenieś NavigationEventInputHandlerandroidMain do commonMain, aby udostępnić go we wspólnym kodzie KMP. Dodano nowe metody public send* do wysyłania zdarzeń. Zmień funkcje wysyłania w NavigationEventDispatcherpublic na internal. Użytkownicy muszą teraz używać NavigationEventInputHandler do wysyłania zdarzeń. (Ia7114)
  • Zmień nazwę NavigationInputHandler na OnBackInvokedInputHandler. (I63405)

Poprawki błędów

  • Przeprowadź refaktoryzację NavigationEventDispatcher, aby zmniejszyć obciążenie przez unikanie przydzielania list pośrednich i zwiększenie wydajności wywoływania zwrotnego. (I82702, I1a9d9)
  • Dodaj adnotacje @FloatRange do pól touchX, touchY i progress w NavigationEvent, aby wymusić prawidłowe zakresy wartości w czasie kompilacji i zwiększyć bezpieczeństwo interfejsu API. (Iac0ec)

Wersja 1.0.0-alpha04

2 lipca 2025 r.

Publikacja androidx.navigationevent:navigationevent-*:1.0.0-alpha04 Wersja 1.0.0-alpha04 zawiera te zmiany.

Poprawki błędów

  • Użyto implementedInJetBrainsFork do navigationevent-compose i dodano element docelowy commonStubs, aby dopasować go do konwencji Compose. Zmiana zaproponowana przez JetBrains. (f60c79)
  • Naprawiono stosowanie wtyczki kompilatora Compose dla Kotlin/Native, aby zapewnić prawidłowe generowanie stubów. Nie ma to wpływu na publiczne interfejsy API ani ich działanie. (1890c9)

Wersja 1.0.0-alpha03

18 czerwca 2025 r.

Publikacja androidx.navigationevent:navigationevent-*:1.0.0-alpha03 Wersja 1.0.0-alpha03 zawiera te zmiany.

Nowe funkcje

  • Wprowadziliśmy nowy moduł navigationevent-compose, który obsługuje funkcje Jetpack Compose w bibliotece navigationevent. (980d78)
  • NavigationEvent Funkcja Compose dodała nową LocalNavigationEventDispatcherOwner kompozycję lokalną. Zwraca wartość dopuszczającą wartość null, aby lepiej określić, czy jest ona dostępna w bieżącej kompozycji. NavigationEventHandler będzie teraz zgłaszać błąd, jeśli nie znajdzie właściciela. (62ffda)
  • NavigationEvent Compose dodał nowy NavigationEventHandler komponent kompozycyjny do obsługi zdarzeń (gestu przewidywania powrotu). Zawiera Flow obiektów NavigationEvent, które muszą zostać zebrane w dostarczonej przez Ciebie lambdzie zawieszającej c42ba6:
NavigationEventHandler { progress: Flow<NavigationEvent> ->
  // This block is executed when the back gesture begins.
  try {
    progress.collect { backEvent ->
      // Handle gesture progress updates here.
    }
    // This block is executed if the gesture completes successfully.
  } catch (e: CancellationException) {
    // This block is executed if the gesture is cancelled
    throw e
  } finally {
    // This block is executed either the gesture is completed or cancelled
  }
}

Zmiany w interfejsie API

  • Każdy NavigationEventCallback można teraz zarejestrować tylko w 1 NavigationEventDispatcher naraz. Dodanie go do wielu dyspozytorów powoduje błąd IllegalStateException. Pamiętaj, że to zachowanie różni się od zachowania OnBackPressedDispatcher, które umożliwia korzystanie z wielu dyspozytorów. (e82c19)
  • Zmieniliśmy isPassThrough na val, aby zapobiec mutacji podczas nawigacji, która mogłaby zakłócić wysyłanie NavigationEvent. (I0b287)

Wersja 1.0.0-alpha02

4 czerwca 2025 r.

Publikacja androidx.navigationevent:navigationevent-*:1.0.0-alpha02 Wersja 1.0.0-alpha02 zawiera te zmiany.

Zmiany w interfejsie API

  • Zastąp pomocniczy konstruktor NavigationEventDispatcher argumentami domyślnymi. (I716a0)
  • Usuń priorytetową usługę z konta NavigationEventCallback. Zamiast tego przekaż priorytet do NavigationEventDispatcher.addCallback(). (I13cae)

Poprawki błędów

  • Naprawiliśmy ConcurrentModificationException, który mógł wystąpić, gdy wywoływano NavigationEventCallback.remove() z powodu jednoczesnej modyfikacji wewnętrznej listy elementów, które można zamknąć. (b/420919815)

Wersja 1.0.0-alpha01

20 maja 2025 r.

Publikacja androidx.navigationevent:navigationevent-*:1.0.0-alpha01 Wersja 1.0.0-alpha01 zawiera te zmiany.

Nowe funkcje

  • Biblioteka androidx.navigationevent udostępnia interfejs API KMP do obsługi systemowego przycisku Wstecz oraz przewidywanego powrotu. Interfejs NavigationEventDispatcher służy jako wspólny interfejs API do rejestrowania co najmniej 1 instancji NavigationEventCallback w celu otrzymywania zdarzeń systemowych.
  • Ta warstwa znajduje się poniżej wcześniej udostępnionych interfejsów API w androidx.activity i ma być mniej subiektywnym zamiennikiem interfejsów API aktywności w komponentach wyższego poziomu lub bezpośredniego korzystania z interfejsów API OnBackInvokedDispatcher platformy Android. Interfejsy API androidx.activity zostały przepisane na podstawie interfejsów Navigation Event API w ramach Activity 1.12.0-alpha01.