Wpisz zabezpieczenia w Kotlin DSL i w nawigacji – tworzenie

Możesz używać wbudowanych interfejsów API, które zapewniają bezpieczeństwo podczas kompilacji w czasie kompilacji. Te interfejsy API są dostępne, gdy Twoja aplikacja korzysta z nawigacji tworzenia wiadomości lub interfejsu DSL nawigacji Kotlin. Są dostępne od Navigation 2.8.0.

Te interfejsy API są odpowiednikiem funkcji Safe Args udostępnianych przez wykresy nawigacyjne wbudowanych w pliki XML do nawigacji.

Zdefiniuj trasy

Aby używać tras bezpiecznych dla typu w funkcji Compose, musisz najpierw zdefiniować klasy lub obiekty możliwe do serializacji, które reprezentują Twoje trasy.

  • Object (Obiekt): używaj obiektu w przypadku tras bez argumentów.
  • Class (Klasa): użyj klasy lub klasy danych dla tras z argumentami.
  • KClass<T>: użyj tej opcji, jeśli nie musisz przekazywać argumentów, np. klasa bez parametrów lub klasa, w której wszystkie parametry mają wartości domyślne.
    1. Przykład: Profile::class

W obu przypadkach obiekt lub klasa musi mieć możliwość serializacji.

Na przykład:

// 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)

Utwórz wykres

Następnie zdefiniuj wykres nawigacyjny. Użyj funkcji composable(), aby zdefiniować elementy kompozycyjne jako miejsca docelowe na wykresie nawigacyjnym.

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

Zaobserwuj w tym przykładzie:

  • composable() przyjmuje parametr typu. Czyli composable<Profile>.
  • Definiowanie typu miejsca docelowego jest bardziej niezawodne niż przekazywanie ciągu znaków route (jak w composable("profile")).
  • Klasa trasy określa typ każdego argumentu nawigacji, np. val id: String, więc nie ma potrzeby użycia funkcji NavArgument.
  • W przypadku trasy profilu metoda rozszerzenia toRoute() odtwarza obiekt Profile z NavBackStackEntry i jego argumentów.

Więcej informacji o projektowaniu wykresu znajdziesz na stronie Projektowanie wykresu nawigacyjnego.

Możesz też przejść do funkcji kompozycyjnej, używając funkcji navigate(), przekazując wystąpienie trasy:

navController.navigate(Profile(id = 123))

Przekieruje użytkownika do miejsca docelowego composable<Profile> na wykresie nawigacyjnym. Wszystkie argumenty nawigacyjne, takie jak id, można uzyskać, zrekonstruując Profile za pomocą funkcji NavBackStackEntry.toRoute i odczytując jego właściwości.

Dodatkowe materiały