Apresentando o fireXtensions
Mudando a forma como você utiliza o Firebase no Android
ATUALIZAÇÃO 29/09/2019: O fireXtensions foi descontinuado a favor das bibliotecas KTX oficiais do Firebase. Obrigado a todos que contribuiram, apoiaram ou utilizaram o fireXtensions.
18 de Maio de 2017 foi o dia em que a Google anunciou, durante o Google I/O, que Kotlin passa a ser (oficialmente) uma linguagem para desenvolvimento de aplicações Android. Isso porque:
Kotlin is expressive, concise, and powerful.
(Kotlin é expressivo, conciso e poderoso)
Essa foi uma das melhores novidades do I/O, pois esta linguagem traz várias funcionalidades que facilitam a vida dos desenvolvedores e de certa forma melhora a produtividade deles. Se você não conhece as funcionalidades da linguagem, recomendo que leia esta série de artigos do Paulo Enoque:
Kotlin Extensions
Uma funcionalidade que, em particular, chamou a minha atenção foi Kotlin Extensions. Esta funcionalidade permite que você adicione novos métodos à classes que não são suas, sem ter de herdar (o famoso extends
do java) dessa classe. Por exemplo: eu posso criar um método que verifica se uma String
contém ponto de exclamação(!
), algo como:
fun contemPontoExclamacao(umaString: String): Boolean {
return umaString.contains('!')
}
Mas para usar o método, eu tenho de chamar da seguinte forma: contemPontoExclamacao("Olá Mundo!")
. Isso parece ok, mas imagine se eu tiver de chamar o método em várias classes — teria de declarar o método em todas elas ou declará-lo em uma só classe e definí-lo como estático. Ou até criar uma classe MinhaString
que herda da classe String
e implementa o método contemPontoExclamacao()
. Depois teria de mudar o tipo de dado de todas as Strings do meu programa para que passasse a ser do tipoMinhaString
.
Utilizando Kotlin Extensions, eu posso fazer com que este método faça parte da classe String:
fun String.contemPontoExclamacao(): Boolean{
return contains('!')
}
E então posso chamá-lo em qualquer classe, sempre da mesma forma:
"Olá Mundo!".contemPontoExclamacao()
// ou:
val frase = "Olá Mundo"
frase.contemPontoExclamacao()
Como você pode ver, Kotlin simplifica o código que temos de escrever. Muitos desenvolvedores (a google inclusive) aproveitaram disso para desenvolver bibliotecas que tornam o desenvolvimento Android mais simples. Falo de bibliotecas como Android KTX, Anko, Nahu, entre outras.
FireXtensions
Foi inspirado nessas bibliotecas que decidi desenvolver o fireXtensions. fireXtensions é uma biblioteca que vem para simplificar a forma como nós (desenvolvedores) executamos operações no Firebase. Atualmente, a biblioteca suporta a Realtime Database e Cloud Firestore.
Por exemplo:
Para ler utilizadores da Realtime Database com Kotlin, você utilizaria o código:
ref.addValueEventListener(object: ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
val utilizadores = ArrayList<Utilizador>()
for (snapshot in dataSnapshot.children) {
val utilizador = dataSnapshot.getValue(Utilizador::class.java)
utilizadores.add(utilizador!!)
}
// Mostrar os utilizadores na UI
}
override fun onCancelled(error: DatabaseError) {
// Mostrar o erro
}
})
Com fireXtensions:
ref.observeChildren<Utilizador> { utilizadores, error ->
utilizadores?.let {
// Mostrar os utilizadores na UI
}
error.let {
// Mostrar o erro
}
}
Fica mais simples, não é?
Exemplo 2: Ler dados da cidade “Maputo que está na coleção “cidades” do Firestore:
val docRef = db.collection("cidades").document("Maputo")
docRef.get().addOnCompleteListener { task ->
if (task.isSuccessful()) {
val cidade = task.result.toObject(Cidade::class.java)
// Mostrar a cidade
}
}
Com fireXtensions:
docRef.getDocument<Cidade>() { cidade, _ ->
cidade?.let {
// Mostrar a cidade
}
}
Como fazer essa magia?
Utilizar o fireXtensions na sua aplicação é muito simples, basta seguir as instruções encontradas no site:
- Adicionar o maven do jitpack para o
build.gradle
do projecto:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
2. Adicionar a dependência ao build.gradle
da app. Aqui você tem 2 opções:
- Adicionar as extensions para Realtime Database e Cloud Firestore:
dependencies {
implementation 'com.github.rosariopfernandes:fireXtensions:0.3.4'
}
- Ou adicionar as extensions só para Realtime Database ou só para Cloud Firestore:
dependencies { // Use apenas uma:
// Importar só a database
implementation 'com.github.rosariopfernandes.fireXtensions:database:0.3.4'
// ou importar só o firestore
implementation 'com.github.rosariopfernandes.fireXtensions:firestore:0.3.4'
}
Conheça todas as extensions oferecidas pela biblioteca nos tutoriais:
Contribuir para a biblioteca
fireXtensions é open source (sob a MIT License) e você pode contribuir no GitHub. Abra um issue para sugerir uma alteração, pode ser uma nova funcionalidade ou correção de bugs. Se a sua alteração for aprovada, aí você poderá mandar um Pull Request para fazê-la ou esperar que alguém o faça.
Espero que esta biblioteca simplifique a forma como você escreve o seu código Android e que ajude-lhe a melhorar a sua produtividade. 🙂 Caso tenha alguma dúvida ou sugestão, deixe abaixo nos comentários. Se você estiver tentando usar o fireXtensions e teve um problema, abra um issue no GitHub explicando o que você fez e qual foi o erro que teve.