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.- Na przykład:
Profile::class
- Na przykład:
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, żecomposable<Profile>.- Zdefiniowanie typu miejsca docelowego to bardziej niezawodne podejście niż przekazywanie
routeciągu znaków, jak w przypadkucomposable("profile"). - Klasa trasy definiuje typ każdego argumentu nawigacji, jak w przypadku
val id: String, więc nie ma potrzeby korzystania z elementuNavArgument. - W przypadku profilu trasy metoda rozszerzenia
toRoute()ponownie tworzy obiektProfilezNavBackStackEntryi jego argumentów.
Więcej informacji o ogólnych zasadach projektowania schematu znajdziesz na stronie Projektowanie schematu nawigacyjnego.
Przejdź do sekcji Tryb bezpieczny.
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.