بخشهای زیر استراتژیهایی را برای ذخیره کردن پشته برگشت و ذخیره کردن وضعیت مرتبط با ورودیهای پشته برگشت شرح میدهد.
ذخیره کردن پشته برگشت
اطمینان از اینکه وضعیت پیمایش برنامه شما در رویدادهای مختلف چرخه حیات، ازجمله تغییرات پیکربندی و مرگ فرایند، حفظ میشود برای تجربه کاربری خوب ضروری است. در «پیمایش ۳»، مالک پشته برگشت خودتان هستید، بنابراین
دستورالعملهای دقیقی درباره نحوه ایجاد یا ذخیره آن وجود ندارد. بااینحال، «پیمایش ۳» روشی آسان ارائه میدهد که پشته برگشتی ذخیرهشدنی را دراختیارتان قرار میدهد:
rememberNavBackStack.
استفاده از rememberNavBackStack
تابع ساختنی rememberNavBackStack برای ایجاد پشته پشتیبانی طراحی شده است که درطول تغییرات پیکربندی و مرگ فرایند حفظ میشود.
برای اینکه rememberNavBackStack بهدرستی کار کند، هر کلید در پشته برگشت شما
باید از الزامات خاصی پیروی کند:
- پیادهسازی میانای
NavKey: هر کلید در پشته برگشت باید میانایNavKeyرا پیادهسازی کند. این بهعنوان یک رابط نشانگر عمل میکند که به کتابخانه اطلاع میدهد کلید میتواند ذخیره شود. - دارای
@Serializableگزارمان: علاوهبر پیادهسازیNavKey، کلاسها و اشیای کلیدی شما باید با گزارمان@Serializableعلامتگذاری شوند.
تکهکد زیر پیادهسازی صحیح rememberNavBackStack را نشان میدهد:
@Serializable data object Home : NavKey @Composable fun NavBackStack() { val backStack = rememberNavBackStack(Home) }
پشته برگشتی با زیرنوعهای NavKey را بهخاطر داشته باش
تابع ترکیبپذیر rememberNavBackStack یک NavBackStack<NavKey> برمیگرداند.
اگر برنامه شما زیرنوع NavKey خود را تعریف میکند که همه کلیدهای آن از آن
بهارث میرسند، میتوانید با پیادهسازی تابع سفارشی remember
، این نوع را حفظ کنید، به این صورت:
@Serializable sealed interface MyAppNavKey : NavKey @Serializable data object ScreenA: MyAppNavKey @Serializable data class ScreenB(val id: String): MyAppNavKey @Composable fun rememberMyAppNavBackStack(vararg elements: MyAppNavKey): NavBackStack<MyAppNavKey> { return rememberSerializable(serializer = serializer()) { NavBackStack(*elements) } } @Composable fun MyApp() { // defaultNavBackStack is NavBackStack<NavKey> val defaultNavBackStack = rememberNavBackStack(ScreenA) // myAppNavBackStack is NavBackStack<MyAppNavKey> val myAppNavBackStack = rememberMyAppNavBackStack(ScreenA) }
برای نمونههای بیشتر—ازجمله نحوه مدیریت چندریختی باز—به
NavBackStackSamples مراجعه کنید.
جایگزین: ذخیره در ViewModel
رویکرد دیگر برای مدیریت پشته برگشت، ذخیره کردن آن در ViewModel است.
برای پایداری درصورت مرگ پردازش هنگام استفاده از ViewModel یا هر فضای ذخیرهسازی سفارشی دیگری، باید:
- مطمئن شوید کلیدهایتان قابلیت سریالسازی داشته باشند: درست مثل
rememberNavBackStack، کلیدهای پیمایش شما باید قابلیت سریالسازی داشته باشند. - مدیریت دستی سریالسازی و غیرسریالسازی: مسئولیت دارید
نمایش سریالشده هر کلید را بهصورت دستی در فضای ذخیرهسازی ماندگار (برای نمونه،
SharedPreferences، پایگاه داده، یا فایل) ذخیره کنید و وقتی برنامهتان به پسزمینه میرود یا بازیابی میشود، آن را از فضای ذخیرهسازی ماندگار غیرسریالسازی کنید.
محدود کردن ViewModel نمونه به NavEntry شیء
از ViewModels برای حفظ وضعیت مربوط به میانای کاربر در تغییرات پیکربندی،
مثل چرخش صفحه، استفاده میشود. بهطور پیشفرض، ViewModels به نزدیکترین
ViewModelStoreOwner محدود میشود که معمولاً Activity یا Fragment شما است.
بااینحال، ممکن است بخواهید ViewModel را بهجای کل Activity، به NavEntry خاصی (یعنی صفحه یا مقصد خاصی) در پشته برگشت محدود کنید. این کار تضمین میکند که وضعیت ViewModel فقط زمانی حفظ شود که
آن NavEntry خاص بخشی از پشته برگشت باشد و وقتی
NavEntry از پشته برگشت برداشته میشود وضعیت پاک شود.
کتابخانه برافزای androidx.lifecycle:lifecycle-viewmodel-navigation3
NavEntryDecorator را ارائه میدهد که این کار را تسهیل میکند. این تزئینکننده برای هر NavEntry، یک
ViewModelStoreOwner ارائه میدهد. وقتی ViewModel را در محتوای NavEntry ایجاد میکنید (برای نمونه، بااستفاده از viewModel() در «نوشتن»)، بهطور خودکار به کلید آن NavEntry خاص در پشته پشتی محدود میشود. این یعنی وقتی NavEntry به پشته برگشت اضافه میشود،
ViewModel ایجاد میشود و وقتی برداشته میشود پاک میشود.
برای استفاده از NavEntryDecorator برای محدود کردن ViewModel به NavEntry، این مراحل را دنبال کنید:
- وابستگی
androidx.lifecycle:lifecycle-viewmodel-navigation3را به فایلapp/build.gradle.ktsخود اضافه کنید. - هنگام ساختن
NavDisplay،rememberSaveableStateHolderNavEntryDecorator()پیشفرض را به فهرستentryDecoratorsاضافه کنید. -
rememberViewModelStoreNavEntryDecorator()را به فهرستentryDecoratorsاضافه کنید.
NavDisplay( entryDecorators = listOf( // Add the default decorators for managing scenes and saving state rememberSaveableStateHolderNavEntryDecorator(), // Then add the view model store decorator rememberViewModelStoreNavEntryDecorator() ), backStack = backStack, entryProvider = entryProvider { }, )