Kotlin中的Android Parcelable:在Parcelable数据类中找不到CREATOR

随着Kotlin RC的发布,我开始编写一个应用程序来学习它,但我不知道如何让Parcelable工作。

数据类:

 data class Project (val reponame:String, val username:String, val language:String, val vcsUrl:String, val branches:Map<String, Branch>) : Parcelable { companion object { val CREATOR = object : Parcelable.Creator<Project> { override fun createFromParcel(`in`: Parcel): Project { return Project(`in`) } override fun newArray(size: Int): Array<Project?> { return arrayOfNulls(size) } } } protected constructor(parcelIn: Parcel) : this ( parcelIn.readString(), parcelIn.readString(), parcelIn.readString(), parcelIn.readString(), mapOf<String, Branch>().apply { parcelIn.readMap(this, Branch::class.java.classLoader) } ) override fun describeContents(): Int { throw UnsupportedOperationException() } override fun writeToParcel(dest: Parcel, flags: Int) { dest.writeString(reponame) dest.writeString(username) dest.writeString(language) dest.writeString(vcsUrl) dest.writeMap(branches) } } 

阅读它:

 class ProjectDetailActivity : BaseActivity() { lateinit var project: Project companion object { const val EXTRA_PROJECT = "extra_project" } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) project = intent.extras.getParcelable(EXTRA_PROJECT) tvTitle.text = project.reponame } } 

例外:

 Caused by: android.os.BadParcelableException: Parcelable protocol requires a Parcelable.Creator object called CREATOR on class com.eggman.circleciandroid.model.Project at android.os.Parcel.readParcelableCreator(Parcel.java:2415) at android.os.Parcel.readParcelable(Parcel.java:2337) at android.os.Parcel.readValue(Parcel.java:2243) at android.os.Parcel.readArrayMapInternal(Parcel.java:2592) at android.os.BaseBundle.unparcel(BaseBundle.java:221) at android.os.BaseBundle.get(BaseBundle.java:281) at com.eggman.circleciandroid.ui.ProjectDetailActivity.onCreate(ProjectDetailActivity.kt:22) 

我相信这是简单的我错过了,还有其他人有最新的科特林Parcelable成功?

Kotlin版本:1.0.0-rc-1036

Kotlin Plugin版本:1.0.0-rc-1036-IJ143-4

代码可查看@ https://github.com/eggman87/circle-kotlin

Kotlin RC删除了先前弃用的所有伴侣对象属性的静态字段的生成(请参阅此答案 )。

现在只有那些由constlateinit@JvmField标记的字段才会生成一个静态字段。

您需要通过@JvmField注释来注释val CREATOR ,因为Android Framework需要在您的类中使用静态字段CREATOR

这里有一些有用的Kotlin扩展函数可以帮助你创建CREATOR ,还有一些例子(在数据类中使用数据类和列表)

Gist:Data Class&Parcelables示例

我在Android应用程序中使用此代码:( 链接)

相同的代码,你可以在这里找到它:( 链接)