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

Jetpack Compose类型安全导航遇多态序列化异常求助

解决密封接口RouteData导航参数反序列化异常

问题根源

你遇到的java.lang.IllegalArgumentException: Polymorphic value has not been read for class null异常,本质是Kotlinx序列化无法识别多态类型的具体实现类。你的RouteData密封接口未正确配置多态序列化规则,导致导航参数传递时丢失了子类的类型标识,反序列化阶段无法确定要实例化哪个RouteData子类。

具体修复步骤

1. 给密封接口添加@Serializable注解

Kotlinx序列化对密封接口的多态支持需要顶层接口本身带有@Serializable注解,这样序列化器才会自动为子类添加类型标识。修改后的代码如下:

@Serializable // 新增:给密封接口添加序列化注解
sealed interface RouteData {
    val navigationVisible: Boolean

    @Serializable
    data class SplashScreenData(
        override val navigationVisible: Boolean = false
    ) : RouteData

    @Serializable
    data class FirstScreenData(
        override val navigationVisible: Boolean = true
    ) : RouteData

    @Serializable
    data class SecondScreenData(
        override val navigationVisible: Boolean = false,
        val id: Int,
        val name: String,
    ) : RouteData

    @Serializable
    data class ThirdScreenData(
        override val navigationVisible: Boolean = false,
        val item: String,
    ) : RouteData

    // 其他子类...
}

2. 确保导航参数传递时使用正确的序列化方式

在导航到对应页面时,必须通过类型安全导航的API传递RouteData实例,避免手动序列化/反序列化导致的类型信息丢失。示例代码:

// 导航到SecondScreen的示例
navController.navigate(
    SecondScreenRoute(
        routeData = RouteData.SecondScreenData(
            navigationVisible = false,
            id = 123,
            name = "Test"
        )
    )
)

(注:SecondScreenRoute是通过Navigation Safe Args生成的路由类,需确保路由参数类型定义为RouteData)

3. 显式启用多态序列化(可选)

如果上述步骤仍未解决问题,可给RouteData添加@Polymorphic注解,强制启用多态序列化规则:

@Serializable
@Polymorphic // 显式启用多态序列化
sealed interface RouteData {
    // 子类代码保持不变
}

额外排查点

  • 检查所有RouteData子类是否都添加了@Serializable注解,遗漏会导致序列化器无法识别该子类。
  • 确认导航组件版本与Kotlinx序列化版本兼容,避免版本冲突引发的异常。

内容的提问来源于stack exchange,提问作者Martin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 00:05:03