Как прочитать MutableList<String> в Parcelable?

У меня есть класс 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. Следовательно, он выдает ошибку компиляции.

Каков правильный способ сделать это?

Вы можете рассмотреть @Parcelize и не реализовывать интерфейс Parcelable самостоятельно.

tynn 29.05.2019 09:25
android.jlelse.eu/…
Quick learner 29.05.2019 09:34
0
2
1 058
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте createStringArrayList(). readStringList предназначен для повторного использования одного List вместо создания нового каждый раз, это не то, что вам нужно.

Спасибо за полезную информацию. Придется лить так: source.createStringArrayList() as MutableList<String>. Это правильно? Кроме того, правильно ли я использую writeStringList() выше?

fishhau 29.05.2019 09:17

Не должно быть необходимости что-либо отбрасывать; он возвращает ArrayList<String>, который является подтипом MutableList<String>. writeStringList должно быть правильно, да. (И посмотрите на @Parcelize, как упоминалось в комментариях.)

Alexey Romanov 29.05.2019 14:22

Спасибо за разъяснения. Я сомневался в использовании Parcelize, когда начинал проект, поскольку некоторые разработчики иногда сообщали о неожиданном поведении с ним, поскольку это все еще экспериментальная функция. Я не хотел рисковать, сталкиваясь с трудностями в будущем, поэтому я вручную реализовал Parcelable. Как только он перестанет быть экспериментальным, я обязательно реализую его в своем проекте. Приятно не беспокоиться об изменении методов Parcel каждый раз, когда мне нужно добавить или удалить свойство.

fishhau 30.05.2019 02:44

Другие вопросы по теме