ذخیره و مدیریت وضعیت ناوبری
با مجموعهها، منظم بمانید
ذخیره و طبقهبندی محتوا براساس اولویتهای شما.
بخشهای زیر استراتژیهایی را برای ذخیره پشته و وضعیت ذخیرهسازی مرتبط با ورودیهای پشته شما توضیح میدهند.
پشته خود را ذخیره کنید
اطمینان از تداوم وضعیت ناوبری برنامه شما در رویدادهای مختلف چرخه حیات، از جمله تغییرات پیکربندی و مرگ فرآیند، برای یک تجربه کاربری خوب بسیار مهم است. در Navigation 3، شما مالک پشته پشتی خود هستید، بنابراین دستورالعمل های دقیقی در مورد نحوه ایجاد یا ذخیره آن وجود ندارد. با این حال، Navigation 3 یک روش راحت ارائه می دهد که یک پشته قابل ذخیره را در اختیار شما قرار می دهد: rememberNavBackStack
.
از rememberNavBackStack
استفاده کنید
تابع composable rememberNavBackStack
برای ایجاد یک پشته پشتی طراحی شده است که در تمام تغییرات پیکربندی و مرگ پردازش باقی می ماند.
برای اینکه rememberNavBackStack
به درستی کار کند، هر کلید در پشته شما باید الزامات خاصی را رعایت کند:
- پیاده سازی رابط
NavKey
: هر کلید در پشته پشتی باید رابط NavKey
را پیاده سازی کند. این به عنوان یک رابط نشانگر عمل می کند که به کتابخانه سیگنال می دهد که کلید می تواند ذخیره شود. - حاشیهنویسی
@Serializable
را داشته باشید : علاوه بر پیادهسازی NavKey
، کلاسها و اشیاء کلیدی شما باید با حاشیهنویسی @Serializable
علامتگذاری شوند.
قطعه زیر پیاده سازی صحیح rememberNavBackStack
را نشان می دهد:
@Serializable
data object Home : NavKey
@Composable
fun NavBackStack() {
val backStack = rememberNavBackStack(Home)
}
جایگزین: ذخیره سازی در ViewModel
روش دیگر برای مدیریت پشته خود ذخیره آن در ViewModel
است. برای تداوم مرگ فرآیند هنگام استفاده از ViewModel
یا هر حافظه سفارشی دیگری، باید:
- اطمینان حاصل کنید که کلیدهایتان قابل سریالسازی هستند : دقیقاً مانند
rememberNavBackStack
، کلیدهای ناوبری شما باید سریالسازی شوند. - مدیریت سریالسازی و سریالزدایی بهصورت دستی : وقتی برنامهتان در پسزمینه میرود یا در حال بازیابی است، شما مسئول ذخیرهسازی دستی نمایش سریالشده هر کلید در فضای ذخیرهسازی دائمی (مثلاً
SharedPreferences
، پایگاه داده یا فایل) هستید.
محدوده ViewModel
s به NavEntry
s
ViewModels
برای حفظ وضعیت مرتبط با رابط کاربری در سراسر تغییرات پیکربندی، مانند چرخش صفحه استفاده میشود. بهطور پیشفرض، ViewModels
به نزدیکترین ViewModelStoreOwner
، که معمولاً Activity
یا Fragment
شما است، قرار میگیرد.
با این حال، ممکن است بخواهید یک ViewModel
به یک NavEntry
خاص (یعنی یک صفحه یا مقصد خاص) در پشته پشتی، نه کل Activity
، محدود کنید. این تضمین میکند که وضعیت ViewModel
فقط در زمانی که آن NavEntry
خاص بخشی از پشته پشتی است حفظ میشود و وقتی NavEntry
باز میشود پاک میشود.
کتابخانه الحاقی androidx.lifecycle:lifecycle-viewmodel-navigation3
یک NavEntryDecorator
ارائه می دهد که این کار را تسهیل می کند. این دکوراتور یک ViewModelStoreOwner
برای هر NavEntry
فراهم می کند. هنگامی که یک ViewModel
در داخل محتوای NavEntry
ایجاد می کنید (به عنوان مثال، با استفاده از viewModel()
در Compose)، به طور خودکار به کلید NavEntry
خاص در پشته باز می شود. این بدان معناست که ViewModel
زمانی ایجاد می شود که NavEntry
به پشته پشتی اضافه می شود، و پس از حذف پاک می شود.
برای استفاده از NavEntryDecorator
برای تعیین دامنه ViewModel
به NavEntry
s، این مراحل را دنبال کنید:
- وابستگی
androidx.lifecycle:lifecycle-viewmodel-navigation3
به فایل app/build.gradle.kts
خود اضافه کنید. - هنگام ساخت
NavDisplay
، rememberSavedStateNavEntryDecorator()
را به لیست entryDecorators
اضافه کنید. - تزئینات دیگر را به
NavDisplay
خود اضافه کنید.
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 { },
)
محتوا و نمونه کدها در این صفحه مشمول پروانههای توصیفشده در پروانه محتوا هستند. جاوا و OpenJDK علامتهای تجاری یا علامتهای تجاری ثبتشده Oracle و/یا وابستههای آن هستند.
تاریخ آخرین بهروزرسانی 2025-07-29 بهوقت ساعت هماهنگ جهانی.
[[["درک آسان","easyToUnderstand","thumb-up"],["مشکلم را برطرف کرد","solvedMyProblem","thumb-up"],["غیره","otherUp","thumb-up"]],[["اطلاعاتی که نیاز دارم وجود ندارد","missingTheInformationINeed","thumb-down"],["بیشازحد پیچیده/ مراحل بسیار زیاد","tooComplicatedTooManySteps","thumb-down"],["قدیمی","outOfDate","thumb-down"],["مشکل ترجمه","translationIssue","thumb-down"],["مشکل کد / نمونهها","samplesCodeIssue","thumb-down"],["غیره","otherDown","thumb-down"]],["تاریخ آخرین بهروزرسانی 2025-07-29 بهوقت ساعت هماهنگ جهانی."],[],[],null,["# Save and manage navigation state\n\nThe following sections describe strategies for saving your back stack and\nstoring state associated with entries on your back stack.\n\nSave your back stack\n--------------------\n\nEnsuring your app's navigation state persists across various lifecycle events,\nincluding configuration changes and process death, is crucial for a good user\nexperience. In Navigation 3, you own your back stack, so there aren't strict\nguidelines on how you should create or save it. However, Navigation 3 does offer\na convenience method that provides you with a saveable back stack:\n[`rememberNavBackStack`](/reference/kotlin/androidx/navigation3/runtime/package-summary#rememberNavBackStack(kotlin.Array)).\n\n### Use `rememberNavBackStack`\n\nThe `rememberNavBackStack` composable function is designed to create a back\nstack that persists across configuration changes and process death.\n\nFor `rememberNavBackStack` to function correctly, each key in your back stack\nmust adhere to specific requirements:\n\n- **Implement `NavKey` interface** : Every key in the back stack must implement the [`NavKey`](/reference/kotlin/androidx/navigation3/runtime/NavKey) interface. This acts as a marker interface that signals to the library that the key can be saved.\n- **Have the `@Serializable` annotation** : In addition to implementing `NavKey`, your key classes and objects must be marked with the `@Serializable` annotation.\n\nThe following snippet shows a correct implementation of `rememberNavBackStack`:\n\n\n```kotlin\n@Serializable\ndata object Home : NavKey\n\n@Composable\nfun NavBackStack() {\n val backStack = rememberNavBackStack(Home)\n}https://github.com/android/snippets/blob/26d364466ee1c03d658ba2f0905f7cc1a97afefa/compose/snippets/src/main/java/com/example/compose/snippets/navigation3/savingstate/SavingStateSnippets.kt#L30-L36\n```\n\n\u003cbr /\u003e\n\n### Alternative: Storing in a `ViewModel`\n\nAnother approach to managing your back stack is to store it in a `ViewModel`.\nFor persistence through process death when using a `ViewModel` or any other\ncustom storage, you need to:\n\n- **Ensure your keys are serializable** : Just like with `rememberNavBackStack`, your navigation keys must be serializable.\n- **Handle serialization and deserialization manually** : You're responsible for manually saving the serialized representation of each key to, and deserializing it from, persistent storage (e.g., `SharedPreferences`, a database, or a file) when your app is going into the background or being restored.\n\nScoping `ViewModel`s to `NavEntry`s\n-----------------------------------\n\n`ViewModels` are used to retain UI-related state across configuration changes,\nsuch as screen rotations. By default, `ViewModels` are scoped to the nearest\n`ViewModelStoreOwner`, which is typically your `Activity` or `Fragment`.\n\nHowever, you might want to scope a `ViewModel` to a specific `NavEntry` (i.e., a\nspecific screen or destination) on the back stack, rather than the entire\n`Activity`. This ensures that the `ViewModel`'s state is retained only while\nthat particular `NavEntry` is part of the back stack, and is cleared when the\n`NavEntry` is popped.\n\nThe `androidx.lifecycle:lifecycle-viewmodel-navigation3` add-on library provides\na `NavEntryDecorator` that facilitates this. This decorator provides a\n`ViewModelStoreOwner` for each `NavEntry`. When you create a `ViewModel` inside a\n`NavEntry`'s content (e.g., using `viewModel()` in Compose), it is automatically\nscoped to that specific `NavEntry`'s key on the back stack. This means the\n`ViewModel` is created when the `NavEntry` is added to the back stack, and\ncleared when it's removed.\n\nTo use `NavEntryDecorator` for scoping `ViewModel`s to `NavEntry`s, follow these\nsteps:\n\n1. Add the `androidx.lifecycle:lifecycle-viewmodel-navigation3` dependency to your `app/build.gradle.kts` file.\n2. Add [`rememberSavedStateNavEntryDecorator()`](/reference/kotlin/androidx/navigation3/runtime/package-summary#rememberSavedStateNavEntryDecorator(androidx.compose.runtime.saveable.SaveableStateHolder)) to the list of `entryDecorators` when constructing a `NavDisplay`.\n3. Add other decorators into your `NavDisplay`.\n\n\n```kotlin\nNavDisplay(\n entryDecorators = listOf(\n // Add the default decorators for managing scenes and saving state\n rememberSceneSetupNavEntryDecorator(),\n rememberSavedStateNavEntryDecorator(),\n // Then add the view model store decorator\n rememberViewModelStoreNavEntryDecorator()\n ),\n backStack = backStack,\n entryProvider = entryProvider { },\n)https://github.com/android/snippets/blob/26d364466ee1c03d658ba2f0905f7cc1a97afefa/compose/snippets/src/main/java/com/example/compose/snippets/navigation3/savingstate/SavingStateSnippets.kt#L45-L55\n```\n\n\u003cbr /\u003e"]]