在 Kotlin 中使用 @Parcelize 注释时如何忽略字段

Phi*_*lly 5 android parcelable kotlin

我想@Parcelize在 Kotlin 中使用注解时忽略一个字段,这样该字段就不会被打包,因为这个字段没有实现Parcelable接口。

从这个开始,我们得到一个错误,因为它PagedList是不可分割的:

@Parcelize
data class LeaderboardState(
    val progressShown: Boolean = true,
    val pagedList: PagedList<QUser>? = null
) : Parcelable
Run Code Online (Sandbox Code Playgroud)

给出:

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

标记为@Transient给出与上述相同的错误:

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

    //Same error
    @Transient
    val pagedList: PagedList<QUser>? = null
) : Parcelable
Run Code Online (Sandbox Code Playgroud)

我发现有一个未记录的注释被调用@IgnoredOnParcel,它给出了相同的错误,注释上有一个 lint 错误:

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

    //Same error plus lint error on annotation
    @IgnoredOnParcel
    val pagedList: PagedList<QUser>? = null
) : Parcelable
Run Code Online (Sandbox Code Playgroud)

这种情况下的 lint 错误是: @IgnoredOnParcel' is inapplicable to properties declared in the primary constructor

真的没有办法用@Parcelize 做到这一点吗?

Nic*_*las 20

使用常规类并将属性移出主构造函数:

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

    @IgnoredOnParcel
    val pagedList: PagedList<QUser>? = pagedList
}
Run Code Online (Sandbox Code Playgroud)

这显然是唯一的解决方案。确保根据需要重写 equals、hashCode、toString、copy 等,因为它们不会为常规类定义。

编辑:这是另一个解决方案,这样您就不会丢失数据类的功能,也不会丢失自动分区。我在这里使用一个一般的例子。

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
Run Code Online (Sandbox Code Playgroud)

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