Android MVVM Data Binding com Kotlin — O que vi da vida

Paulo Linhares
Packapps
Published in
4 min readJan 10, 2018

O que vi da vida nesses cinco meses de Data Binding no Android com Kotlin

Direto ao ponto:

Clean / Rebuild exaustivamente.

Data Binding tem alguns pontos de semelhança com AIDL no Android — veja este artigo sobre AIDL que postei. Com AIDL você precisa sentar o dedo em Rebuild Project para gerar a classe Stub. Com Data Binding também precisamos, a cada alteração em nosso layout XML ou em nossa class que representa a ViewModel do MVVM, espetar Clean/Rebuild para que o Android Studio trabalhe nas referências da classe BR — parecido com o que ele faz com a class R do Android — só que menos automatizada… em versões posteriores pode ser que melhorem isso no Android Studio.

A verdade é, que isso atrapalha muiiiiiito a produtividade. E mais, nem todas as vezes o clean/Rebuild funciona de primeira no AS e você pode achar que está diante de um erro no seu código.

Stub : é uma class que implementa uma interface remota e é crucial para comunicação entre processos. Saiba mais no artigo sobre AIDL.

ViewModel no Kotlin: get e set — só funcionam com field.

Até perceber que referenciar a propriedade, explicitamente, direto nos gets e sets do kotlin não funcionava, perdi algumas horas e alguns fios de cabelo.

O identificador field no kotlin é chamado de backing field (campo de apoio) e só pode ser usado como acessador de propriedades, e nunca referenciado diretamente como propriedade. Confuso ? Saiba mais na documentação do Kotlin aqui.

Binding Adapter : companion e @BindingAdapter não são suficientes

Os Binding Adapter necessitam ser métodos static (Java), onde no Kotlin se utiliza companion. Porém, para este uso em especial, é necessário adicionar a annotation @JvmStatic ao método — que especifica que um método static adicional precisa ser gerado.

Binding Adapter são necessários para fazer conversões de tipos de dados, complementar dados, ou mesmo ao pé da letra, servir como adapter para manipulação de dados — como é o caso do campo android:src do ImageView, neste caso é possível pegar uma URL externa de uma imagem e setar no widget através de uma Lib como Glide, Picasso, etc.

O Erro mais clássico — nem toda vez é um erro de fato

Esse é o erro mais típico “pedindo” que você faça clean/Rebuild para que suas alterações surtam efeito pois há conflito(s) no Binding. Mas as vezes pode ser que seja um erro de verdade — geralmente na sua class ViewModel ou na chamada da propriedade da class no XML.

Nunca adicione apenas <layout… sem um <data><variable…

<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">

<data>
<variable
name="presenter"
type="br.com.packapps.bpdrive.AddCreditCardActivity"/>
</data>
...

Na documentação diz que você pode muito bem adicionar apenas o container <layout> para encapsular todo o seu layout, mas isso vai lhe causar uma irritação enorme. Portanto, sempre adicione, junto com a tag <layout…>, a tag <data> e, pelo uma variável binding <variable… > — como no exemplo acima.

A tag <layout> em seu layout XML é indispensável para trabalhar com Data Binding no Android. É ela quem faz gerar sua class Bindlable. Exemplo, você tem uma MainActivity.class , é só após adicionar <layout> no seu XML que o “compilador” irá gerar a ActivityMainBinding.class.

Conclusão

Existe um mundo maravilhoso em trabalhar com dados reativos no Android — não ter que ficar buscando instância dos seus elementos de View para setar valores ou mudar algum comportamento. Mas neste momento (Android Studio 3.0.1) existe um preço alto a se pagar em produtividade.

Duas coisas irão acontecer de importante nesse mundo reativo do Android em breve: fazer a class BR do binding ter um comportamento parecido com o da R possibilitando a geração dos valores em tempo de compilação. A outra, é o avanço do nova arquitetura do Android — o pacote ARC . Esse último, acredito, que irá se tornar o pattern oficial do Android logo que entrar pelo menos numa fase Beta2.

É isso guys ! — se você passou por mais treta nesse mundo chamado Data Binding Android, não esqueça de deixar seu comentário. Abraço.

--

--

Paulo Linhares
Packapps

Android Developer at SKY, Santander | Superdigital , Iterative | Posto Ipiranga, YetGo, MelhorCorrida, Packapps…