Kotlin DSL 和 Navigation Compose 中的类型安全

您可以使用内置的类型安全 API 为您的导航图提供编译时类型安全。当您的应用使用 Navigation ComposeNavigation Kotlin DSL 时,这些 API 可用。它们从 Navigation 2.8.0 开始可用。

这些 API 等效于 Safe Args 为使用 XML 构建的导航图提供的功能。

定义路由

要在 Compose 中使用类型安全路由,您首先需要定义表示路由的可序列化类或对象。

  • 对象:对于没有参数的路由,使用对象。
  • :对于带有参数的路由,使用类或数据类。
  • KClass<T>:如果您不需要传递参数,例如没有参数的类或所有参数都具有默认值的类,则使用此方法
    1. 例如:Profile::class

在任何一种情况下,对象或类都必须是可序列化的。

例如

// 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)

构建您的图

接下来,您需要定义您的导航图。使用 composable() 函数将可组合项定义为导航图中的目标。

NavHost(navController, startDestination = Home) {
     composable<Home> {
         HomeScreen(onNavigateToProfile = { id ->
             navController.navigate(Profile(id))
         })
     }
     composable<Profile> { backStackEntry ->
         val profile: Profile = backStackEntry.toRoute()
         ProfileScreen(profile.id)
     }
}

在此示例中观察以下内容

  • composable() 采用类型参数。也就是说,composable<Profile>
  • 定义目标类型比传递 route 字符串(如 composable("profile"))更稳健。
  • 路由类定义每个导航参数的类型,如 val id: String,因此无需 NavArgument
  • 对于个人资料路由,toRoute() 扩展方法从 NavBackStackEntry 及其参数中重新创建 Profile 对象。

有关如何设计图表的更多信息,请参阅 设计导航图 页面。

最后,您可以通过传递路由实例,使用 navigate() 函数导航到您的可组合项

navController.navigate(Profile(id = 123))

这会将用户导航到导航图中的 composable<Profile> 目标。可以通过使用 NavBackStackEntry.toRoute 重建 Profile 并读取其属性来获取任何导航参数,例如 id

其他资源