Android Parcelable в Kotlin: создатель не найден в классе Parcelable data


С выпуском 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: 1.0.0-rc-1036-IJ143-4

Код доступен для просмотра @ https://github.com/eggman87/circle-kotlin

2 11

2 ответа:

Kotlin RC отбросил ранее устаревшую генерацию статических полей для всех свойств сопутствующего объекта (Подробнее см.этот ответ ).

Теперь только те, которые отмечены const, lateinit или @JvmField будет генерироваться статическое поле.

Вам нужно аннотировать val CREATOR по @JvmField аннотации, так как Android Framework ожидает статическое поле CREATOR в вашем классе.

Здесь у вас есть некоторые полезные функции расширения Kotlin, которые помогут вам создать ваши CREATORs, а также некоторые примеры (используя классы данных и список внутри класса данных)

Gist: класс данных и Parcelables пример

Я использую этот код в приложении для Android: (Ссылка)

Тот же код вы можете найти здесь: (Ссылка)