Learn how to implement form validation in Flutter using Dart through this complete tutorial. This guide will walk you through setting up a form with input fields, adding validation logic, and displaying validation messages. We’ll use Android Studio as the development environment, and the example includes email and password validation using TextFormField
and Form
widgets.

Flutter provides a flexible way to manage form states, and combining that with Dart allows you to perform custom validation rules. In this article, you’ll also learn how to trigger validation programmatically and show error messages to the user.
Below is a complete example of how to implement basic form validation in Flutter:
main.dart
import 'package:flutter/material.dart'; import 'form_validation_page.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Form Validation', theme: ThemeData( primarySwatch: Colors.blue, ), home: const FormValidationPage(), ); } }
form_validation_page.dart
import 'package:flutter/material.dart'; class FormValidationPage extends StatefulWidget { const FormValidationPage({super.key}); @override State<FormValidationPage> createState() => _FormValidationPageState(); } class _FormValidationPageState extends State<FormValidationPage> { final _formKey = GlobalKey<FormState>(); final _emailController = TextEditingController(); final _passwordController = TextEditingController(); @override void dispose() { _emailController.dispose(); _passwordController.dispose(); super.dispose(); } String? _validateEmail(String? value) { if (value == null || value.isEmpty) { return 'Please enter your email'; } final emailRegex = RegExp(r'^[^@]+@[^@]+\.[^@]+'); if (!emailRegex.hasMatch(value)) { return 'Enter a valid email'; } return null; } String? _validatePassword(String? value) { if (value == null || value.length < 6) { return 'Password must be at least 6 characters'; } return null; } void _submitForm() { if (_formKey.currentState!.validate()) { // Process the form ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('Form submitted successfully!')), ); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('Form Validation')), body: Padding( padding: const EdgeInsets.all(16.0), child: Form( key: _formKey, child: Column( children: [ TextFormField( controller: _emailController, decoration: const InputDecoration( labelText: 'Email', border: OutlineInputBorder(), ), validator: _validateEmail, ), const SizedBox(height: 16), TextFormField( controller: _passwordController, decoration: const InputDecoration( labelText: 'Password', border: OutlineInputBorder(), ), obscureText: true, validator: _validatePassword, ), const SizedBox(height: 24), ElevatedButton( onPressed: _submitForm, child: const Text('Submit'), ), ], ), ), ), ); } }
To learn more about the Form
widget and validation, check out the official Flutter documentation on forms.