You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 07:52:44