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?
3 Réponses :
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?
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.
La syntaxe du de Java isAdmin? 1: 0
dans Kotlin est if (isAdmin) 1 else 0
.
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 code >
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 ...
Merci d'avoir partagé des informations sur @Parcelize. Je n'en savais rien. Je vais l'implémenter dans mon code maintenant
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>