Puoi fornire informazioni aggiuntive o applicare la stessa logica alle destinazioni utilizzando la classe NavEntryDecorator. Questa classe racchiude ogni
NavEntry in uno stack precedente con una funzione componibile. In altre parole, decora i contenuti della voce.
Crea un decoratore personalizzato
Per creare un decorator, estendi la classe NavEntryDecorator ed esegui l'override
dei seguenti metodi:
decorate: una funzione lambda componibile chiamata per ogniNavEntrynello stack indietro. RiceveNavEntrycome parametro. In questo modo puoi creare oggetti di stato associati all'contentKeydella voce. Puoi utilizzareCompositionLocalProviderper fornire dipendenze ai contenuti della voce. Puoi anche racchiudere i contenuti in una funzione componibile o attivare effetti collaterali. Devi sempre chiamareentry.Content()all'interno di questo metodo.onPop: un callback richiamato quando unNavEntryè stato rimosso dallo stack precedente e ha lasciato la composizione. Riceve ilcontentKeydella voce rimossa. UtilizzacontentKeyper identificare e ripulire qualsiasi stato associato a questa voce.
L'esempio seguente estende la classe NavEntryDecorator per creare un decoratore personalizzato.
// 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") } )
Se il decoratore deve accedere allo stato, crea una funzione componibile che
crea lo stato e poi lo utilizza per costruire il decoratore. Per un esempio
di implementazione, vedi il codice sorgente di
rememberSaveableStateHolderNavEntryDecorator. Viene creato
lo stato, ovvero un SaveableStateHolder, che viene utilizzato per costruire il decoratore.
Decorare uno stack di attività
Dopo aver creato il NavEntryDecorator, decora le voci dello
stack precedente in uno dei due modi seguenti:
- Utilizza
rememberDecoratedNavEntries. Questa funzione è utile quando hai più back stack, ognuna con il proprio set di decoratori (per maggiori dettagli, consulta questa ricetta di codice). La funzione restituisce un elenco decorato diNavEntryche puoi utilizzare conNavDisplay. - Fornisci il decoratore direttamente a
NavDisplayutilizzando il parametroentryDecorators.NavDisplaychiamarememberDecoratedNavEntriessotto il cofano e mostra le voci decorate.
Includere il decoratore predefinito
Navigation 3 include un decoratore predefinito denominato
SaveableStateHolderNavEntryDecorator che consente di mantenere lo stato di un NavEntry
durante le modifiche alla configurazione e l'interruzione del processo. Il wrapper
NavEntry avvolge i contenuti con un SaveableStateProvider, che consente
alle chiamate rememberSaveable all'interno dei contenuti NavEntry di funzionare correttamente.
A meno che il tuo decoratore non fornisca un SaveableStateProvider, devi
includere SaveableStateHolderNavEntryDecorator come primo decoratore nell'elenco
dei decoratori forniti. È stato creato utilizzando
rememberSaveableStateHolderNavEntryDecorator.
Ad esempio:
// import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator NavDisplay( entryDecorators = listOf( rememberSaveableStateHolderNavEntryDecorator(), remember { CustomNavEntryDecorator() } ), // ... )
Quando utilizzare un decoratore
Utilizza un decoratore per:
- Crea una dipendenza per ogni
NavEntryin uno stack precedente. Ad esempio, l'ViewModelStoreNavEntryDecoratorcrea unViewModelStoreper ogniNavEntry. - Definisci l'ambito di un oggetto per più
NavEntry. Ad esempio, per condividere unViewModeltra più voci. - Esegui la stessa azione per più
NavEntry. Ad esempio, per eseguire operazioni di logging, debug o tracciamento per ogni voce. - Esegui il wrapping di
NavEntrycon la stessa funzione componibile. - Pulisci lo stato associato a
NavEntry. Ad esempio, quando una voce viene rimossa dallo stack precedente, l'ViewModelStoreNavEntryDecoratorcancella il relativoViewModelStore.
Non utilizzare un decoratore per:
- Trasferisci una dipendenza a un singolo
NavEntry. - Fornisci dipendenze il cui ambito è più ampio dello stack precedente.
In entrambi i casi, passa la dipendenza direttamente durante la creazione di NavEntry.
Per altri esempi di codice, vedi NavEntryDecorator.