Bagian berikut menjelaskan strategi untuk menyimpan data sebelumnya dan menyimpan status yang terkait dengan entri di data sebelumnya.
Menyimpan data sebelumnya
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 Navigasi 3, Anda memiliki data sebelumnya, sehingga tidak ada panduan
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 data
sebelumnya yang tetap ada di seluruh perubahan konfigurasi dan penghentian proses.
Agar rememberNavBackStack
berfungsi dengan benar, setiap kunci dalam data sebelumnya
harus mematuhi persyaratan tertentu:
- Terapkan antarmuka
NavKey
: Setiap kunci dalam data sebelumnya harus mengimplementasikan antarmukaNavKey
. Ini berfungsi sebagai antarmuka penanda yang memberi sinyal ke library bahwa kunci dapat disimpan. - Memiliki anotasi
@Serializable
: Selain mengimplementasikanNavKey
, 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 harus:
- 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 serialisasi setiap kunci secara manual ke, dan
melakukan deserialisasi dari, penyimpanan persisten (misalnya,
SharedPreferences
, database, atau file) saat aplikasi Anda beralih ke latar belakang atau dipulihkan.
Menentukan cakupan ViewModel
ke NavEntry
ViewModels
digunakan untuk mempertahankan status terkait UI di seluruh perubahan konfigurasi,
seperti rotasi layar. Secara default, ViewModels
dicakup ke ViewModelStoreOwner
terdekat, yang biasanya adalah Activity
atau Fragment
Anda.
Namun, Anda mungkin ingin menentukan cakupan ViewModel
ke NavEntry
tertentu (yaitu
layar atau tujuan tertentu) di data sebelumnya, bukan seluruh
Activity
. Hal ini memastikan bahwa status ViewModel
hanya dipertahankan saat
NavEntry
tertentu adalah bagian dari data sebelumnya, dan dihapus saat
NavEntry
ditampilkan.
Library add-on androidx.lifecycle:lifecycle-viewmodel-navigation3
menyediakan
NavEntryDecorator
yang memfasilitasi hal ini. Dekorator ini menyediakan
ViewModelStoreOwner
untuk setiap NavEntry
. Saat Anda membuat ViewModel
di dalam
konten NavEntry
(misalnya, menggunakan viewModel()
di Compose), ViewModel
tersebut akan otomatis
dikaitkan ke kunci NavEntry
tertentu di data sebelumnya. Ini berarti
ViewModel
dibuat saat NavEntry
ditambahkan ke data sebelumnya, dan
dihapus saat dihapus.
Untuk menggunakan NavEntryDecorator
guna menentukan cakupan ViewModel
ke NavEntry
, ikuti langkah-langkah
berikut:
- Tambahkan dependensi
androidx.lifecycle:lifecycle-viewmodel-navigation3
ke fileapp/build.gradle.kts
Anda. - Tambahkan
rememberSavedStateNavEntryDecorator()
ke daftarentryDecorators
saat membuatNavDisplay
. - 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 { }, )