Hoy vamos a crear un formulario de registro con Flutter de manera rápida y sencilla. El formulario consta de un CircleAvatar para mostrar una imagen de perfil, tres campos con validación de datos (username, email y password), y un botón de registro.

Requisitos

  • Android Studio con el SDK Android
  • El SDK Flutter

Si todavía no tienes Android Studio configurado para desarrollar aplicaciones con Flutter puedes visitar el tutorial de instalación.

Crear el proyecto con Android Studio

Abre Android Studio y crea un nuevo proyecto desde File->New->New Flutter Project. Selecciona Flutter Application y clic en next. En la siguiente pantalla damos un nombre a la aplicación y seleccionamos la ubicación donde se creará el proyecto. En la siguiente pantalla escribimos el nombre del paquete y clic en finish.

Añadir el plugin image_picker en pubspec.yaml

Antes de nada tenemos que añadir el plugin image_picker en el apartado de dependencias del archivo pubspec.yaml . Este plugin permite tomar una fotografía desde la cámara o seleccionar una imagen de la galería del dispositivo para posteriormente mostrarla en el widget CircleAvatar.

image picker flutter

El Widget Form con GlobalKey

A la hora de crear un formulario en Flutter podemos usar el widget Form. También es necesario crear una GlobalKey para identificarlo y validar su estado.

form widget flutter

En el código anterior tenemos una variable de tipo ImagePicker, que como su nombre indica permite seleccionar una imagen de la galería o de la cámara. En este ejemplo usaremos la cámara del dispositivo.

Dentro del widget Form tenemos un SingleChildScrollView, que proporciona la funcionalidad de scroll. También tenemos un widget Column donde situaremos los diferentes elementos del formulario; la imagen de perfil, los campos de texto y el botón.

CircleAvatar

A continuación añadimos un CircleAvatar a los children de Column. El widget  CircleAvatar renderiza una imagen circular con la foto del usuario.

CircleAvatar Flutter Form

En el momento que el usuario hace clic en el IconButton, llamamos al método pickImage().  A este le pasamos como parámetro la fuente de las imágenes, en este caso la cámara. Cuando obtenemos la imagen, invocamos a setState() que reconstruye el widget con el nuevo valor de _pickedImage.

image picker Flutter

TextFormFied

El usuario puede escribir datos en el formulario mediante tres TextFormField. El widget TextFormField crea un campo de texto con validación de datos. La función validator() se encarga de mostrar un mensaje de error si la información proporcionada por el usuario no es correcta.

TextFormField Flutter

Finalmente creamos un botón con el widget ElevatedButton. Una vez que es pulsado validamos el formulario mediante su GlobalKey. Si los datos son correctos mostramos un mensaje indicando que los datos están siendo procesados por el servidor.

ElevatedButton Flutter

El código completo del formulario

Archivo main.dart

import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'dart:io';

void main() => runApp(App());

class App extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blueGrey,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Form'),
        ),
        body: RegisterForm(),
      ),
    );
  }
}

// Create a Form widget.
class RegisterForm extends StatefulWidget {
  @override
  RegisterFormState createState() => RegisterFormState();
}

class RegisterFormState extends State<RegisterForm> {
  // Key that identifies the Form
  final _formKey = GlobalKey<FormState>();
  final _imagePicker = ImagePicker();
  File _pickedImage;

  @override
  Widget build(BuildContext context) {
    return Form(
      key: _formKey,
      child: SingleChildScrollView(
          child: Padding(
            padding: EdgeInsets.all(16),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.center,
              children: <Widget>[
                CircleAvatar(
                  radius: 40,
                  backgroundImage:
                      _pickedImage != null ? FileImage(_pickedImage) : null,
                ),
                // ignore: deprecated_member_use
                IconButton(
                  color: Colors.blueGrey,
                    onPressed: () async {
                      final img = await _imagePicker.pickImage(
                          source: ImageSource.camera);
                      setState(() {
                        _pickedImage = File(img.path);
                      });
                    },
                    icon: Icon(Icons.image)),
                TextFormField(
                  decoration: new InputDecoration( hintText: "Username"),
                  validator: (value) {
                    if (value.isEmpty || value.length < 2) {
                      return 'Please enter a correct username (min 2)';
                    }
                    return null;
                  },
                ),
                TextFormField(
                  decoration: new InputDecoration(hintText: "Email"),
                  validator: (value) {
                    if (value.isEmpty || !value.contains('@')) {
                      return 'Please enter a correct email';
                    }
                    return null;
                  },
                ),
                TextFormField(
                  decoration: new InputDecoration(hintText: "Password"),
                  obscureText: true,
                  validator: (value) {
                    if (value.isEmpty || value.length < 8) {
                      return 'Please enter a correct password (min 8)';
                    }
                    return null;
                  },
                ),
                Padding(padding: EdgeInsets.symmetric(vertical: 16)),
                ElevatedButton(
                  onPressed: () {
                    // If the form is true (valid), or false.
                    if (_formKey.currentState.validate()) {
                      ScaffoldMessenger.of(context).showSnackBar(
                        const SnackBar(content: Text('Processing data')),
                      );
                    }
                  },
                  child: Text('Signup'),
                ),
              ],
            ),
        ),
      ),
    );
  }
}

 

Enlace documentación Flutter Formularios.


0 comentarios

Deja una respuesta

Marcador de posición del avatar

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.

ACEPTAR
Aviso de cookies