Jetpack Compose: Stateless X Stateful

Lucas C. Wottrich
Warren Tech

--

Bem-vindes, Lucas Wottrich aqui :)

A ideia desse artigo é mostrar a diferença entre um componente Stateless(sem estado) e um componente Stateful(com estado) no Compose.

O projeto que estou usando como base:

O que é importante saber para entender o artigo:

  • Ter uma noção básica de Jetpack Compose
  • Ter uma noção intermediária de desenvolvimento android

Nível do artigo: Básico/Intermediário

🚉 Estado

Antes de continuarmos precisamos entender o que é um estado.

Estado em uma aplicação é qualquer valor que pode mudar com o tempo.

E isso abrange muitas coisas, desde de eventos que vem a partir de um clique do usuário que pode mudar o estado de um switch até algum request assíncrono que você está esperando de uma API para carregar uma tela.

👥 Stateless X Stateful

Com isso entramos nos estados do compose, que aqui estamos definido como:

  • Stateless (Sem estado)
  • Stateful (Com estado)

Ok, mas você deve estar perguntando, o que define um componente com estado e um componente sem estado? E a resposta é simples, ou pelo menos é para ser.

Um componente com estado é todo o componente que pode mudar com o tempo e um componente sem estado é todo o componente que não vai mudar com o tempo. Bingo!

Vamos ver alguns exemplos?

🌓 Stateful

Primeiro um componente Stateful:

@Composable
fun RememberPassword() {
val isRemember by mutableStateOf(false)
val rememberPasswordText =
if (isRemember) "vamos lembrar sua senha"
else "Devemos lembrar senha?"
Button(onClick = { isRemember = !isRemember}) {
Text(text = rememberPasswordText)
}
}

Aqui estamos fazendo um botão que dependendo do estado do isRemember ele troca o texto. Ou seja, o usuário clica e um estado muda, no nosso caso é o texto do botão que muda.

E aqui está o preview do nosso botão:

O texto do botão é definido como um estado por causa do mutableStateOf que carrega um state dizendo se o “remember password” está habilitado ou não.

Simples, não?

Mas agora vamos introduzir um outro problema:
Nós precisamos pegar o valor que está no isRemember para podermos avisar em algum lugar que queremos lembrar aquela senha.

💀 Stateless

Com esse problema conseguimos entrar no conceito de extração de estado de um componente, muito conhecido como stateless:

@Composable
fun PasswordBox() {
var isRemember by mutableStateOf(false)
RememberPassword(isRemember = isRemember) {
isRemember = !isRemember
}
}

@Composable
fun RememberPassword(isRemember: Boolean, onClick: () -> Unit) {
val rememberPasswordText =
if (isRemember) "vamos lembrar sua senha"
else "Devemos lembrar senha?"
Button(onClick = onClick) {
Text(text = rememberPasswordText)
}
}

Agora nós passamos a responsabilidade do controle do estado para o pai do RememberPassword fazendo com que o mesmo se torne um componente stateless.

A vantagem de ter mais componentes stateless do que stateful é que eles ficam extremamente mais reutilizáveis e extremamente mais testáveis.

Um exemplo, por favor!!

Um exemplo bom é o que acabamos de fazer com o RememberPassword, quando ele era stateful nós tínhamos que rodar a aplicação e clicar no botão para testar os dois casos dele(habilitado e desabilitado), e agora que ele é stateless podemos fazer isso:

Dois previews testando os dois casos dele! E como falamos antes: aumentamos a sua usabilidade e testabilidade!

🍥 Conclusão

Entendemos, com exemplos simples, o quão importante é cada tipo de estado no compose e sei que você deve estar imaginando o tanto de coisa complexa e maluca que se pode fazer com esses estados que você viu por aqui!

Não se acanhe, deixe seu comentário com o que você está imaginando ou com alguma duvida, sugestão ou melhoria. :)

🎉 Obrigado!!

Chegamos no fim desse artigo, muito obrigado por ter separado esse tempo do seu dia para ler :)

Se você gostou e acha que eu mereço o seu 👏(clap), por favor, sinta-se a vontade. ❤️

Tenha um bom resto de dia!
Até a próxima.

Acompanhe nossas novidades em https://warren.com.br

--

--

Lucas C. Wottrich
Warren Tech

Android Developer at iFood. Descomplicando códigos e ajudando a comunidade a crescer com conteúdos pt-BR.