Jetpack Compose中含Color类型的数据类@Parcelize报错的解决方法
Parcelize处理Color类型报错的原因与解决方案
错误含义
@Parcelize是Kotlin提供的简化Parcelable实现的注解,它仅支持直接可序列化的基础类型(如Int、String)、Parcelable子类、Serializable子类等有限类型。你使用的Color(Jetpack Compose的androidx.compose.ui.graphics.Color)不在这些原生支持的类型列表中,因此@Parcelize无法自动生成该类型的序列化/反序列化代码,报错提示你要么用@RawValue标记该字段,改用通用的writeValue()方法序列化,要么更换支持的类型。
解决方案
方案1:将Color转换为Int类型传递(推荐)
Compose的Color本质是ARGB格式的Int值封装,通过Color.value可以获取对应的Int数值,反序列化时再用Color(intValue)重建Color对象。这种方式完全适配@Parcelize的类型要求,是最可靠的方案。
修改后的数据类代码:
import android.os.Parcelable import androidx.compose.ui.graphics.Color import kotlinx.parcelize.Parcelize @Parcelize data class SubTitleModel( val text: String, val textColorInt: Int = Color.Black.value ) : Parcelable
使用示例:
- 传递时:
val model = SubTitleModel("示例标题", myCustomColor.value) - 接收后重建Color:
val targetColor = Color(model.textColorInt)
方案2:使用@RawValue标记(不推荐)
如果必须保留Color类型字段,可以给textColor添加@RawValue注解,让@Parcelize使用Parcel.writeValue()和readValue()来处理序列化。但需要注意:Jetpack Compose的Color并未实现Serializable接口,这种方式运行时会抛出NotSerializableException,仅当你使用的是实现了序列化的Color封装类时才可行。
修改后的代码:
import android.os.Parcelable import androidx.compose.ui.graphics.Color import kotlinx.parcelize.Parcelize import kotlinx.parcelize.RawValue @Parcelize data class SubTitleModel( val text: String, val textColor: @RawValue Color = Color.Black ) : Parcelable
参考依据
@Parcelize的设计逻辑是仅自动处理明确支持的类型,对于非支持类型,要么用@RawValue降级为通用序列化,要么手动实现Parcelable的核心方法(但会失去@Parcelize的简化优势)。- Jetpack Compose的
Color类提供了value属性用于与Int值互相转换,这是官方推荐的跨组件传递颜色数据的标准方式。
内容的提问来源于stack exchange,提问作者Compose Learner
相关产品推荐
相关产品推荐

