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

Bạn có thể sử 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ủa mình. Các API này có sẵn khi ứng dụng của bạn sử dụng Navigation Kotlin (Điều hướng trong Compose) hoặc Navigation Kotlin DSL. Bạn có thể sử dụng các tính năng này 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 trong các tệp tài nguyên XML điều hướng tích hợp sẵn

Xác định các tuyến

Để sử dụng các tuyến an toàn về loại trong Compose, trước tiên, bạn cần xác định các lớp hoặc đối tượng có thể chuyển đổi tuần tự đại diện cho các 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ố.
  • Class (Lớp): Sử dụng một lớp hoặc lớp dữ liệu cho các tuyến có đối số.
  • KClass<T>: Sử dụng nếu bạn không cần truyền các đối số, chẳng hạn như một lớp không có tham số hoặc một lớp mà tất 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 có khả năng chuyển đổi 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. Dùng hàm composable() để xác định 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 hiệu quả hơn so với việc truyền một chuỗi route như trong composable("profile").
  • Lớp tuyến đường xác định loại của mỗi đối số điều hướng, như trong val id: String, vì vậy, 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à các đối số của đối tượng đó.

Để biết thêm thông tin về cách thiết kế biểu đồ nói chung, hãy xem trang 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 hàm navigate() bằng cách truyền vào thực thể của tuyến:

navController.navigate(Profile(id = 123))

Thao tác này sẽ điều hướng người dùng đến đích đến composable<Profile> trong biểu đồ điều hướng. Bạn có thể lấy bất kỳ đối số điều hướng nào, chẳng hạn như id, bằng cách tạo lại Profile bằng NavBackStackEntry.toRoute và đọc các thuộc tính của nó.

Tài nguyên khác