ذخیره و مدیریت وضعیت ناوبری

بخش‌های بعدی، استراتژی‌هایی را برای ذخیره پشته پشتی و ذخیره‌سازی وضعیت مرتبط با ورودی‌های پشته پشتی شما شرح می‌دهند.

پشته خود را ذخیره کنید

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

  1. وابستگی androidx.lifecycle:lifecycle-viewmodel-navigation3 را به فایل app/build.gradle.kts خود اضافه کنید.
  2. هنگام ساخت یک NavDisplay ، rememberSaveableStateHolderNavEntryDecorator() را به لیست entryDecorators اضافه کنید.
  3. دکوراتورهای دیگری را به 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 { },
)