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 để đảm bảo an toàn về kiểu tại thời điểm biên dịch cho biểu đồ điều hướng. Các API này có sẵn khi ứng dụng của bạn sử dụng Navigation Compose hoặc Navigation Kotlin DSL. Các tính năng này có sẵn kể từ Navigation 2.8.0.

Các API này tương đương với những gì Safe Args cung cấp cho biểu đồ điều hướng được tạo bằng XML.

Xác định tuyến đường

Để 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ể tuần tự hoá đại diện cho các tuyến của mình.

Để xác định các đối tượng có thể chuyển đổi tuần tự, hãy sử dụng chú thích @Serializable do trình bổ trợ Kotlin Serialization cung cấp. Bạn có thể thêm trình bổ trợ này vào dự án bằng cách thêm các phần phụ thuộc này.

Hãy sử dụng các quy tắc sau để quyết định loại đường dẫn cần sử dụng:

  • Đối tượng: Sử dụng đối tượng cho các tuyến không có đối số.
  • 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 đố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 mọi trường hợp, đối tượng hoặc lớp phải có thể 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. Sử dụng hàm 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ố kiểu. Đó 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 chuỗi route như trong composable("profile").
  • Lớp tuyến xác định loại của từng đối số điều hướng, như trong val id: String, vì vậy, bạn không cần 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 cách sử dụ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ẽ đưa 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 đối số đó.

Tài nguyên khác