2016-02-07 31 views
9

Con il rilascio di Kotlin RC, ho iniziato a scrivere un'app per apprenderla, ma non riesco a capire come ottenere Parcelable per funzionare.Android Parcelable in Kotlin: CREATOR non trovato nella classe di dati Parcelable

la classe di dati:

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) 
    } 

} 

leggendo:

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 
    } 
} 

L'eccezione:

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) 

Sono sicuro che è qualcosa di semplice che mi manca, ha chiunque altro ha avuto successo con Parcelable sull'ultimo Kotlin?

Kotlin Versione: 1.0.0-rc-1036

Kotlin Plugin Versione: 1.0.0-rc-1036-IJ143-4

Codice è visualizzabile @https://github.com/eggman87/circle-kotlin

risposta

17

Kotlin RC è sceso in precedenza generazione deprecata di campi statici per tutte le proprietà degli oggetti associati (ulteriori informazioni su this answer).

Ora solo quelli contrassegnati da const, lateinit o @JvmField avranno un campo statico generato.

È necessario annotare l'annotazione per @JvmField poiché Android Framework prevede un campo statico CREATOR nella classe.

+0

in questo caso il problema sembra essere nel modo in cui si stanno ottenendo * EXTRA_PROJECT *, chiama semplicemente intent.extras.get (EXTRA_PROJECT) ma il problema non è nella definizione Parcelable, non è necessario aggiungerlo. – Juancho

+0

@juancho, sono d'accordo sul fatto che, eventualmente, un altro modo di lavorare con 'Parcelable' non causerebbe il problema in OP (e non riuscivo nemmeno a riprodurlo). Ma l'eccezione è sicuramente lanciata a causa del campo statico mancante, e la risposta lo risolve. Ecco perché ho deciso di eliminarlo. Potresti riprodurre il problema e verificare se questo lo risolve? Se lo fa, penso, sarebbe una risposta migliore. – hotkey

+0

Clonato e collaudo il progetto e sì è relativo a questa JvmField. Sono un po 'confuso perché non sto affrontando lo stesso problema nel mio progetto. Inoltre ho provato a ottenere lo stesso errore nel mio progetto ma niente. Cancellerò i miei commenti solo per evitare confusioni. Grazie :) ! – Juancho

1

Ecco alcune funzioni utili Kotlin estensione che vi aiuteranno a creare i tuoi CREATOR s ed anche alcuni esempi (con classi di dati e l'elenco all'interno della classe di dati)

Gist: Data Class & Parcelables example

Sto usando questo codice in un App Android: (link)

lo stesso codice si può trovare qui: (link)

+0

Probabilmente questo codice fallirà per lo stesso motivo se compilato con Kotlin RC (perché 'val CREATOR' non è più statico). L'hai controllato? – hotkey

+0

Lo sto usando nella mia app con RC. Hai provato? – Juancho

+0

Ok, controllerò tra poco. – hotkey