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
相关产品推荐
相关产品推荐

