您可以使用内置的类型安全 API 为导航图提供编译时类型安全。当您的应用使用 Navigation Compose 或 Navigation Kotlin DSL 时,这些 API 可用。它们自 Navigation
2.8.0
起可供使用。
这些 API 相当于 Safe Args 为使用 XML 构建的导航图提供的功能。
定义路由
如需在 Compose 中使用类型安全的路由,您首先需要定义表示路由的可序列化类或对象。
如需定义可序列化对象,请使用 Kotlin 序列化插件提供的 @Serializable
注解。您可以通过添加这些依赖项将此插件添加到项目中。
请根据以下规则确定路线的类型:
- 对象:对于没有参数的路由,请使用对象。
- 类:对于包含参数的路线,请使用类或数据类。
KClass<T>
:如果您不需要传递参数(例如没有参数的类,或所有参数都具有默认值的类),请使用此方法- 例如:
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
)。