您可以使用内置的类型安全 API 为您的导航图提供编译时类型安全。当您的应用使用Navigation Compose或Navigation Kotlin DSL时,这些 API 可用。它们从Navigation 2.8.0
开始可用。
这些 API 等效于Safe Args为使用 XML 构建的导航图提供的功能。
定义路由
要在 Compose 中使用类型安全路由,您首先需要定义表示路由的可序列化类或对象。
- 对象:对于没有参数的路由,使用对象。
- 类:对于带有参数的路由,使用类或数据类。
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>
。- 定义目标类型比传递
route
字符串(如composable("profile")
)更可靠。 - 路由类定义每个导航参数的类型,如
val id: String
,因此不需要NavArgument
。 - 对于配置文件路由,
toRoute()
扩展方法会从NavBackStackEntry
及其参数中重新创建Profile
对象。
有关如何一般设计图表的更多信息,请参阅设计导航图页面。
导航到类型安全路由
最后,您可以通过传递路由实例使用navigate()
函数导航到您的可组合项。
navController.navigate(Profile(id = 123))
这将引导用户跳转到导航图中的composable<Profile>
目标。任何导航参数,例如id
,都可以通过使用NavBackStackEntry.toRoute
重建Profile
并读取其属性来获取。