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
route
cią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 obiektProfile
zNavBackStackEntry
i 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.