Menyimpan dan mengelola status navigasi

Bagian berikut menjelaskan strategi untuk menyimpan tumpukan kembali dan menyimpan status yang terkait dengan entri di tumpukan kembali Anda.

Menyimpan back stack

Memastikan status navigasi aplikasi Anda tetap ada di berbagai peristiwa siklus proses, termasuk perubahan konfigurasi dan penghentian proses, sangat penting untuk pengalaman pengguna yang baik. Di Navigation 3, Anda memiliki back stack, sehingga tidak ada pedoman ketat tentang cara membuat atau menyimpannya. Namun, Navigation 3 menawarkan metode praktis yang memberi Anda data sebelumnya yang dapat disimpan: rememberNavBackStack.

Gunakan rememberNavBackStack

Fungsi composable rememberNavBackStack dirancang untuk membuat stack kembali yang tetap ada di seluruh perubahan konfigurasi dan penghentian proses.

Agar rememberNavBackStack berfungsi dengan benar, setiap kunci dalam stack kembali harus mematuhi persyaratan tertentu:

  • Terapkan antarmuka NavKey: Setiap kunci dalam stack kembali harus menerapkan antarmuka NavKey. Tindakan ini berfungsi sebagai antarmuka penanda yang memberi sinyal ke library bahwa kunci dapat disimpan.
  • Memiliki anotasi @Serializable: Selain mengimplementasikan NavKey, class dan objek utama Anda harus ditandai dengan anotasi @Serializable.

Cuplikan berikut menunjukkan implementasi rememberNavBackStack yang benar:

@Serializable
data object Home : NavKey

@Composable
fun NavBackStack() {
    val backStack = rememberNavBackStack(Home)
}

Alternatif: Menyimpan di ViewModel

Pendekatan lain untuk mengelola data sebelumnya adalah dengan menyimpannya di ViewModel. Untuk persistensi melalui penghentian proses saat menggunakan ViewModel atau penyimpanan kustom lainnya, Anda perlu:

  • Pastikan kunci Anda dapat diserialisasi: Sama seperti rememberNavBackStack, kunci navigasi Anda harus dapat diserialisasi.
  • Menangani serialisasi dan deserialisasi secara manual: Anda bertanggung jawab untuk menyimpan representasi berserial dari setiap kunci secara manual ke, dan mendeserialisasinya dari, penyimpanan persisten (misalnya, SharedPreferences, database, atau file) saat aplikasi Anda masuk ke latar belakang atau dipulihkan.

Mencakup ViewModel dtk hingga NavEntry dtk

ViewModels digunakan untuk mempertahankan status terkait UI di seluruh perubahan konfigurasi, seperti rotasi layar. Secara default, ViewModels dicakup ke ViewModelStoreOwner terdekat, yang biasanya merupakan Activity atau Fragment Anda.

Namun, Anda mungkin ingin mencakup ViewModel ke NavEntry tertentu (yaitu, layar atau tujuan tertentu) di data sebelumnya, bukan seluruh Activity. Hal ini memastikan bahwa status ViewModel dipertahankan hanya saat NavEntry tertentu tersebut menjadi bagian dari data sebelumnya, dan dihapus saat NavEntry dikeluarkan.

Library add-on androidx.lifecycle:lifecycle-viewmodel-navigation3 menyediakan NavEntryDecorator yang memfasilitasi hal ini. Decorator ini menyediakan ViewModelStoreOwner untuk setiap NavEntry. Saat Anda membuat ViewModel di dalam konten NavEntry (misalnya, menggunakan viewModel() di Compose), ViewModel tersebut akan otomatis dicakup ke kunci NavEntry tertentu di tumpukan belakang. Artinya, ViewModel dibuat saat NavEntry ditambahkan ke back stack, dan dihapus saat dihapus.

Untuk menggunakan NavEntryDecorator untuk membatasi cakupan ViewModel ke NavEntry, ikuti langkah-langkah berikut:

  1. Tambahkan dependensi androidx.lifecycle:lifecycle-viewmodel-navigation3 ke file app/build.gradle.kts Anda.
  2. Tambahkan rememberSaveableStateHolderNavEntryDecorator() ke daftar entryDecorators saat membuat NavDisplay.
  3. Tambahkan dekorator lain ke NavDisplay Anda.

NavDisplay(
    entryDecorators = listOf(
        // Add the default decorators for managing scenes and saving state
        rememberSceneSetupNavEntryDecorator(),
        rememberSavedStateNavEntryDecorator(),
        // Then add the view model store decorator
        rememberViewModelStoreNavEntryDecorator()
    ),
    backStack = backStack,
    entryProvider = entryProvider { },
)