بخشهای زیر استراتژیهایی را برای ذخیره پشته و وضعیت ذخیرهسازی مرتبط با ورودیهای پشته شما توضیح میدهند.
پشته خود را ذخیره کنید
اطمینان از تداوم وضعیت ناوبری برنامه شما در رویدادهای مختلف چرخه حیات، از جمله تغییرات پیکربندی و مرگ فرآیند، برای یک تجربه کاربری خوب بسیار مهم است. در 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 { }, )