Formulario con validación en Flutter: ejercicio resuelto

Formulario con validación en Flutter: ejercicio resuelto

Si necesitas formulario con validación en Flutter, este ejemplo te ayuda a validar email y password antes de enviar.

Enunciado

Construye un formulario con:

  • campo email,
  • campo password,
  • validaciones,
  • botón enviar con feedback.

Solución en Flutter

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import 'package:flutter/material.dart';

void main() => runApp(const MaterialApp(home: LoginFormPage()));

class LoginFormPage extends StatefulWidget {
  const LoginFormPage({super.key});

  @override
  State<LoginFormPage> createState() => _LoginFormPageState();
}

class _LoginFormPageState extends State<LoginFormPage> {
  final _formKey = GlobalKey<FormState>();
  final _emailCtrl = TextEditingController();
  final _passCtrl = TextEditingController();

  @override
  void dispose() {
    _emailCtrl.dispose();
    _passCtrl.dispose();
    super.dispose();
  }

  void submit() {
    if (_formKey.currentState!.validate()) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Formulario valido: ${_emailCtrl.text}')),
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Formulario Flutter')),
      body: Padding(
        padding: const EdgeInsets.all(16),
        child: Form(
          key: _formKey,
          child: Column(
            children: [
              TextFormField(
                controller: _emailCtrl,
                decoration: const InputDecoration(labelText: 'Email'),
                validator: (value) {
                  if (value == null || value.isEmpty) return 'Email obligatorio';
                  if (!value.contains('@')) return 'Email no valido';
                  return null;
                },
              ),
              TextFormField(
                controller: _passCtrl,
                decoration: const InputDecoration(labelText: 'Password'),
                obscureText: true,
                validator: (value) {
                  if (value == null || value.length < 6) return 'Minimo 6 caracteres';
                  return null;
                },
              ),
              const SizedBox(height: 16),
              ElevatedButton(onPressed: submit, child: const Text('Enviar')),
            ],
          ),
        ),
      ),
    );
  }
}

Resultado esperado

El botón solo permite enviar cuando ambos campos cumplen reglas básicas.

Errores frecuentes

  • No usar GlobalKey<FormState>.
  • Validar en onChanged sin control.
  • Olvidar liberar TextEditingController.

Aplicación práctica

Es el bloque base para login, registro, checkout y formularios internos de negocio.

Siguiente ejercicio recomendado

Práctica guiada y siguiente paso

FAQ

¿Qué widget se usa para formularios en Flutter?

Normalmente Form junto con TextFormField y validadores por campo.

¿Dónde guardar errores de validación?

En los validadores de cada campo, devolviendo mensajes claros y breves.

¿Este enfoque es escalable?

Sí. Puedes extraer reglas y reutilizar validadores en pantallas grandes.