میتوانید از میاناهای برنامهسازی کاربردی ایمن نوع توکار برای ارائه ایمنی نوع زمان ترجمه برای
گراف پیمایش استفاده کنید. این APIها زمانی دردسترس هستند که برنامهتان از Navigation
Compose یا Navigation Kotlin DSL استفاده کند. از تاریخ Navigation
2.8.0 دردسترس هستند.
این میاناهای برنامهسازی کاربردی معادل چیزی است که آرگومانهای ایمن برای گرافهای پیمایش ساختهشده بااستفاده از XML ارائه میدهد.
تعریف مسیرها
برای استفاده از مسیرهای نوع امن در Compose، ابتدا باید کلاسها یا اشیا سریالشدنی را که نشاندهنده مسیرهای شما هستند تعریف کنید.
برای تعریف کردن اشیای سریالشدنی، از
افزایه سریالسازی Kotlin،
یادداشت @Serializable استفاده کنید.
با افزودن این
وابستگیها میتوانید این افزایه را به پروژهتان اضافه کنید.
از قوانین زیر برای تصمیمگیری درباره نوع مسیری که میخواهید استفاده کنید استفاده کنید:
- شیء: از شیء برای مسیرهای بدون آرگومان استفاده کنید.
- کلاس: برای مسیرهای دارای آرگومان از کلاس یا کلاس داده استفاده کنید.
KClass<T>: اگر نیازی به ارسال آرگومان ندارید، مثلاً کلاس بدون پارامتر یا کلاسی که همه پارامترهای آن مقدار پیشفرض دارند، از این استفاده کنید- برای مثال:
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، دست یافت.