Form Validation é o processo de verificar todos os campos de um formulário quanto à correção antes de enviar os dados ao servidor. Ao contrário da validação de um campo individual, a Form Validation leva em conta as relações entre campos: confirmação de senha, dependência de um campo em relação a outro, obrigatoriedade condicional. De acordo com Google Developers, 2026, o Form Validation deve verificar o formulário inteiro ao enviar e fornecer ao usuário um resumo de todos os erros. A validação correta do formulário aumenta a conversão de registro em 25-35% e reduz a quantidade de erros na entrada de dados.
Pontos principais
Form Validation é um processo que garante que todos os dados inseridos pelo usuário em um formulário atendam aos requisitos de negócio antes de serem enviados ao servidor. A validação do formulário inclui verificar cada campo individualmente, bem como verificações cruzadas: se a senha corresponde à confirmação, se pelo menos uma caixa de seleção está marcada, se todos os campos obrigatórios estão preenchidos, se a data está correta (por exemplo, a data de nascimento não está no futuro).
A diferença da validação simples de campo é que Form Validation opera com o formulário como um todo. Ela pode bloquear o envio se um campo condicional não for preenchido, ou mostrar um resumo de erros em uma janela de diálogo. Em formulários complexos (registro, finalização de compra, questionários), a validação do formulário é uma camada de lógica separada que é testada independentemente da interface do usuário.
De acordo com pesquisas de UX da NN Group, os usuários completam um formulário 3 vezes mais frequentemente se veem os erros imediatamente após o envio, em vez de após cada campo individualmente. No entanto, o melhor resultado vem de uma combinação: validação instantânea de campos simples (comprimento, formato) + verificação completa no envio para campos cruzados e lógica de negócio.
A validação de campo responde à pergunta: a entrada neste campo específico está correta? O email tem o formato user@domain.com, o telefone consiste em dígitos, a senha tem mais de 6 caracteres. A validação de campo é isolada — não depende de outros campos e pode ser executada em tempo real. Resultado: um erro para um campo específico ou ausência de erro.
A validação do formulário responde à pergunta: o formulário pode ser enviado como um todo? Ela leva em conta não apenas cada campo, mas também suas combinações: a senha e a confirmação devem coincidir, a data de início não pode ser posterior à data de término, a soma dos campos deve ser igual a 100%. A validação do formulário é executada no envio e retorna um resultado geral: o formulário é válido ou não.
Arquitetonicamente, a validação de campo é colocada na camada de UI (fragmento, ViewModel), enquanto a validação do formulário é colocada na camada de domínio (use case, interactor). Isso permite reutilizar a validação do formulário em diferentes componentes de UI e testá-la sem emulador. Na Clean Architecture, a validação do formulário é uma regra de negócio, não lógica de UI.
| Critério | Validação de campo | Validação de formulário |
|---|---|---|
| Objeto de verificação | Um campo | Todos os campos + suas relações |
| Momento de execução | Tempo real / ao perder o foco | Ao enviar o formulário |
| Resultado | Erro de um campo específico | Status geral do formulário + lista de erros |
| Camada de arquitetura | Camada de UI | Camada de domínio |
Existem duas abordagens principais para Form Validation. A primeira é imperativa: o desenvolvedor escreve uma função que verifica sequencialmente cada campo e coleta uma lista de erros. Esta abordagem é simples de entender, mas o código cresce a cada novo campo. Para um formulário com 5 campos, a abordagem imperativa ainda é conveniente; para 15 campos, já é problemática.
A segunda abordagem é declarativa: as regras de validação são descritas por anotações ou configuração. A própria biblioteca percorre todos os campos, aplica as regras e retorna o resultado. Exemplo: a anotação @Email no campo emailData, @ConfirmPassword no campo de confirmação. A abordagem declarativa reduz o código de validação em 3-5 vezes e o torna legível.
A terceira abordagem é reativa usando RxJava ou Kotlin Flow. Cada campo é representado como um Observable ou StateFlow. A validação do formulário se inscreve nas mudanças de todos os campos e recalcula o estado geral a cada mudança. O botão de envio torna-se automaticamente ativo quando todos os campos são válidos. Esta abordagem requer compreensão de programação reativa, mas proporciona a UX mais suave.
Considere um formulário de registro com três campos: email, senha e confirmação de senha. A validação do formulário inclui: verificação do email através de Patterns.EMAIL_ADDRESS, verificação de que a senha tenha comprimento mínimo de 8 caracteres e contenha pelo menos um dígito, verificação de que a senha e a confirmação coincidem. Somente quando todas as três verificações passam, o formulário pode ser enviado.
data class RegistrationForm(
val email: String,
val password: String,
val confirmPassword: String
)
fun validateRegistration(form: RegistrationForm): ValidationResult {
if (!Patterns.EMAIL_ADDRESS.matcher(form.email).matches())
return ValidationResult(false, "Invalid email address")
if (form.password.length < 8)
return ValidationResult(false, "Password too short")
if (form.password != form.confirmPassword)
return ValidationResult(false, "Passwords do not match")
return ValidationResult(true)
}
No exemplo, validateRegistration recebe uma data class do formulário e retorna um ValidationResult. Se pelo menos uma verificação falhar, retorna false com uma mensagem correspondente. O gerenciamento do botão de envio é baseado no Result: se isValid = true, o botão está ativo. Para atualizar o estado em tempo real, pode-se usar LiveData
A abordagem reativa com Kotlin Flow permite recalcular automaticamente o estado do formulário. Cada campo é representado como MutableStateFlow
Android Saripaar é a biblioteca de validação mais popular para Android. Ela permite anotar campos e Views diretamente: @Email, @NotEmpty, @Password(min = 8, scheme = Password.Scheme.ALPHA_NUMERIC). A validação é acionada com uma única linha validator.validate() com um callback. O Saripaar define automaticamente o erro através de setError no EditText. A biblioteca também suporta anotações personalizadas para regras de negócio específicas.
RxBinding + RxJava é uma abordagem reativa sem uma biblioteca de validação separada. Cada campo publica mudanças através de RxTextView.textChanges(). O operador combineLatest funde todos os campos e calcula o status geral. Vantagem: controle total sobre o pipeline de validação, possibilidade de adicionar debounce, throttle, filter. Desvantagem: requer conhecimento de RxJava.
Material Design Components fornecem suporte incorporado para TextInputLayout e TextInputEditText. A biblioteca não fornece validação como tal, mas oferece uma UI para exibir erros: setError(), setHelperText(), setCounterEnabled(). Para a validação em si, ainda é necessária lógica manual ou Saripaar. Os Material Components cuidam da exibição, não da verificação.
O primeiro erro é a validação apenas no cliente. A Form Validation no cliente é destinada à UX, não à segurança. Um invasor pode enviar uma solicitação diretamente à API, ignorando a validação. O servidor deve verificar todos os campos novamente. A validação do lado do cliente não deve ser a única proteção — é uma camada adicional para a conveniência do usuário, não para a segurança dos dados.
O segundo erro é bloquear o botão de envio sem mensagens. Se o botão estiver inativo, o usuário deve ver quais campos precisam ser corrigidos. Um botão cinza sem explicação é uma das causas mais comuns de baixa conversão de formulários. Sempre mostre os erros dos campos ao lado deles, mesmo se o botão estiver desabilitado. O usuário deve entender o que exatamente impede o envio.
O terceiro erro é ignorar verificações cruzadas. Validar cada campo individualmente é insuficiente. Os campos podem depender uns dos outros: senha e confirmação, data de início e data de término, país e cidade. A Form Validation deve verificar essas relações. Verificar apenas campos individuais cria uma falsa sensação de segurança — o formulário pode ser enviado com dados inconsistentes.
| Erro | Consequência | Solução |
|---|---|---|
| Apenas validação no cliente | Vulnerabilidade de segurança | Verificação obrigatória no servidor |
| Botão sem mensagens | Baixa conversão do formulário | Mostrar erros dos campos |
| Sem verificações cruzadas | Dados inconsistentes | Validar relações entre campos |
| Verificações muito frequentes | Irritação do usuário | Debounce e verificação ao perder o foco |
Perguntas frequentes
A validação de campo verifica um único valor contra requisitos de formato ou comprimento. O Form Validation verifica todos os campos juntos, incluindo verificações cruzadas: correspondência de senhas, dependências entre campos. A validação de campo é executada na camada de UI, o Form Validation — na camada de domínio como uma regra de negócio.
Use uma abordagem reativa: combine todos os campos em um único Flow ou Observable e inscreva-se nas mudanças. A cada mudança de qualquer campo, recalcule o status geral do formulário. Se o status for válido — o botão está ativo. Use Kotlin Flow com combine ou RxJava com combineLatest para atualizações automáticas.
Android Saripaar é a melhor escolha para validação declarativa com anotações. Se o projeto usa RxJava — o RxBinding fornece uma abordagem reativa sem uma biblioteca separada. Para formulários simples, a validação manual com Patterns e TextUtils sem dependências externas é suficiente.
Absolutamente. A validação no cliente melhora a UX, mas não fornece segurança. O servidor deve verificar todos os dados novamente, pois a API é diretamente acessível. Nunca confie apenas na validação do cliente para se proteger contra dados incorretos ou maliciosos.
No Jetpack Compose, use Kotlin Flow ou StateFlow para armazenar o estado de cada campo. A função de validação recebe o estado do formulário e retorna um ValidationResult. O botão de envio se inscreve no status geral. Para exibir erros, use isError no OutlinedTextField ou TextField do Compose.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também