Bạn có thể dùng các API an toàn về kiểu tích hợp sẵn để đảm bảo an toàn về kiểu trong thời gian biên dịch cho
biểu đồ điều hướng. Các API này sẽ có sẵn khi ứng dụng của bạn dùng Navigation (Điều hướng)
Compose hoặc Navigation Kotlin DSL. Các báo cáo này có hiệu lực kể từ ngày Navigation
2.8.0
.
Các API này tương đương với những API mà Safe Args cung cấp cho biểu đồ điều hướng tạo bằng XML.
Xác định tuyến
Để sử dụng các tuyến an toàn về kiểu trong Compose, trước tiên, bạn cần xác định tuần tự có thể chuyển đổi các lớp hoặc đối tượng đại diện cho tuyến của bạn.
- Đối tượng: Sử dụng một đối tượng cho các tuyến không có đối số.
- Lớp: Sử dụng lớp hoặc lớp dữ liệu cho các tuyến có đối số.
KClass<T>
: Dùng nếu bạn không cần truyền đối số, chẳng hạn như một lớp không có tham số hoặc lớp mà tất cả các tham số đều có giá trị mặc định- Ví dụ:
Profile::class
- Ví dụ:
Trong cả hai trường hợp, đối tượng hoặc lớp phải chuyển đổi được tuần tự.
Ví dụ:
// 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)
Tạo biểu đồ
Tiếp theo, bạn cần xác định biểu đồ điều hướng. Sử dụng composable()
để xác định các thành phần kết hợp làm đích đến trong biểu đồ điều hướng.
NavHost(navController, startDestination = Home) {
composable<Home> {
HomeScreen(onNavigateToProfile = { id ->
navController.navigate(Profile(id))
})
}
composable<Profile> { backStackEntry ->
val profile: Profile = backStackEntry.toRoute()
ProfileScreen(profile.id)
}
}
Hãy quan sát những điều sau trong ví dụ này:
composable()
nhận một tham số loại. Tức làcomposable<Profile>
.- Việc xác định loại đích đến là một phương pháp mạnh mẽ hơn so với truyền một
route
chuỗi như trongcomposable("profile")
. - Lớp tuyến xác định loại của mỗi đối số điều hướng, như trong
val id: String
nên bạn không cần phải cóNavArgument
. - Đối với tuyến hồ sơ, phương thức tiện ích
toRoute()
sẽ tạo lại đối tượngProfile
từNavBackStackEntry
và đối số.
Để biết thêm thông tin về cách thiết kế biểu đồ nói chung, hãy xem phần Thiết kế biểu đồ Điều hướng.
Chuyển đến tuyến đường an toàn về kiểu
Cuối cùng, bạn có thể chuyển đến thành phần kết hợp bằng navigate()
bằng cách truyền vào thực thể của tuyến đường:
navController.navigate(Profile(id = 123))
Thao tác này sẽ điều hướng người dùng tới đích đến composable<Profile>
trong
biểu đồ điều hướng. Bất cứ đối số điều hướng nào, chẳng hạn như id
, đều có thể lấy được bằng cách
tạo lại Profile
bằng NavBackStackEntry.toRoute
và đọc
các thuộc tính.