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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 13:12:29