3
votes

Comment stocker la propriété booléenne pour l'interface Parcelable?

J'ai un objet data , User . Une des propriétés de User est un Boolean . Je ne peux pas comprendre comment stocker ce Boolean car il n'y a pas de tel writeBoolean () fourni hors de la boîte.

D'après ce que j'ai recherché en ligne, une façon de stocker la propriété Boolean consiste à utiliser la méthode writeInt () et un opérateur ternaire.

Alors je l'ai essayé ici:

data class User(val contactNumber: String,
                val email: String,
                val fullName: String,
                val isAdmin: Boolean,
                val organization: String,
                val unitNumber: String) : Parcelable {

override fun writeToParcel(dest: Parcel?, flags: Int) {
        dest?.writeString(contactNumber)
        dest?.writeString(email)
        dest?.writeString(fullName)
        dest?.writeInt(isAdmin ? 1 : 0)
        dest?.writeString(organization)
        dest?.writeString(unitNumber)
    }

}

Mais cette syntaxe semble ne fonctionner qu'avec Java et pas dans Kotlin. J'obtiens une erreur de compilation indiquant des jetons inattendus (utilisez ':' pour séparer les expressions sur la même ligne . Comment puis-je accomplir cela dans Kotlin?


0 commentaires

3 Réponses :


2
votes

L'opérateur ternaire n'est pas pris en charge dans kotlin Utilisez if-else à la place

writeInt (if (isAdmin) 1 else 0)

J'utilise plutôt writeValue , il est également utile pour les variables Nullable

dest ?: retrun

s'il pouvait être nullable et sinon ajouter ?: false

upd : comme indiqué dans d'autres réponses, la variable dest ne peut pas être nulle. afaik il a marqué comme nullable après la conversion de code à l'aide d'Android Studio. Si vous utilisez cette fonctionnalité, mieux vaut vérifier votre code car la conversion pourrait parfois ne pas fonctionner correctement.

À propos de ?. en général. Vous pouvez le réécrire avec l'opérateur let

dest?.let { it ->
  it.write(....)

ou encore mieux

dest.writeValue(this.booleanVar)
booleanVar = parcel.readValue(Boolean::class.java.classLoader) as? Boolean? 


2 commentaires

Et renommer une variable sur plusieurs lignes en it est plus lisible, maintenable, etc.?


Si nous parlons de l'opérateur let , il est possible de nommer la variable pour avoir un nom personnalisé au lieu de it par exemple ? .Let {custom_name -> ... Mais dans ce cas particulier, writeToParcel ne peut pas avoir dest comme variable nullable comme déjà indiqué dans d'autres réponses, donc inutile d'utiliser l'opérateur let ou `?: return`. Cette nullabilité vient après la conversion de code effectuée dans AS, afaik.



2
votes
  1. La syntaxe du de Java isAdmin? 1: 0 dans Kotlin est if (isAdmin) 1 else 0 .

  2. dest ne peut raisonnablement pas être null , vous pouvez donc changer son type en Parcel et tous les ? . à ..

Mais la vraie réponse est: utilisez @Parcelize et laissez le compilateur générer tout ce code, de sorte que vous ne pouvez oublier de le changer lorsque vous ajoutez de nouvelles propriétés, que vous vous trompez dans l'ordre, ou ...


1 commentaires

Merci d'avoir partagé des informations sur @Parcelize. Je n'en savais rien. Je vais l'implémenter dans mon code maintenant



1
votes

1.) utilisez cette fonction d'extension pratique:

override fun writeToParcel(dest: Parcel?, flags: Int) {

2.) dans

fun Parcel.readBoolean(): Boolean = readByte() > 0

fun Parcel.writeBoolean(bool: Boolean) {
    writeByte((if (bool) 1 else 0).toByte())
}

dest: Parcel! est un type de plate-forme , donc si vous savez qu'il ne le sera jamais strong> être null, alors il n'y a aucune raison de le spécifier comme type Nullable.

Utilisez plutôt override fun writeToParcel (dest: Parcel, flags: Int) {. p>


0 commentaires