Kotlin如何将自定义对象存入Bundle实现Fragment间数据传递
报错原因
你需要存入Bundle的CheckListModel类未实现Serializable接口,putSerializable方法要求传入的对象必须完全实现序列化接口,且其内部所有属性对应的类型也需要支持序列化,你当前仅为嵌套的CheckListPoints实现了序列化,外层主类不满足要求,因此触发运行时异常。
解决方案
方案1:补充实现Serializable接口
直接给CheckListModel新增Serializable接口实现即可,修改后代码如下:
import java.io.Serializable data class CheckListModel ( val checkListName: String, val checkListCount: Int, val checkListPoints: List<CheckListPoints>, val checkListResult: Int, val description: String ) : Serializable // 新增此行实现序列化接口 data class CheckListPoints( var correctly: Boolean, var requirement: String, var passed: Boolean, ) : Serializable
在目标Fragment读取数据时建议做好空安全判断,避免类型转换崩溃:
// 目标Fragment中获取传递数据 val checkModel = arguments?.getSerializable("data") as? CheckListModel checkModel?.let { // 执行你的业务逻辑 }
方案2(可选优化):使用Parcelable实现序列化
Android平台更推荐使用Parcelable实现序列化,性能远高于Serializable,配合Kotlin的@Parcelize注解可以快速实现,无需手动写序列化逻辑:
- 首先在模块级build.gradle中启用kotlin-parcelize插件
- 修改数据类代码如下:
import android.os.Parcelable import kotlinx.parcelize.Parcelize @Parcelize data class CheckListModel ( val checkListName: String, val checkListCount: Int, val checkListPoints: List<CheckListPoints>, val checkListResult: Int, val description: String ) : Parcelable @Parcelize data class CheckListPoints( var correctly: Boolean, var requirement: String, var passed: Boolean, ) : Parcelable
传递数据时改用putParcelable方法,读取时用getParcelable即可。
内容的提问来源于stack exchange,提问作者GDTyka
相关产品推荐
相关产品推荐

