迁移到新的 kotlin-parcelize

ste*_*wpf 34 android parcelable kotlin

谁能解释一下如何迁移到新的 kotlin-parcelize

我试过:

  1. 在 app build.gradle 中替换apply plugin: 'kotlin-android-extensions'apply plugin: 'kotlin-parcelize'
  2. 替换import kotlinx.android.parcel.Parcelizeimport kotlinx.parcelize.Parcelize

后者导致

Class 'ParcelZonedDateTime' is not abstract and does not implement abstract member public abstract fun describeContents(): Int defined in android.os.Parcelable
Run Code Online (Sandbox Code Playgroud)

例如,在此代码上:

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()
    }
}
Run Code Online (Sandbox Code Playgroud)

那么,如何迁移到新的kotlin-parcelize

更新:

基于评论:是的,我使用的是 Kotlin 1.4.20(比 1.4.20-M2 更新)。Kyzer 是正确的,IDE 中的错误(不是抽象的并且没有实现抽象成员 public abstract fun describeContents() ) 可以而且必须被忽略。但是我在使用泛型时遇到了一个问题:

import android.os.Parcelable
import kotlinx.parcelize.Parcelize

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

为此生成的代码是

@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

并且在编译期间,我收到此错误(行号与示例代码不匹配,但您可以通过比较方法名称轻松识别匹配的行):

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()
Run Code Online (Sandbox Code Playgroud)

ese*_*sov 19

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

更新:该问题已在 kotlin 1.5 中修复