Atualmente estou usando o excelente AutoParcel em meu projeto Java, o que facilita a criação de classes Parcelable.
Agora, Kotlin, que considero para meu próximo projeto, tem esse conceito de classes de dados, que geram automaticamente os métodos equals, hashCode e toString.
Existe uma maneira conveniente de tornar uma classe de dados Kotlin Parcelable de maneira conveniente (sem implementar os métodos manualmente)?
android
parcelable
kotlin
thalesmello
fonte
fonte
Respostas:
Kotlin 1.1.4 está fora
O plugin de extensões do Android agora inclui um gerador automático de implementação Parcelable. Declare as propriedades serializadas em um construtor primário e adicione uma anotação @Parcelize, e os métodos writeToParcel () / createFromParcel () serão criados automaticamente:
Portanto, você precisa habilitá-los adicionando isto ao build.gradle do seu módulo :
fonte
this calss implements Parcelable but does not provice CREATOR field
. A sua resposta é suficiente (completa)?@SuppressLint("ParcelCreator")
para se livrar do aviso de fiapos.Você pode experimentar este plugin:
android-parcelable-intellij-plugin-kotlin
Ele ajuda a gerar o código padrão do Android Parcelable para a classe de dados de kotlin. E finalmente ficou assim:
fonte
Você já experimentou o PaperParcel ? É um processador de anotações que gera automaticamente o
Parcelable
código padrão do Android para você.Uso:
Anote sua classe de dados com
@PaperParcel
, implementePaperParcelable
e adicione uma instância estática JVM do gerado,CREATOR
por exemplo:Agora sua classe de dados é
Parcelable
e pode ser passada diretamente para umBundle
ouIntent
Editar: Atualizar com a API mais recente
fonte
Basta clicar na palavra-chave de dados de sua classe de dados kotlin, pressionar alt + Enter e selecionar a primeira opção dizendo
"Add Parceable Implementation"
fonte
parcel.read...
porTODO
, se um campo não forval/var
. Se você usarList
dentro de uma classe, sua implementação se torna um problema. Então me voltei para@Parcelize
a resposta aceita.A melhor maneira sem nenhum código clichê é o plugin Smuggler gradle. Tudo que você precisa é apenas implementar a interface AutoParcelable como
E isso é tudo. Funciona para classes fechadas também. Além disso, este plugin fornece validação de tempo de compilação para todas as classes AutoParcelable.
UPD 17.08.2017 Agora com o Kotlin 1.1.4 e o plugin de extensões do Kotlin Android, você pode usar
@Parcelize
anotações. Neste caso, o exemplo acima será semelhante a:Não há necessidade de
data
modificador. A maior desvantagem, por enquanto, é usar o plugin kotlin-android-extensions, que tem muitas outras funções que podem ser desnecessárias.fonte
Usando o Android Studio e o plug-in Kotlin , descobri uma maneira fácil de converter meus antigos Java
Parcelable
s sem plug-ins extras (se tudo o que você deseja é transformar umadata
classe totalmente nova em umParcelable
, pule para o quarto trecho de código).Digamos que você tenha uma
Person
classe com toda a estruturaParcelable
padrão:Comece eliminando a
Parcelable
implementação, deixando um objeto Java básico e simples (as propriedades devem ser finais e definidas pelo construtor):Em seguida, deixe a
Code > Convert Java file to Kotlin File
opção fazer sua mágica:Converta isso em uma
data
classe:E, finalmente, vamos transformar isso em um
Parcelable
novamente. Passe o mouse sobre o nome da classe e o Android Studio fornecerá a opção deAdd Parcelable Implementation
. O resultado deve ser assim:Como você pode ver, a
Parcelable
implementação é algum código gerado automaticamente anexado à suadata
definição de classe.Notas:
Parcelable
diretamente em Kotlin não produzirá o mesmo resultado com a versão atual do plug-in Kotlin (1.1.3
).Parcelable
introduzidas pelo gerador de código atual . Deve ser um bug menor.Espero que esta dica funcione para você tão bem quanto funcionou para mim.
fonte
Vou deixar minha maneira de fazer caso possa ajudar alguém.
O que eu faço é ter um genérico
Parcelable
E então eu crio pacotes como este:
O que me livra dessa substituição clichê.
fonte
Exemplo:
fonte
Infelizmente, não há como no Kotlin colocar um campo real em uma interface, então você não pode herdá-lo de um adaptador de interface gratuitamente:
data class Par : MyParcelable
Você pode olhar para delegação, mas não ajuda com campos, AFAIK: https://kotlinlang.org/docs/reference/delegation.html
Portanto, a única opção que vejo é uma função de tecido
Parcelable.Creator
, o que é meio óbvio.fonte
eu prefiro apenas usar o https://github.com/johncarl81/parceler lib com
fonte
Você pode fazer isso usando
@Parcelize
anotações. É um gerador automático de implementação Parcelable.Primeiro, você precisa habilitá-los adicionando isto ao build.gradle do seu módulo:
Declare as propriedades serializadas em um construtor primário e adicione uma
@Parcelize
anotação, e os métodoswriteToParcel()
/createFromParcel()
serão criados automaticamente:Você NÃO precisa adicionar um bloco
experimental = true
internoandroidExtensions
.fonte
O Kotlin tornou todo o processo de Parcelização no Android muito fácil com sua anotação @Parcel.
Fazer isso
Etapa 1. Adicionar extensões Kotlin ao gradle do módulo de aplicativo
Etapa 2. Adicione experimental = true, pois esse recurso ainda está em experimentação no gradle.
Etapa 3. Anote a classe de dados com @Parcel
Aqui está um exemplo simples de uso do @Parcel
fonte
Existe um plug-in, mas nem sempre é atualizado conforme o Kotlin está evoluindo: https://plugins.jetbrains.com/plugin/8086
Alternativa: tenho um exemplo funcional de uma classe de dados personalizados usando
Parcelable
e listas:Classes de dados usando Parcelable with Lists:
Espero que ajude!
fonte