Saat ini saya menggunakan AutoParcel yang sangat baik dalam proyek Java saya, yang memfasilitasi pembuatan kelas Parcelable.
Sekarang, Kotlin, yang saya pertimbangkan untuk proyek saya berikutnya, memiliki konsep kelas data ini, yang secara otomatis menghasilkan metode equals, hashCode dan toString.
Apakah ada cara yang mudah untuk membuat kelas data Kotlin Parcelable dengan cara yang nyaman (tanpa mengimplementasikan metode secara manual)?
android
parcelable
kotlin
thalesmello.dll
sumber
sumber
Jawaban:
Kotlin 1.1.4 sudah keluar
Plugin Android Extensions sekarang menyertakan generator implementasi Parcelable otomatis. Deklarasikan properti berseri dalam konstruktor utama dan tambahkan anotasi @Parcelize, dan metode writeToParcel () / createFromParcel () akan dibuat secara otomatis:
Jadi, Anda perlu mengaktifkan mereka dengan menambahkan ini ke modul Anda build.gradle :
sumber
this calss implements Parcelable but does not provice CREATOR field
. Apakah jawaban Anda cukup (lengkap)?@SuppressLint("ParcelCreator")
untuk menghilangkan peringatan lint.Anda dapat mencoba plugin ini:
android-parcelable-intellij-plugin-kotlin
Ini membantu Anda menghasilkan kode boilerplate Parcelable Android untuk kelas data kotlin. Dan akhirnya terlihat seperti ini:
sumber
Cukup klik kata kunci data kelas data kotlin Anda, lalu tekan alt + Enter, pilih opsi pertama yang bertuliskan
"Add Parceable Implementation"
sumber
parcel.read...
denganTODO
, jika bidang tidakval/var
. Jika Anda menggunakanList
di dalam kelas, implementasi Anda menjadi masalah. Jadi saya beralih ke@Parcelize
jawaban yang diterima.Sudahkah Anda mencoba PaperParcel ? Ini adalah pemroses anotasi yang secara otomatis menghasilkan
Parcelable
kode boilerplate Android untuk Anda.Pemakaian:
Beri anotasi kelas data Anda dengan
@PaperParcel
, implementasikanPaperParcelable
, dan tambahkan instance statis JVM dari contoh yang dihasilkanCREATOR
:Sekarang kelas data Anda adalah
Parcelable
dan dapat diteruskan langsung keBundle
atauIntent
Edit: Perbarui dengan API terbaru
sumber
The terbaik cara dengan tidak ada boilerplate kode sama sekali adalah penyelundup Gradle Plugin. Yang Anda butuhkan hanyalah mengimplementasikan antarmuka AutoParcelable seperti
Dan itu saja. Berfungsi untuk kelas tertutup juga. Juga plugin ini menyediakan validasi waktu kompilasi untuk semua kelas AutoParcelable.
UPD 17.08.2017 Sekarang dengan plugin ekstensi Kotlin 1.1.4 dan Kotlin Android Anda dapat menggunakan
@Parcelize
anotasi. Dalam hal ini, contoh di atas akan terlihat seperti ini:Tidak perlu
data
pengubah. Kelemahan terbesar, untuk saat ini, menggunakan plugin kotlin-android-extensions yang memiliki banyak fungsi lain yang mungkin tidak diperlukan.sumber
Menggunakan Android Studio dan Kotlin Plugin, saya menemukan cara mudah untuk mengkonversi lama saya Java
Parcelable
s dengan tidak ada plugin tambahan (jika semua yang Anda inginkan adalah untuk mengubah merek barudata
kelas menjadiParcelable
, melompat ke potongan kode 4).Katakanlah Anda memiliki
Person
kelas dengan semuaParcelable
pelat ketel:Mulailah dengan menghapus
Parcelable
implementasi, meninggalkan objek Java lama, polos, dan polos (properti harus final dan disetel oleh konstruktor):Kemudian biarkan
Code > Convert Java file to Kotlin File
opsi melakukan keajaibannya:Ubah ini menjadi
data
kelas:Dan akhirnya, mari kita ubah ini menjadi
Parcelable
lagi. Arahkan kursor ke nama kelas dan Android Studio akan memberi Anda opsi untukAdd Parcelable Implementation
. Hasilnya akan terlihat seperti ini:Seperti yang Anda lihat,
Parcelable
implementasinya adalah beberapa kode yang dibuat secara otomatis yang ditambahkan kedata
definisi kelas Anda .Catatan:
Parcelable
secara langsung ke Kotlin tidak akan menghasilkan hasil yang sama dengan versi plugin Kotlin (1.1.3
) saat ini.Parcelable
diperkenalkan oleh pembuat kode saat ini . Pasti ada bug minor.Saya harap tip ini bekerja untuk Anda dan juga untuk saya.
sumber
Saya akan meninggalkan cara saya melakukannya jika itu dapat membantu seseorang.
Apa yang saya lakukan adalah saya memiliki generik
Parcelable
Dan kemudian saya membuat parcelable seperti ini:
Yang membuat saya menyingkirkan override boilerplate itu.
sumber
Contoh:
sumber
Sayangnya tidak ada cara di Kotlin untuk menempatkan bidang nyata dalam sebuah antarmuka, jadi Anda tidak dapat mewarisinya dari adaptor antarmuka secara gratis:
data class Par : MyParcelable
Anda dapat melihat delegasi, tetapi tidak membantu dengan bidang, AFAIK: https://kotlinlang.org/docs/reference/delegation.html
Jadi satu-satunya pilihan yang saya lihat adalah fungsi kain
Parcelable.Creator
, yang cukup jelas.sumber
saya lebih suka hanya menggunakan https://github.com/johncarl81/parceler lib dengan
sumber
Anda dapat melakukannya dengan menggunakan
@Parcelize
anotasi. Ini adalah generator implementasi Parcelable otomatis.Pertama, Anda harus mengaktifkan mereka untuk menambahkan ini ke modul Anda build.gradle:
Deklarasikan properti berseri dalam konstruktor utama dan tambahkan
@Parcelize
anotasi, danwriteToParcel()
/createFromParcel()
metode akan dibuat secara otomatis:Anda TIDAK perlu menambahkan blok
experimental = true
dalamandroidExtensions
.sumber
Kotlin telah membuat seluruh proses Parcelization di Android menjadi sangat mudah dengan anotasi @Parcel-nya.
Untuk melakukannya
Langkah 1. Tambahkan ekstensi Kotlin di gradle modul aplikasi Anda
Langkah 2. Tambahkan eksperimental = true karena fitur ini masih dalam percobaan di gradle.
Langkah 3. Anonasi kelas data dengan @Parcel
Berikut adalah contoh sederhana tentang penggunaan @Parcel
sumber
Ada Plugin tetapi tidak selalu diperbarui karena Kotlin berkembang: https://plugins.jetbrains.com/plugin/8086
Alternatif: Saya memiliki contoh yang berfungsi dari kelas data khusus yang menggunakan
Parcelable
dan daftar:Kelas data menggunakan Parcelable with List:
Semoga membantu!
sumber