Anda dapat memberikan informasi tambahan atau menerapkan logika yang sama ke tujuan menggunakan class NavEntryDecorator. Class ini membungkus setiap
NavEntry di data sebelumnya dengan fungsi composable. Dengan kata lain,
menghiasi konten entri.
Membuat dekorator kustom
Untuk membuat dekorator, perluas class NavEntryDecorator dan ganti
metode berikut:
decorate- Lambda composable yang dipanggil untuk setiapNavEntrydalam tumpukan kembali Anda. Fungsi ini menerimaNavEntrysebagai parameter. Hal ini memungkinkan Anda membuat objek status yang dikunci kecontentKeyentri. Anda dapat menggunakanCompositionLocalProvideruntuk menyediakan dependensi ke konten entri. Anda juga dapat mengapit konten dengan fungsi composable, atau memicu efek samping. Anda harus selalu memanggilentry.Content()di dalam metode ini.onPop- Callback yang dipanggil saatNavEntrytelah dihapus dari tumpukan kembali dan telah keluar dari komposisi. Fungsi ini menerimacontentKeydari entri yang dihapus. GunakancontentKeyuntuk mengidentifikasi dan membersihkan status apa pun yang terkait dengan entri tersebut.
Contoh berikut memperluas class NavEntryDecorator untuk membuat dekorator
kustom.
// 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") } )
Jika dekorator Anda memerlukan akses ke status, buat fungsi composable yang
membuat status tersebut, lalu gunakan untuk membuat dekorator. Untuk contoh penerapan, lihat kode sumber untuk
rememberSaveableStateHolderNavEntryDecorator. Tindakan ini akan membuat
status - SaveableStateHolder - dan menggunakannya untuk membuat dekorator.
Menghias back stack
Setelah membuat NavEntryDecorator, hiasi entri di
tumpukan kembali dengan salah satu dari dua cara berikut:
- Gunakan
rememberDecoratedNavEntries. Fungsi ini berguna saat Anda memiliki beberapa tumpukan kembali, yang masing-masing memiliki serangkaian dekoratornya sendiri (lihat resep kode ini untuk mengetahui detail selengkapnya). Fungsi ini menampilkan daftarNavEntryyang dihias yang dapat Anda gunakan denganNavDisplay. - Berikan dekorator Anda langsung ke
NavDisplaymenggunakan parameterentryDecorators. PanggilanNavDisplaymemanggilrememberDecoratedNavEntriesdi balik layar dan menampilkan entri yang dihias.
Menyertakan dekorator default
Navigation 3 menyertakan dekorator default bernama
SaveableStateHolderNavEntryDecorator yang memungkinkan status NavEntry
dipertahankan melalui perubahan konfigurasi dan penghentian proses. Fungsi ini membungkus
konten NavEntry dengan SaveableStateProvider, yang memungkinkan
panggilan rememberSaveable di dalam konten NavEntry berfungsi dengan benar.
Kecuali jika dekorator Anda menyediakan SaveableStateProvider, Anda harus
menyertakan SaveableStateHolderNavEntryDecorator sebagai dekorator pertama dalam
daftar dekorator yang disediakan. Dibuat menggunakan
rememberSaveableStateHolderNavEntryDecorator.
Contoh:
// import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator NavDisplay( entryDecorators = listOf( rememberSaveableStateHolderNavEntryDecorator(), remember { CustomNavEntryDecorator() } ), // ... )
Kapan harus menggunakan dekorator
Gunakan dekorator untuk:
- Buat dependensi untuk setiap
NavEntrydalam stack kembali. Misalnya,ViewModelStoreNavEntryDecoratormembuatViewModelStoreuntuk setiapNavEntry. - Mencakup objek ke beberapa
NavEntry. Misalnya, untuk membagikanViewModeldi antara beberapa entri. - Lakukan tindakan yang sama untuk beberapa
NavEntry. Misalnya, untuk melakukan operasi pencatatan, pen-debug-an, atau pelacakan untuk setiap entri. - Gabungkan
NavEntrydengan fungsi composable yang sama. - Membersihkan status yang terkait dengan
NavEntry. Misalnya, saat entri dihapus dari data sebelumnya,ViewModelStoreNavEntryDecoratorakan menghapusViewModelStoreterkait.
Jangan gunakan dekorator untuk:
- Teruskan dependensi ke satu
NavEntry. - Menyediakan dependensi yang cakupannya lebih luas daripada tumpukan kembali.
Dalam kedua kasus ini, teruskan dependensi secara langsung saat membuat NavEntry.
Untuk contoh kode lainnya, lihat NavEntryDecorator.