Wpisz zabezpieczenia w Kotlin DSL i w nawigacji – tworzenie

Aby zapewnić bezpieczeństwo typów w czasie kompilacji w grafie nawigacji, możesz użyć wbudowanych interfejsów API bezpiecznych pod względem typów. Te interfejsy API są dostępne, gdy aplikacja korzysta z Navigation Compose lub Navigation Kotlin DSL. Są one dostępne od Navigation 2.8.0.

Te interfejsy API są odpowiednikiem tego, co Safe Args udostępnia w przypadku grafów nawigacyjnych utworzonych za pomocą pliku XML.

Definiowanie tras

Aby korzystać z tras bezpiecznych pod względem typu w komponencie Compose, musisz najpierw zdefiniować serializowane klasy lub obiekty, które reprezentują trasy.

Aby zdefiniować obiekty serializowane, użyj adnotacji @Serializable udostępnianej przez wtyczkę serializacji Kotlina. Ten wtyczkę możesz dodać do projektu, dodając te zależności.

Aby zdecydować, jaki typ trasy wybrać, kieruj się tymi zasadami:

  • Obiekt: użyj obiektu do tras bez argumentów.
  • Klasa: użyj klasy lub klasy danych w przypadku tras z argumentami.
  • KClass<T>: użyj, jeśli nie musisz przekazywać argumentów, np. klasy bez parametrów lub klasy, w której wszystkie parametry mają wartości domyślne.
    1. Na przykład: Profile::class

We wszystkich przypadkach obiekt lub klasa muszą być możliwe do serializacji.

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)

Tworzenie wykresu

Następnie musisz zdefiniować graf nawigacji. Użyj funkcji composable(), aby zdefiniować elementy składane jako miejsca docelowe w grafu nawigacji.

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

Zwróć uwagę na te kwestie w tym przykładzie:

  • composable() przyjmuje parametr typu. Oznacza to, że composable<Profile>.
  • Zdefiniowanie typu miejsca docelowego to bardziej niezawodne podejście niż przekazywanie route ciągu znaków, jak w przypadku composable("profile").
  • Klasa trasy definiuje typ każdego argumentu nawigacji, jak w przypadku val id: String, więc nie ma potrzeby korzystania z elementu NavArgument.
  • W przypadku profilu trasy metoda rozszerzenia toRoute() ponownie tworzy obiekt ProfileNavBackStackEntry i jego argumentów.

Więcej informacji o ogólnych zasadach projektowania schematu znajdziesz na stronie Projektowanie schematu nawigacyjnego.

Na koniec możesz przejść do składanego zasobu za pomocą funkcji navigate(), przekazując instancję trasy:

navController.navigate(Profile(id = 123))

Użytkownik przechodzi do miejsca docelowego composable<Profile> na diagramie nawigacji. Argumenty nawigacji, takie jak id, można uzyskać, odtwarzając Profile za pomocą NavBackStackEntry.toRoute i czytając jego właściwości.

Dodatkowe materiały