Menerapkan logika atau wrapper ke tujuan

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 setiap NavEntry dalam tumpukan kembali Anda. Fungsi ini menerima NavEntry sebagai parameter. Hal ini memungkinkan Anda membuat objek status yang dikunci ke contentKey entri. Anda dapat menggunakan CompositionLocalProvider untuk menyediakan dependensi ke konten entri. Anda juga dapat mengapit konten dengan fungsi composable, atau memicu efek samping. Anda harus selalu memanggil entry.Content() di dalam metode ini.
  • onPop - Callback yang dipanggil saat NavEntry telah dihapus dari tumpukan kembali dan telah keluar dari komposisi. Fungsi ini menerima contentKey dari entri yang dihapus. Gunakan contentKey untuk 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 daftar NavEntry yang dihias yang dapat Anda gunakan dengan NavDisplay.
  • Berikan dekorator Anda langsung ke NavDisplay menggunakan parameter entryDecorators. Panggilan NavDisplay memanggil rememberDecoratedNavEntries di 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 NavEntry dalam stack kembali. Misalnya, ViewModelStoreNavEntryDecorator membuat ViewModelStore untuk setiap NavEntry.
  • Mencakup objek ke beberapa NavEntry. Misalnya, untuk membagikan ViewModel di antara beberapa entri.
  • Lakukan tindakan yang sama untuk beberapa NavEntry. Misalnya, untuk melakukan operasi pencatatan, pen-debug-an, atau pelacakan untuk setiap entri.
  • Gabungkan NavEntry dengan fungsi composable yang sama.
  • Membersihkan status yang terkait dengan NavEntry. Misalnya, saat entri dihapus dari data sebelumnya, ViewModelStoreNavEntryDecorator akan menghapus ViewModelStore terkait.

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.