Android 可在 Kotlin 中打包

Android Parcelable in Kotlin

我有这样的 Java 可打包:

@SuppressWarnings("rawtypes")
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
    public KwerendaGraficzna createFromParcel(Parcel in) {
        return new KwerendaGraficzna(in);
    }

    public KwerendaGraficzna[] newArray(int size) {
        return new KwerendaGraficzna[size];
    }
};

现在尝试在 Kotlin 中实现它:

companion object {
    @SuppressWarnings("rawtypes")
    val CREATOR: Parcelable.Creator<KwerendaGraficzna!> = object : Parcelable.Creator<KwerendaGraficzna!> {
        override fun createFromParcel(`in`: Parcel): KwerendaGraficzna {
            return KwerendaGraficzna(`in`)
        }

        override fun newArray(size: Int): Array<KwerendaGraficzna!> {
            return arrayOfNulls<KwerendaGraficzna!>(size)
        }
    }
}

arrayOfNulls 不会编译要求 KwerendaGraficzna 虽然它声称它收到 KwerendaGraficzna?

那我该怎么做呢?

我怀疑您使用的是过时版本的 Kotlin 编译器(因为您使用的是 !)。这是使用最新版本正确编译的版本:

companion object {
    @JvmField
    val CREATOR = object : Parcelable.Creator<KwerendaGraficzna> {
        override fun createFromParcel(`in`: Parcel): KwerendaGraficzna {
            return KwerendaGraficzna(`in`)
        }

        override fun newArray(size: Int): Array<KwerendaGraficzna?> {
            return arrayOfNulls(size)
        }
    }
}

由于 Parcelable.Creator 需要一个 public 静态字段,我们需要将 CREATOR 属性 标记为 @JvmField and JvmStatic

您不需要实现所有样板代码。

相反,

@Parcelize
data class KwerendaGraficzna(val a: Int, val b: String): Parcelable{
    // TODO: others code
}

就是这样。

您需要在build.gradle中启用experimentaltrue才能应用上述方法。

android{
    compileSdkVersion 30
    
    defaultConfig{
        applicationId "com.example"
        minSdkVersion 25
        targetSdkVersion 30
        ...
    }

    ...

    androidExtensions {
        experimental = true
    }
}