אתם יכולים להשתמש בממשקי API מובנים שמאפשרים לבדוק את סוגי הנתונים כדי לספק בטיחות סוגים בזמן הקומפילציה לגרף הניווט. ממשקי ה-API האלה זמינים כשהאפליקציה משתמשת ב-Navigation
Compose או ב-Navigation Kotlin DSL. הם זמינים החל מ-Navigation
2.8.0.
ממשקי ה-API האלה מקבילים למה ש-Safe Args מספק לתרשימי ניווט שנבנו באמצעות XML.
הגדרת מסלולים
כדי להשתמש בנתיבים בטוחים מבחינת טיפוס ב-Compose, קודם צריך להגדיר מחלקות או אובייקטים שניתנים לסריאליזציה ומייצגים את הנתיבים.
כדי להגדיר אובייקטים שניתנים לסריאליזציה, משתמשים בהערה @Serializable שמופיעה בתוסף Kotlin Serialization.
אפשר להוסיף את הפלאגין הזה לפרויקט על ידי הוספת התלויות האלה.
כדי להחליט באיזה סוג מסלול להשתמש, אפשר להיעזר בכללים הבאים:
- אובייקט: משתמשים באובייקט עבור מסלולים ללא ארגומנטים.
- Class: משתמשים במחלקה או במחלקת נתונים עבור מסלולים עם ארגומנטים.
-
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> בתרשים הניווט. אפשר לקבל את כל ארגומנטי הניווט, כמו id, על ידי בנייה מחדש של Profile באמצעות NavBackStackEntry.toRoute וקריאת המאפיינים שלו.