بخشهای بعدی، استراتژیهایی را برای ذخیره پشته پشتی و ذخیرهسازی وضعیت مرتبط با ورودیهای پشته پشتی شما شرح میدهند.
پشته خود را ذخیره کنید
اطمینان از اینکه وضعیت ناوبری برنامه شما در رویدادهای مختلف چرخه عمر، از جمله تغییرات پیکربندی و مرگ فرآیند، حفظ میشود، برای یک تجربه کاربری خوب بسیار مهم است. در Navigation 3، شما مالک back stack خود هستید، بنابراین دستورالعملهای دقیقی در مورد نحوه ایجاد یا ذخیره آن وجود ندارد. با این حال، Navigation 3 یک روش راحت ارائه میدهد که یک back stack قابل ذخیره را در اختیار شما قرار میدهد: rememberNavBackStack .
از rememberNavBackStack استفاده کنید
تابع ترکیبی rememberNavBackStack برای ایجاد یک پشته پشتی طراحی شده است که در طول تغییرات پیکربندی و مرگ فرآیند، باقی میماند.
برای اینکه rememberNavBackStack به درستی کار کند، هر کلید در back stack شما باید الزامات خاصی را رعایت کند:
- پیادهسازی رابط
NavKey: هر کلید در back stack باید رابطNavKeyرا پیادهسازی کند. این به عنوان یک رابط نشانگر عمل میکند که به کتابخانه علامت میدهد که کلید میتواند ذخیره شود. - حاشیهنویسی
@Serializableرا داشته باشید : علاوه بر پیادهسازیNavKey، کلاسها و اشیاء کلید شما باید با حاشیهنویسی@Serializableعلامتگذاری شوند.
قطعه کد زیر پیادهسازی صحیح rememberNavBackStack را نشان میدهد:
@Serializable data object Home : NavKey @Composable fun NavBackStack() { val backStack = rememberNavBackStack(Home) }
جایگزین: ذخیره سازی در ViewModel
رویکرد دیگر برای مدیریت پشته داده، ذخیره آن در یک ViewModel است. برای ماندگاری در طول مرگ فرآیند هنگام استفاده از ViewModel یا هر فضای ذخیرهسازی سفارشی دیگر، باید:
- مطمئن شوید که کلیدهای شما قابلیت سریالسازی دارند : درست مانند
rememberNavBackStack، کلیدهای ناوبری شما باید قابلیت سریالسازی داشته باشند. - مدیریت سریالسازی و deserialization به صورت دستی : شما مسئول ذخیره دستی نمایش سریالسازی شده هر کلید در حافظه دائمی (مثلاً
SharedPreferences، یک پایگاه داده یا یک فایل) و deserialize کردن آن از حافظه دائمی هنگام اجرای برنامه در پسزمینه یا بازیابی آن هستید.
تعیین محدوده ViewModel ها برای NavEntry ها
ViewModels برای حفظ وضعیت مربوط به رابط کاربری در طول تغییرات پیکربندی، مانند چرخش صفحه نمایش، استفاده میشوند. به طور پیشفرض، ViewModels به نزدیکترین ViewModelStoreOwner ، که معمولاً Activity یا Fragment شماست، محدود میشوند.
با این حال، ممکن است بخواهید یک ViewModel به یک NavEntry خاص (یعنی یک صفحه یا مقصد خاص) در back stack محدود کنید، نه کل Activity . این تضمین میکند که وضعیت ViewModel فقط تا زمانی که آن NavEntry خاص بخشی از back stack است، حفظ میشود و با باز شدن NavEntry پاک میشود.
کتابخانه افزونه androidx.lifecycle:lifecycle-viewmodel-navigation3 یک NavEntryDecorator ارائه میدهد که این کار را تسهیل میکند. این دکوراتور برای هر NavEntry یک ViewModelStoreOwner فراهم میکند. وقتی یک ViewModel درون محتوای NavEntry ایجاد میکنید (مثلاً با استفاده از viewModel() در Compose)، به طور خودکار به کلید خاص NavEntry در back stack محدود میشود. این بدان معناست که ViewModel هنگام اضافه شدن NavEntry به back stack ایجاد میشود و هنگام حذف آن پاک میشود.
برای استفاده از NavEntryDecorator برای تعیین محدوده ViewModel ها به NavEntry ها، مراحل زیر را دنبال کنید:
- وابستگی
androidx.lifecycle:lifecycle-viewmodel-navigation3را به فایلapp/build.gradle.ktsخود اضافه کنید. - هنگام ساخت یک
NavDisplay،rememberSaveableStateHolderNavEntryDecorator()را به لیست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 { }, )