Kotlin DSL 和 Navigation Compose 中的类型安全

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

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

定义路由

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

  • Object:为没有参数的路线使用对象。
  • Class:为带有参数的路由使用类或数据类。
  • 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 string,如 composable("profile")
  • path 类会定义每个导航参数的类型,如 val id: String,因此无需 NavArgument
  • 对于配置文件路由,toRoute() 扩展方法会重新创建 来自 NavBackStackEntryProfile 对象及其 参数。

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

最后,您可以使用 navigate() 导航到可组合项。 函数:

navController.navigate(Profile(id = 123))

这会将用户导航到 composable<Profile> 导航图。任何导航参数(例如 id)都可以通过以下方式获取: 使用 NavBackStackEntry.toRoute 重建 Profile 并读取其 属性。

其他资源