בטיחות הקלדה ב-Kotlin DSL וב-Navigation Compose

אתם יכולים להשתמש בממשקי API מובנים שמאפשרים לבדוק את סוגי הנתונים כדי לספק בטיחות סוגים בזמן הקומפילציה לגרף הניווט. ממשקי ה-API האלה זמינים כשהאפליקציה משתמשת ב-Navigation Compose או ב-Navigation Kotlin DSL. הם זמינים החל מ-Navigation 2.8.0.

ממשקי ה-API האלה מקבילים למה ש-Safe Args מספק לתרשימי ניווט שנבנו באמצעות XML.

הגדרת מסלולים

כדי להשתמש בנתיבים בטוחים מבחינת טיפוס ב-Compose, קודם צריך להגדיר מחלקות או אובייקטים שניתנים לסריאליזציה ומייצגים את הנתיבים.

כדי להגדיר אובייקטים שניתנים לסריאליזציה, משתמשים בהערה @Serializable שמופיעה בתוסף Kotlin Serialization. אפשר להוסיף את הפלאגין הזה לפרויקט על ידי הוספת התלויות האלה.

כדי להחליט באיזה סוג מסלול להשתמש, אפשר להיעזר בכללים הבאים:

  • אובייקט: משתמשים באובייקט עבור מסלולים ללא ארגומנטים.
  • Class: משתמשים במחלקה או במחלקת נתונים עבור מסלולים עם ארגומנטים.
  • 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> בתרשים הניווט. אפשר לקבל את כל ארגומנטי הניווט, כמו id, על ידי בנייה מחדש של Profile באמצעות NavBackStackEntry.toRoute וקריאת המאפיינים שלו.

מקורות מידע נוספים