Kotlin中的Android Parcelable

Android Parcelable in Kotlin

我有这样的Java可打包内容:

1
2
3
4
5
6
7
8
9
10
@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中实现它:

1
2
3
4
5
6
7
8
9
10
11
12
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编译器版本(因为您使用的是!)。这是正确编译并带有最新版本的版本:

1
2
3
4
5
6
7
8
9
10
11
12
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需要公共静态字段,因此我们需要用@JvmFieldJvmStatic标记CREATOR属性。


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

相反,

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

就是这样。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
android{
    compileSdkVersion 30
   
    defaultConfig{
        applicationId"com.example"
        minSdkVersion 25
        targetSdkVersion 30
        ...
    }

    ...

    androidExtensions {
        experimental = true
    }
}