Jetpack Compose导航报错:未传入route参数问题求助
解决Jetpack Compose类型安全导航的"route参数未传入"错误
错误根源
你碰到的No value passed for parameter 'route'错误,主要有两个原因:
- 缺少
navigation-compose-ktx依赖,编译器无法识别泛型版本的composable函数,默认匹配了需要传入字符串route的基础重载 Profile定义为object,无法承载导航参数,不符合类型安全路由的传参要求
修复步骤
1. 添加必要依赖
在模块级build.gradle.kts(或build.gradle)中补充以下依赖(版本请与你的Navigation Compose版本保持一致):
dependencies { // Navigation Compose核心库 implementation("androidx.navigation:navigation-compose:2.7.7") // 类型安全路由扩展库 implementation("androidx.navigation:navigation-compose-ktx:2.7.7") // Kotlin序列化依赖 implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3") }
同时在项目级build.gradle.kts中启用Kotlin序列化插件:
plugins { // 保留原有插件(如com.android.application) kotlin("plugin.serialization") version "1.9.20" }
2. 修正路由定义
把Profile从object改为data class来承载参数,无参数的Home可以保留object:
@Serializable object Home @Serializable data class Profile(val id: String) // 可根据实际需求调整参数类型,比如Int
3. 调整导航代码
使用泛型版本的composable函数,修正后的MyApp代码如下:
@Composable fun MyApp() { val navController: NavHostController = rememberNavController() NavHost(navController = navController, startDestination = Home) { composable<Home> { HomeScreen(onNavigateToProfile = { id -> navController.navigate(Profile(id)) }) } composable<Profile> { backStackEntry -> val profile = backStackEntry.toRoute<Profile>() ProfileScreen(profile) } } }
补充说明
类型安全路由的泛型composable是navigation-compose-ktx提供的扩展API,没有这个依赖时,编译器只会识别需要字符串route的基础版本,这就是报错的核心原因。另外,只有data class类型的可序列化对象才能携带导航参数,object仅适用于无参数路由场景。
内容的提问来源于stack exchange,提问作者Daniel Vanum
相关产品推荐
相关产品推荐

