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>
  • 定义目标类型比传递 route 字符串更可靠,例如 composable("profile")
  • 路由类定义了每个导航参数的类型,例如 val id: String,因此无需使用 NavArgument
  • 对于配置文件路由,toRoute() 扩展方法会根据 NavBackStackEntry 及其参数重新创建 Profile 对象。

如需大致了解如何设计您的图,请参阅设计导航图页面。

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

navController.navigate(Profile(id = 123))

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

其他资源