如何在 Kotlin 中使用 @Parcelize 注解时忽略某些字段

16
当使用 Kotlin 中的 @Parcelize 注解时,我希望忽略一个字段以使其不被 parcel 化,因为该字段没有实现 Parcelable 接口。从这里开始,我们会因为 PagedList 不可被序列化而出现错误:
@Parcelize
data class LeaderboardState(
    val progressShown: Boolean = true,
    val pagedList: PagedList<QUser>? = null
) : Parcelable

给出:

Type is not directly supported by 'Parcelize'. Annotate the parameter type with '@RawValue' if you want it to be serialized using 'writeValue()'

@Transient标记为Transient会得到与上述相同的错误:

@Parcelize
data class LeaderboardState(
    val progressShown: Boolean = true,

    //Same error
    @Transient
    val pagedList: PagedList<QUser>? = null
) : Parcelable
我发现了一个未记录的注释,名为@IgnoredOnParcel。它会产生相同的错误,并在注释上产生lint错误。 结果:

我发现了一个未记录的注释,名为@IgnoredOnParcel。它会产生相同的错误,并在注释上产生lint错误。

@Parcelize
data class LeaderboardState(
    val progressShown: Boolean = true,

    //Same error plus lint error on annotation
    @IgnoredOnParcel
    val pagedList: PagedList<QUser>? = null
) : Parcelable

在这种情况下,lint错误是: @IgnoredOnParcel'不适用于在主构造函数中声明的属性

真的没有用@Parcelize实现这个的方法吗?

1个回答

20

使用普通类并将属性移出主构造函数:

@Parcelize
class LeaderboardState(
    val progressShown: Boolean = true,
    pagedList: PagedList<QUser>? = null
) : Parcelable {

    @IgnoredOnParcel
    val pagedList: PagedList<QUser>? = pagedList
}

显然这是唯一的解决方案。确保根据需要覆盖equals,hashCode,toString,copy等方法,因为它们对于普通类不会被定义。

编辑:这里有另一个解决方案,以便您不会失去数据类的功能,也不会失去自动化的parcelization。这里使用了一个通用的示例。

data class Person(
    val info: PersonInfo
    val items: PagedList<Item>? = null)

@Parcelize
data class PersonInfo(
    val firstName: String,
    val lastName: String,
    val age: Int
) : Parcelable

你只需保存Person.info并从中重新创建它。


谢谢,看起来这是唯一的解决方案。但并不理想,因为现在我必须实现所有那些我可以在数据类中免费获得的方法。相比之下,实现自己的Parcelable实现会更容易,所以在这种情况下@Parcelize对于数据类并不是很有用。 - PhillyTheThrilly
@PhillyTheThrilly 如果你有兴趣,我添加了另一个解决方案。 - Nicolas
你的第一个建议似乎不太有效,因为你必须将每个构造函数参数声明为val或var。 - takecare
这只适用于 data class,而不是普通的 class - Nicolas
@Nicolas,这个问题是否有相关的内容,https://stackoverflow.com/q/70800105/10991969? - user10991969
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接