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

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

ذخیره کردن پشته برگشت

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

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