Как отделить переменную-член, отличную от конструктора, в классе данных при использовании @Parcelize - PullRequest
0 голосов
/ 15 ноября 2018

Я использую класс данных Room и Kotlin. Например,

@Entity(tableName = "Person")
@Parcelize
class Test(@ColumnInfo(name = "name") var name:String) : Parcelable{
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "ID")
    var id: Long? = null
}

Я могу создать экземпляр с помощью конструктора и вставить данные. Я также получаю предупреждение "property would not be serialized into a 'parcel'". Когда я пытался отправить объект через пакет, идентификатор отсутствует, что ожидается, как говорится в предупреждении. Как я могу добавить этого участника ID в посылку? Я не храню идентификатор в конструкторе, поскольку хочу, чтобы они генерировались автоматически.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Спасибо @tynn за ссылку.Я делаю еще один пост на тот случай, если кто-то не может найти обходной путь.

@Entity(tableName = "Person")
@Parcelize
data class Test(@ColumnInfo(name = "name") var name:String,
           @PrimaryKey(autoGenerate = true)
           @ColumnInfo(name = "ID")
           var id: Long? = null) : Parcelable

И вы все равно можете создать объект без идентификатора, например Test("test name"), и он будет вставлять увеличенное значение, когда объект будетсохранено в ROOM.

0 голосов
/ 15 ноября 2018

Вы можете найти эту информацию в документации :

@Parcelize требует, чтобы все сериализованные свойства были объявлены в первичном конструкторе.Расширения Android будут выдавать предупреждение для каждого свойства с полем поддержки, объявленным в теле класса.Кроме того, @Parcelize нельзя применять, если некоторые из параметров основного конструктора не являются свойствами.

Если вашему классу требуется более продвинутая логика сериализации, вы можете написать его внутри класса-компаньона:

@Parcelize
data class User(val firstName: String, val lastName: String, val age: Int) : Parcelable {
    private companion object : Parceler<User> {
        override fun User.write(parcel: Parcel, flags: Int) {
            // Custom write implementation
        }

        override fun create(parcel: Parcel): User {
            // Custom read implementation
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...