Obecnie w moim projekcie Java używam doskonałej AutoParcel , która ułatwia tworzenie klas Parcelable.
Teraz Kotlin, który rozważam w moim następnym projekcie, ma tę koncepcję klas danych, które automatycznie generują metody equals, hashCode i toString.
Czy istnieje wygodny sposób, aby w wygodny sposób utworzyć klasę danych Kotlin Parcelable (bez ręcznego wdrażania metod)?
android
parcelable
kotlin
thalesmello
źródło
źródło
Odpowiedzi:
Kotlin 1.1.4 jest niedostępny
Wtyczka Android Extensions zawiera teraz automatyczny generator implementacji Parcelable. Zadeklaruj zserializowane właściwości w głównym konstruktorze i dodaj adnotację @Parcelize, a metody writeToParcel () / createFromParcel () zostaną utworzone automatycznie:
Musisz więc umożliwić im dodanie tego do pliku build.gradle modułu :
źródło
this calss implements Parcelable but does not provice CREATOR field
. Czy Twoja odpowiedź jest wystarczająca (pełna)?@SuppressLint("ParcelCreator")
aby pozbyć się ostrzeżenia o kłaczkach.Możesz wypróbować tę wtyczkę:
android-parcelable-intellij-plugin-kotlin
Pomaga w generowaniu standardowego kodu Android Parcelable dla klasy danych kotlin. I w końcu wygląda to tak:
źródło
Po prostu kliknij słowo kluczowe data swojej klasy danych kotlin, a następnie naciśnij alt + Enter, wybierz pierwszą opcję mówiącą
"Add Parceable Implementation"
źródło
parcel.read...
zTODO
, jeśli pole nie jestval/var
. Jeśli używaszList
wewnątrz klasy, twoja implementacja staje się problemem. Więc zwróciłem się do@Parcelize
zaakceptowanej odpowiedzi.Czy próbowałeś PaperParcel ? Jest to procesor adnotacji, który automatycznie generuje
Parcelable
dla Ciebie standardowy kod Androida .Stosowanie:
Dodaj adnotacje do swojej klasy danych
@PaperParcel
, zaimplementujPaperParcelable
i dodaj statyczną instancję JVM wygenerowanegoCREATOR
np .:Teraz twoja klasa danych jest
Parcelable
i może być przekazywana bezpośrednio doBundle
lubIntent
Edycja: aktualizacja z najnowszym interfejsem API
źródło
Najlepszy sposób z żadnym boilerplate kodu w ogóle jest Smuggler wtyczki Gradle. Wystarczy zaimplementować interfejs AutoParcelable, taki jak
I to wszystko. Działa również dla klas zamkniętych. Również ta wtyczka zapewnia walidację czasu kompilacji dla wszystkich klas AutoParcelable.
UPD 17.08.2017 Teraz z wtyczką Kotlin 1.1.4 i Kotlin Android można używać
@Parcelize
adnotacji. W takim przypadku powyższy przykład będzie wyglądał następująco:Nie ma potrzeby
data
modyfikatora. Największą wadą na razie jest użycie wtyczki kotlin-android-extensions, która ma wiele innych funkcji, które mogą być niepotrzebne.źródło
Korzystanie z Androidem Studio i Kotlin wtyczki znalazłem łatwy sposób przekonwertować mój stary Java
Parcelable
sz bez dodatkowych wtyczek (jeśli chcesz to, aby włączyć nowądata
klasę naParcelable
, przejdź do 4 fragmencie kodu).Powiedzmy, że masz
Person
klasę z całąParcelable
płytą kotłową:Zacznij od usunięcia
Parcelable
implementacji, pozostawiając nieskomplikowany, zwykły, stary obiekt Java (właściwości powinny być ostateczne i ustawione przez konstruktora):Następnie niech
Code > Convert Java file to Kotlin File
opcja zrobi swoje:Przekształć to w
data
klasę:Na koniec zmieńmy to
Parcelable
ponownie w plik . Najedź na nazwę klasy, a Android Studio powinno dać Ci opcjęAdd Parcelable Implementation
. Wynik powinien wyglądać następująco:Jak widać,
Parcelable
implementacja to jakiś automatycznie generowany kod dołączany dodata
definicji klasy.Uwagi:
Parcelable
bezpośrednio do Kotlin nie przyniesie takich samych rezultatów z aktualną wersją wtyczki Kotlin (1.1.3
).Parcelable
generator kodu. To musi być drobny błąd.Mam nadzieję, że ta wskazówka zadziała tak dobrze dla Ciebie, jak i dla mnie.
źródło
Przykład:
źródło
Zostawię swój sposób postępowania na wypadek, gdyby mogło to komuś pomóc.
Mam generyczny
Parcelable
A potem tworzę paczki w ten sposób:
Co pozwala mi pozbyć się tego standardowego zastąpienia.
źródło
Niestety w Kotlinie nie ma możliwości umieszczenia prawdziwego pola w interfejsie, więc nie można go odziedziczyć z adaptera interfejsu za darmo:
data class Par : MyParcelable
Możesz spojrzeć na delegację, ale to nie pomoże z polami, AFAIK: https://kotlinlang.org/docs/reference/delegation.html
Więc jedyną opcją, jaką widzę, jest funkcja tkaniny
Parcelable.Creator
, co jest dość oczywiste.źródło
wolę po prostu korzystać z biblioteki https://github.com/johncarl81/parceler z
źródło
Możesz to zrobić za pomocą
@Parcelize
adnotacji. Jest to automatyczny generator realizacji Parcelable.Najpierw musisz umożliwić im dodanie tego do pliku build.gradle modułu:
Zadeklaruj serializowane właściwości w głównym konstruktorze i dodaj
@Parcelize
adnotację, awriteToParcel()
/createFromParcel()
metody zostaną utworzone automatycznie:Ty dont trzeba dodać
experimental = true
wewnątrzandroidExtensions
bloku.źródło
Kotlin bardzo ułatwił cały proces Parcelizacji w Androidzie dzięki adnotacji @Parcel.
Aby to zrobić
Krok 1. Dodaj rozszerzenia Kotlin w gradle modułu aplikacji
Krok 2. Dodaj eksperymentalne = true, ponieważ ta funkcja jest nadal w fazie eksperymentów w gradle.
Krok 3. Ogłoś klasę danych za pomocą @Parcel
Oto prosty przykład użycia @Parcel
źródło
Istnieje wtyczka, ale nie zawsze jest tak aktualizowana, jak ewoluuje Kotlin: https://plugins.jetbrains.com/plugin/8086
Alternatywa: mam działający przykład niestandardowej klasy danych przy użyciu
Parcelable
i list:Klasy danych używające Parcelable with Lists:
Mam nadzieję, że to pomoże!
źródło