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

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

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

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

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