Jetpack Compose嵌套导航传参遇SerializationException问题求助
问题
开发带嵌套导航的Jetpack Compose项目时,遵循Android官方类型安全导航参数文档,使用数据类在嵌套导航图中传参时抛出以下异常:
kotlinx.serialization.SerializationException: Serializer for class 'Companion' is not found. Please ensure that class is marked as '@Serializable' and that the serialization compiler plugin is applied.
相关代码如下:
数据类
@Serializable data class GroupDetail(val id: String)
导航逻辑
rootNavController.navigate( GroupDetail( id = selectedGroup.id.toString() ) )
嵌套导航图
fun NavGraphBuilder.groupDetailNavGraph(rootNavController: NavHostController) { navigation<GroupDetailGraph>( startDestination = GroupDetail ) { composable<GroupDetail> { backStackEntry -> val group: GroupDetail = backStackEntry.toRoute() GroupDetailScreen(rootNavController = rootNavController) } } }
已确认GroupDetail类标记了@Serializable,且kotlinx.serialization插件已启用,仍持续抛出该序列化异常,求排查方向及解决方法。
解决方案
- 修正嵌套导航图的路由类型匹配:你在
navigation函数中指定了GroupDetailGraph作为路由类型,但startDestination直接传入了GroupDetail类引用,这会导致系统尝试序列化GroupDetail的Companion对象,而非路由实例。嵌套导航图的startDestination必须是与泛型类型匹配的路由实例。 - 统一嵌套导航图的路由定义:将嵌套导航图的所有路由封装到一个序列化的密封类中,确保类型一致:
// 定义嵌套导航图的所有路由 @Serializable sealed class GroupDetailGraph { @Serializable data object Root : GroupDetailGraph() @Serializable data class GroupDetail(val id: String) : GroupDetailGraph() }
- 更新嵌套导航图实现:使用封装后的路由类,确保
startDestination和composable的路由类型统一:
fun NavGraphBuilder.groupDetailNavGraph(rootNavController: NavHostController) { navigation<GroupDetailGraph>( startDestination = GroupDetailGraph.Root ) { composable<GroupDetailGraph.GroupDetail> { backStackEntry -> val group = backStackEntry.toRoute<GroupDetailGraph.GroupDetail>() GroupDetailScreen(rootNavController = rootNavController, groupId = group.id) } } }
- 修正导航调用逻辑:导航时传入正确的路由实例,避免直接引用类:
rootNavController.navigate( GroupDetailGraph.GroupDetail( id = selectedGroup.id.toString() ) )
- 再次验证序列化插件配置:确保项目配置无遗漏:
项目级build.gradle.kts:
plugins { id("org.jetbrains.kotlin.plugin.serialization") version "1.9.20" apply false }
模块级build.gradle.kts:
plugins { id("com.android.application") id("org.jetbrains.kotlin.android") id("org.jetbrains.kotlin.plugin.serialization") } dependencies { implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0") implementation("androidx.navigation:navigation-compose:2.7.7") }
内容的提问来源于stack exchange,提问作者Hassan Raza
相关产品推荐
相关产品推荐

