web-dev-qa-db-fra.com

Migrer vers la nouvelle kotlin-colleriser

Quelqu'un peut-il s'il vous plaît expliquer comment migrer vers le nouveakotlin-parcelize?

J'ai essayé:

  1. Remplacer apply plugin: 'kotlin-Android-extensions' avec apply plugin: 'kotlin-parcelize' dans l'application build.gradle
  2. Remplacer import kotlinx.Android.parcel.Parcelize avec import kotlinx.parcelize.Parcelize

Ce dernier mène à

Class 'ParcelZonedDateTime' is not abstract and does not implement abstract member public abstract fun describeContents(): Int defined in Android.os.Parcelable

un G. Ce code:

import androidx.annotation.Keep
import kotlinx.parcelize.Parcelize
import org.threeten.bp.ZonedDateTime

@Keep
@Parcelize
data class ParcelZonedDateTime(var value: ZonedDateTime?) :Parcelable {
    override fun toString(): String {
        return value.toString()
    }
}

Alors, comment migrer vers le nouveau kotlin-parcelize?

Mise à jour:

Basé sur les commentaires: Oui, je suis sur Kotlin 1.4.20 (qui est plus récent que 1,4.20-m2) .Ckyzer a raison que l'erreur dans le IDE ( n'est pas Résumé et n'en mettant pas implémenter des membres abstraits abstraits Abstract Critchecontents ()) peut et doit être ignoré. Pourtant, j'ai un problème où j'utilise des génériques:

import Android.os.Parcelable
import kotlinx.parcelize.Parcelize

sealed class MyDialogEvent {
    @Parcelize
    data class Confirmed<T: Parcelable>(val identity: String, val data: T) : Parcelable
}

Le code généré pour cela est

@kotlin.Metadata(mv = {1, 4, 1}, bv = {1, 0, 3}, k = 3)
public static final class Creator implements Android.os.Parcelable.Creator<com.example.stackoverflow.MyDialogEvent.Confirmed> {
    
    public Creator() {
        super();
    }
    
    @org.jetbrains.annotations.NotNull()
    @Java.lang.Override()
    public final com.example.stackoverflow.MyDialogEvent.Confirmed<T>[] newArray(int size) {
        return null;
    }
    
    @org.jetbrains.annotations.NotNull()
    @Java.lang.Override()
    public final com.example.stackoverflow.MyDialogEvent.Confirmed<T> createFromParcel(@org.jetbrains.annotations.NotNull()
    Android.os.Parcel in) {
        return null;
    }
}

et pendant la compilation, j'obtiens cette erreur pour cela (les numéros de ligne ne correspondent pas au code de l'échantillon, mais vous pouvez facilement identifier les lignes correspondantes en comparant les noms de méthodes):

MyDialogEvent.Java:167: error: non-static type variable T cannot be referenced from a static context
            public final com.example.stackoverflow.MyDialogEvent.Confirmed<T>[] newArray(int size) {
                                                                                       
MyDialogEvent.Java:173: error: non-static type variable T cannot be referenced from a static context
            public final com.example.stackoverflow.MyDialogEvent.Confirmed<T> createFromParcel(@org.jetbrains.annotations.NotNull()
21
stefan.at.wpf

Après une vérification ultérieure, je pense que Parcelable Type générique avec la construction de colis ne parvient pas à compiler car T class ne peut pas être déterminé de manière générique à partir de celle-ci référence .

enter image description here

Peut-être qu'un énum pourrait être le dernier recours.

1
Ric17101