Stosowanie logiki lub otoczek do miejsc docelowych

Możesz podać dodatkowe informacje lub zastosować tę samą logikę do miejsc docelowych, używając klasy NavEntryDecorator. Ta klasa opakowuje każdy element NavEntry w stosie wstecznym za pomocą funkcji kompozycyjnej. Innymi słowy, wzbogaca treść wpisu.

Tworzenie dekoratora niestandardowego

Aby utworzyć dekorator, rozszerz klasę NavEntryDecorator i zastąp te metody:

  • decorate – funkcja lambda, którą można komponować i która jest wywoływana dla każdego elementu NavEntry na stosie wstecznym. Otrzymuje on parametr NavEntry. Umożliwia to tworzenie obiektów stanu, które są powiązane z atrybutem contentKey wpisu. Możesz użyć CompositionLocalProvider, aby podać zależności od treści wpisu. Możesz też otoczyć treść funkcją kompozycyjną lub wywołać efekty uboczne. W tej metodzie zawsze należy wywoływać funkcję entry.Content().
  • onPop – wywołanie zwrotne, które jest wywoływane, gdy element NavEntry został usunięty z listy wstecznej i zakończył kompozycję. Otrzymuje contentKey usuniętego wpisu. Użyj contentKey, aby zidentyfikować i usunąć wszelkie stany powiązane z tym wpisem.

W przykładzie poniżej rozszerzamy klasę NavEntryDecorator, aby utworzyć dekorator niestandardowy.

// import androidx.navigation3.runtime.NavEntryDecorator
class CustomNavEntryDecorator<T : Any> : NavEntryDecorator<T>(
    decorate = { entry ->
        Log.d("CustomNavEntryDecorator", "entry with ${entry.contentKey} entered composition and was decorated")
        entry.Content()
    },
    onPop = { contentKey -> Log.d("CustomNavEntryDecorator", "entry with $contentKey was popped") }
)

Jeśli dekorator potrzebuje dostępu do stanu, utwórz funkcję kompozycyjną, która tworzy ten stan, a następnie użyj jej do utworzenia dekoratora. Przykładową implementację znajdziesz w kodzie źródłowym rememberSaveableStateHolderNavEntryDecorator. W ten sposób tworzony jest stan – SaveableStateHolder – i używany do utworzenia dekoratora.

Dekorowanie stosu wstecznego

Po utworzeniu NavEntryDecorator możesz ozdobić wpisy na liście wstecznej na 2 sposoby:

  • Użyj rememberDecoratedNavEntries. Ta funkcja jest przydatna, gdy masz kilka stosów wstecznych, z których każdy ma własny zestaw dekoratorów (więcej informacji znajdziesz w tym przepisie na kod). Funkcja zwraca udekorowaną listę elementów typu NavEntry, których możesz używać z funkcją NavDisplay.
  • Podaj dekorator bezpośrednio do NavDisplay za pomocą parametru entryDecorators. NavDisplay wywołuje rememberDecoratedNavEntries w tle i wyświetla zmodyfikowane wpisy.

Uwzględnij domyślny dekorator

Biblioteka Navigation 3 zawiera domyślny dekorator o nazwie SaveableStateHolderNavEntryDecorator, który umożliwia zachowanie stanu elementu NavEntry po zmianach konfiguracji i zakończeniu procesu. Zawiera ona treści NavEntrySaveableStateProvider, co umożliwia prawidłowe działanie wywołań rememberSaveable w treściach NavEntry.

Jeśli dekorator nie zapewnia SaveableStateProvider, jako pierwszy dekorator na liście dostarczonych dekoratorów należy umieścić SaveableStateHolderNavEntryDecorator. Jest tworzony za pomocą metody rememberSaveableStateHolderNavEntryDecorator.

Na przykład:

// import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator
NavDisplay(
    entryDecorators = listOf(
        rememberSaveableStateHolderNavEntryDecorator(),
        remember { CustomNavEntryDecorator() }
    ),
    // ...
)

Kiedy używać dekoratora

Za pomocą dekoratora możesz:

  • Utwórz zależność dla każdego elementu NavEntry na liście wstecznej. Na przykład znak ViewModelStoreNavEntryDecorator tworzy znak ViewModelStore dla każdego znaku NavEntry.
  • Określ zakres obiektu dla wielu NavEntry. Na przykład, aby udostępnić ViewModel między wieloma wpisami.
  • Wykonaj to samo działanie w przypadku wielu NavEntry. Na przykład do rejestrowania, debugowania lub śledzenia poszczególnych wpisów.
  • Owiń NavEntrys tą samą funkcją typu „composable".
  • Usuń stan powiązany z NavEntry. Jeśli na przykład wpis zostanie usunięty z listy wstecznej, element ViewModelStoreNavEntryDecorator wyczyści powiązany element ViewModelStore.

Nie używaj dekoratora do:

  • Przekazywanie zależności do pojedynczego elementu NavEntry.
  • Zapewnij zależności, których zakres jest szerszy niż stos wsteczny.

W obu tych przypadkach przekaż zależność bezpośrednio podczas tworzenia NavEntry.

Więcej przykładów kodu znajdziesz w NavEntryDecorator.