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

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

این میاناهای برنامه‌سازی کاربردی معادل چیزی است که آرگومان‌های ایمن برای گراف‌های پیمایش ساخته‌شده بااستفاده از XML ارائه می‌دهد.

تعریف مسیرها

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

برای تعریف کردن اشیای سریال‌شدنی، از افزایه سریال‌سازی Kotlin، یادداشت @Serializable استفاده کنید. با افزودن این وابستگی‌ها می‌توانید این افزایه را به پروژه‌تان اضافه کنید.

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

  • شیء: از شیء برای مسیرهای بدون آرگومان استفاده کنید.
  • کلاس: برای مسیرهای دارای آرگومان از کلاس یا کلاس داده استفاده کنید.
  • 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() برای تعریف عناصر ترکیبی به‌عنوان مقصد در گراف ناوبری استفاده کنید.

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 نیست.
  • برای مسیر نمایه، روش افزونه toRoute() شیء Profile را از NavBackStackEntry و آرگومان‌های آن بازسازی می‌کند.

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

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

برای دسترسی به آرگومان‌ها از مسیر نوع امن در ViewModel، می‌توانید مسیر را از SavedStateHandle با فراخوانی SavedStateHandle.toRoute<T>() بازیابی کنید، که در آن 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> در گراف پیمایش هدایت می‌کند. با بازسازی Profile بااستفاده از NavBackStackEntry.toRoute و خواندن ویژگی‌های آن، می‌توان به آرگومان‌های ناوبری، مثل id، دست یافت.

منابع بیشتر