Kotlin DSL 和 Navigation Compose 中的类型安全

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

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

定义路由

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

如需定义可序列化对象,请使用 Kotlin 序列化插件提供的 @Serializable 注解。您可以通过添加这些依赖项将此插件添加到项目中。

请根据以下规则确定路线的类型:

  • 对象:对于没有参数的路由,请使用对象。
  • :对于包含参数的路线,请使用类或数据类。
  • 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>
  • 与在 composable("profile") 中传递 route 字符串相比,定义目标类型是一种更稳健的方法。
  • 路线类定义了每个导航参数的类型(如 val id: String 中所示),因此无需 NavArgument
  • 对于配置文件路由,toRoute() 扩展方法会根据 NavBackStackEntry 及其参数重新创建 Profile 对象。

如需详细了解如何一般地设计图表,请参阅设计导航图页面。

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

navController.navigate(Profile(id = 123))

这会将用户导航到导航图中的 composable<Profile> 目的地。您可以使用 NavBackStackEntry.toRoute 重构 Profile 并读取其属性,从而获取任何导航参数(例如 id)。

其他资源