ایمنی را در Kotlin DSL و Navigation Compose تایپ کنید

شما می‌توانید از APIهای از پیش تعریف‌شده‌ی type safe برای فراهم کردن امنیت type در زمان کامپایل برای گراف ناوبری خود استفاده کنید. این APIها زمانی در دسترس هستند که برنامه‌ی شما از Navigation Compose یا Navigation Kotlin DSL استفاده کند. آن‌ها از Navigation 2.8.0 در دسترس هستند.

این APIها معادل چیزی هستند که Safe Args برای گراف‌های ناوبری ساخته شده با استفاده از XML فراهم می‌کند.

تعریف مسیرها

برای استفاده از مسیرهای ایمن از نوع داده در Compose، ابتدا باید کلاس‌ها یا اشیاء قابل سریال‌سازی که نمایانگر مسیرهای شما هستند را تعریف کنید.

برای تعریف اشیاء قابل سریال‌سازی، از حاشیه‌نویسی @Serializable که توسط افزونه‌ی Kotlin Serialization ارائه می‌شود، استفاده کنید. این افزونه را می‌توان با اضافه کردن این وابستگی‌ها به پروژه‌ی خود اضافه کرد.

برای تصمیم‌گیری در مورد نوع مسیر مورد نظرتان، از قوانین زیر استفاده کنید:

  • شیء : برای مسیرهای بدون آرگومان از یک شیء استفاده کنید.
  • کلاس : برای مسیرهایی که آرگومان دارند، از یک کلاس یا کلاس داده استفاده کنید.
  • KClass<T> : اگر نیازی به ارسال آرگومان ندارید، مانند کلاسی بدون پارامتر، یا کلاسی که همه پارامترها دارای مقادیر پیش‌فرض هستند، از این نوع استفاده کنید.
    1. برای مثال: Profile::class

در همه موارد، شیء یا کلاس باید قابلیت سریال‌سازی داشته باشد.

برای مثال:

// Define a home route that doesn't take any arguments
@Serializable
object Home

// Define a profile route that takes an ID
@Serializable
data class Profile(val id: String)

نمودار خود را بسازید

در مرحله بعد، باید گراف ناوبری خود را تعریف کنید. از تابع composable() برای تعریف composableها به عنوان مقصد در گراف ناوبری خود استفاده کنید.

NavHost(navController, startDestination = Home) {
     composable<Home> {
         HomeScreen(onNavigateToProfile = { id ->
             navController.navigate(Profile(id))
         })
     }
     composable<Profile> { backStackEntry ->
         val profile: Profile = backStackEntry.toRoute()
         ProfileScreen(profile.id)
     }
}

در این مثال به موارد زیر توجه کنید:

  • composable() یک پارامتر از نوع داده می‌گیرد. این پارامتر، composable<Profile> است.
  • تعریف نوع مقصد، رویکردی قوی‌تر از ارسال رشته route به صورت composable("profile") است.
  • کلاس مسیر نوع هر آرگومان ناوبری را تعریف می‌کند، مانند val id: String ، بنابراین نیازی به NavArgument نیست.
  • برای مسیر profile، متد الحاقی toRoute() شیء Profile را از NavBackStackEntry و آرگومان‌های آن بازسازی می‌کند.

برای اطلاعات بیشتر در مورد نحوه طراحی نمودار خود به طور کلی، به صفحه طراحی نمودار ناوبری خود مراجعه کنید.

دسترسی به آرگومان‌ها در یک ViewModel

برای دسترسی به آرگومان‌های یک مسیر از نوع ایمن در ViewModel ، می‌توانید با فراخوانی SavedStateHandle.toRoute<T>() مسیر را از SavedStateHandle بازیابی کنید، که در آن T کلاس مسیر شماست:

class ProfileViewModel(
    savedStateHandle: SavedStateHandle
) : ViewModel() {
    private val profile = savedStateHandle.toRoute<Profile>()
    private val userInfo: Flow<UserInfo> = userInfoRepository.getUserInfo(profile.id)
}

در نهایت، می‌توانید با استفاده از navigate() و با ارسال نمونه‌ای از مسیر، به کامپوننت خود بروید:

navController.navigate(Profile(id = 123))

این کاربر را به مقصد composable<Profile> در نمودار ناوبری هدایت می‌کند. هرگونه آرگومان ناوبری، مانند id ، را می‌توان با بازسازی Profile با استفاده از NavBackStackEntry.toRoute و خواندن ویژگی‌های آن به دست آورد.

منابع اضافی