There is a way to validate the input of the user with a TextFormField
or TextField
,to reject the input if it's not an email.

- 421
- 1
- 5
- 10
-
you can use Regex – JideGuru Aug 06 '20 at 22:54
-
https://pub.dev/packages/validation_textformfield – Anmol Mishra Feb 23 '22 at 12:27
9 Answers
You can use regex for this
Form and TextFormField like so
Form(
autovalidateMode: AutovalidateMode.always,
child: TextFormField(
validator: validateEmail,
),
)
then the validation function
String? validateEmail(String? value) {
const pattern = r"(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'"
r'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-'
r'\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*'
r'[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4]'
r'[0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9]'
r'[0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\'
r'x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])';
final regex = RegExp(pattern);
return value!.isNotEmpty && !regex.hasMatch(value)
? 'Enter a valid email address'
: null;
}
Link to regex https://stackoverflow.com/a/201378/12695188

- 4,417
- 1
- 28
- 73

- 7,102
- 6
- 26
- 48
-
5You should add nullability to the return type: `String? validateEmail` – Javi Marzán Jan 05 '22 at 21:57
-
-
1Thanks, this is great. However it doesn't check for the .com part of the email. So a user can put name@gmail for their email address, instead of name@gmail.com – mav91 May 18 '22 at 12:11
To validate the form, you can use the autovalidate
flag and set up a validator for email. There are many options, including regex or manually writing your own checker, but there are also packages available which implement email checking already.
For example, https://pub.dev/packages/email_validator.
To use it, add it to your pubspec:
dependencies:
email_validator: '^1.0.0'
import 'package:email_validator/email_validator.dart';
...
Form(
autovalidate: true,
child: TextFormField(
validator: (value) => EmailValidator.validate(value) ? null : "Please enter a valid email",
),
)
There are many other validation packages, some of which support may different types of validation. See this search for more https://pub.dev/packages?q=email+validation.

- 37,718
- 9
- 112
- 99
-
How can you make the validator display the message only when a submit button is pressed? When you do it this way it will display "Please enter a valid email" from the first letter you type. – Lakshan Costa Aug 27 '21 at 09:58
-
1There's a few easy options. One way to do it is to have a boolean in your class, something like `bool submitButtonPressed` and to set autovalidate to false until submit has been pressed. Or you could return null from your validator until that is true. Or... upi could put change listeners for `onSubmitted` or `onChanged` or `onEditingComplete` on each form element and manage the whole thing manually. – rmtmckenzie Aug 30 '21 at 05:50
-
Is there is a modified version of this? For example I want to see if a mail ends with 'robert@harvard.edu' or not – Tim's Dec 10 '21 at 11:33
-
The validation logic is quite simple - either you return null if the string is valid or an error string if not. So if you want to check for @harvard.edu, you could simply do something like `(EmailValidator.validate(value) && email.endsWith("@harvard.edu"))`. Or use regex. – rmtmckenzie Dec 10 '21 at 12:29
TextFormField(
validator: (val) => val.isEmpty || !val.contains("@")
? "enter a valid eamil"
: null,
decoration: InputDecoration(hintText: 'email'),
),
In the validator first we are checking if the formfeild is empty and also we are checking if the text entered dose not contains "@" in it . If those conditions are true then we are returning a text "enter a valid email" or else we are not returning anything

- 1,965
- 1
- 11
- 14
I suggest use of this excellent library called validators
- Add dependency to your package's
pubspec.yaml
file:
dependencies:
validators: ^2.0.0 # change to latest version
- Run from the command line:
$ pub get
// on VSCode u need not do anything.
- Import in your Dart code:
import 'package:validators/validators.dart';
- Validate your field
Form(
child: TextFormField(
validator: (val) => !isEmail(val) ? "Invalid Email" : null;,
),
)

- 496
- 7
- 14

- 36,687
- 39
- 170
- 242
QUICK FIX Use this in your TextFormField.
validator: (value) {
if(value == null || value.isEmpty || !value.contains('@') || !value.contains('.')){
return 'Invalid Email';
}
return null;
},

- 79
- 5
The previous answers all discuss options for verifying a TextFormField
in a Form
. The question asks about doing this in
TextFormField
orTextField
TextField
does not support the validator:
named parameter but you can use any of the previously mentioned techniques to check the validity of the email every time the user modifies the email address text. Here is a simple example:
TextField(
keyboardType: TextInputType.emailAddress,
textAlign: TextAlign.center,
onChanged: (value) {
setState(() {
_email = value;
_emailOk = EmailValidator.validate(_email);
});
},
decoration:
kTextFieldDecoration.copyWith(hintText: 'Enter your email'),
),
You can use the validation result as you see fit. One possibility is to keep a login
button deactivated until a valid email address has been entered:
ElevatedButton(
child: Text('Log In'),
// button is disabled until something has been entered in both fields.
onPressed: (_passwordOk && _emailOk) ? ()=> _logInPressed() : null,
),

- 139
- 1
- 9
If you use flutter_form_builder with flutter_builder_validators
email verification can be done easily
FormBuilderTextField(
name: 'email',
decoration: InputDecoration(
labelText: 'Email',
errorText: _emailError,
),
validator: FormBuilderValidators.compose([
FormBuilderValidators.required(),
FormBuilderValidators.email(),
]),
),

- 21,988
- 13
- 81
- 109

- 1,777
- 4
- 20
- 40
TextFormField(
validator: (value) {
if(value.isEmpty) {
return "Please enter email";
} else if(!value.contains("@")) {
return "Please enter valid email";
}
},
decoration: InputDecoration(hintText: 'email'),
),

- 1,176
- 3
- 14
No need to use external libraries or Regex! Put your text field inside a form, set autovalidate to 'always' and inside TextFormField add a validator function:
Form(
autovalidateMode: AutovalidateMode.always,
child: TextFormField(
validator: validateEmail,
),
)
Validator function:
String? validateEmail(String? value) {
if (value != null) {
if (value.length > 5 && value.contains('@') && value.endsWith('.com')) {
return null;
}
return 'Enter a Valid Email Address';
}
note: length > 5 because '.com' and '@' make 5 characters.

- 112
- 1
- 3
-
1You can't use the check `value.endsWith('.com')` since every email address does not end with `.com`. There are for example email addresses which end with .co, .org, .net, .xyz and .fi – Crossoni May 05 '22 at 09:20