У меня есть класс User
, реализующий интерфейс Parcelable
. User
также имеет свойство типа MutableList<String>
. Я хотел бы знать, как читать/писать этот тип для Parcelable
.
Вот мой код до сих пор
data class User(
val contactNumber: String,
val email: String,
val fullName: String,
var instanceToken: String,
val isAdmin: Boolean,
val isValid: Boolean,
val organization: String,
val registrationTokens: MutableList<String>,
val uid: String,
val unitNumber: String
) : Parcelable {
constructor(source: Parcel) : this(
source.readString() ?: "",
source.readString() ?: "",
source.readString() ?: "",
source.readString() ?: "",
source.readBoolean(),
source.readBoolean(),
source.readString() ?: "",
source.readStringList(),
source.readString() ?: "",
source.readString() ?: ""
)
override fun writeToParcel(dest: Parcel?, flags: Int) {
dest?.let {
it.writeString(contactNumber)
it.writeString(email)
it.writeString(fullName)
it.writeString(instanceToken)
it.writeBoolean(isAdmin)
it.writeBoolean(isValid)
it.writeString(organization)
it.writeStringList(registrationTokens)
it.writeString(uid)
it.writeString(unitNumber)
}
}
Для части записи есть удобный метод writeStringList()
. Но для части чтения предоставленный readStringList()
на самом деле не возвращает MutableList<String>
. Он возвращает только Unit
/ void
. Следовательно, он выдает ошибку компиляции.
Каков правильный способ сделать это?
Используйте createStringArrayList()
. readStringList
предназначен для повторного использования одного List
вместо создания нового каждый раз, это не то, что вам нужно.
Спасибо за полезную информацию. Придется лить так: source.createStringArrayList() as MutableList<String>
. Это правильно? Кроме того, правильно ли я использую writeStringList()
выше?
Не должно быть необходимости что-либо отбрасывать; он возвращает ArrayList<String>
, который является подтипом MutableList<String>
. writeStringList
должно быть правильно, да. (И посмотрите на @Parcelize
, как упоминалось в комментариях.)
Спасибо за разъяснения. Я сомневался в использовании Parcelize, когда начинал проект, поскольку некоторые разработчики иногда сообщали о неожиданном поведении с ним, поскольку это все еще экспериментальная функция. Я не хотел рисковать, сталкиваясь с трудностями в будущем, поэтому я вручную реализовал Parcelable
. Как только он перестанет быть экспериментальным, я обязательно реализую его в своем проекте. Приятно не беспокоиться об изменении методов Parcel
каждый раз, когда мне нужно добавить или удалить свойство.
Вы можете рассмотреть
@Parcelize
и не реализовывать интерфейсParcelable
самостоятельно.