An toàn về kiểu trong DSL Kotlin và Navigation Compose

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
    1. Ví dụ: Profile::class

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ư trong composable("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ượng Profile 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.

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.

Tài nguyên khác