谁能解释一下如何迁移到new kotlin-parcelize吗?
我试过:

  • 在应用程序build中将apply plugin: 'kotlin-android-extensions'替换为apply plugin: 'kotlin-parcelize'.gradle
  • import kotlinx.android.parcel.Parcelize替换import kotlinx.parcelize.Parcelize

  • 后者导致
    Class 'ParcelZonedDateTime' is not abstract and does not implement abstract member public abstract fun describeContents(): Int defined in android.os.Parcelable
    
    在这段代码:
    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()
        }
    }
    
    那么,如何迁移到新的kotlin-parcelize呢?
    更新:
    基于评论:是的,我使用的是Kotlin 1.4.20(比1.4.20-M2更新)。Kyzer正确地指出IDE中的错误(不是抽象的,并且未实现抽象成员public abstract fun describe describes() )可以并且必须被忽略。但是我在使用泛型时遇到了一个问题:
    import android.os.Parcelable
    import kotlinx.parcelize.Parcelize
    
    sealed class MyDialogEvent {
        @Parcelize
        data class Confirmed<T: Parcelable>(val identity: String, val data: T) : Parcelable
    }
    
    为此生成的代码是
    @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;
        }
    }
    
    并在编译期间收到此错误(行号与示例代码不匹配,但是您可以通过比较方法名称来轻松识别匹配的行):
    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()
    

    最佳答案

    这是kapt中的错误,并且报告为here。实际上,您发布的Java代码是由kapt生成的 stub 类,可以在其上运行注释处理器(如您所见,没有真正的实现,只有结构和注释)。因此,作为一种解决方法,您可以将带有@Parcelize批注的代码移至未启用kapt的单独模块中。 kotlin-parcelize本身不使用注释处理器来生成代码,我相信它使用编译器插件直接发出IR。

    10-05 23:25