如何使用 email_validator 验证电子邮件地址

Posted

技术标签:

【中文标题】如何使用 email_validator 验证电子邮件地址【英文标题】:How to use email_validator to validate an email address 【发布时间】:2022-01-14 05:15:34 【问题描述】:

我正在尝试为我的应用程序构建一个注册页面。我尝试使用 email_validator 2.0.1 检查电子邮件是否有效,但它不起作用,它没有给出任何错误,也没有打印错误文本。

我的代码如下:

Widget buildSignInForm() 
    final _signInFormKey = GlobalKey<FormState>();
    TextEditingController _emailController = TextEditingController();
    TextEditingController _passwordController = TextEditingController();
    return Padding(
      padding: const EdgeInsets.all(20.0),
      child: Form(
        key: _signInFormKey,
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              "Lütfen Giriş Yapınız",
              style: TextStyle(fontSize: 25),
            ),
            SizedBox(
              height: 20,
            ),
            TextFormField(
              controller: _emailController,
              validator: (value) 
                if (value != null && !EmailValidator.validate(value)) 
                  return "Please Enter a Valid E-mail";
                 else 
                  return null;
                
              ,

【问题讨论】:

【参考方案1】:

最快最简单的解决方案是使用正则表达式:

extension EmailValidator on String 
  bool isValidEmail() 
    return RegExp(
            r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]1,3\.[0-9]1,3\.[0-9]1,3\.[0-9]1,3\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]2,))$')
        .hasMatch(this);
  

并使用字符串的扩展名来验证电子邮件:

TextFormField(
  autovalidate: true,
  validator: (input) => input.isValidEmail() ? null : "Check your email",
)

Ref

【讨论】:

【参考方案2】:

请参考以下代码

解决方案 1

class MainScreen extends StatefulWidget 
  MainScreen(Key key) : super(key: key);

  @override
  _MainScreenState createState() => _MainScreenState();


class _MainScreenState extends State<MainScreen> 
  final TextEditingController emailController = TextEditingController();

  final FocusNode emailFocus = FocusNode();

  final TextEditingController pswdController = TextEditingController();

  final FocusNode pswdFocus = FocusNode();

  final _validationKey = GlobalKey<FormState>();

  @override
  void initState() 
    super.initState();
  

  @override
  void dispose() 
    super.dispose();
  

  int validateEmail(String emailAddress) 
    String patttern = r'^[\w-\.]+@([\w-]+\.)+[\w-]2,4$';
    RegExp regExp = new RegExp(patttern);
    if (emailAddress.isEmpty || emailAddress.length == 0) 
      return 1;
     else if (!regExp.hasMatch(emailAddress)) 
      return 2;
     else 
      return 0;
    
  

  int validatePassword(String pswd) 
    if (pswd.isEmpty || pswd.length == 0) 
      return 1;
     else if (pswd != null && pswd.isNotEmpty && pswd.length <= 8) 
      return 2;
     else 
      return 0;
    
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.lightBlue,
        automaticallyImplyLeading: true,
        leading: Icon(
          Icons.arrow_back,
        ),
        title: Text("Example"),
        centerTitle: true,
      ),
      body: Container(
        padding: EdgeInsets.all(15.0),
        child: Column(
          children: [
            Form(
              key: _validationKey,
              child: Column(
                children: [
                  /* Email */
                  TextFormField(
                    autovalidateMode: AutovalidateMode.onUserInteraction,
                    /* autovalidate is disabled */
                    controller: emailController,
                    keyboardType: TextInputType.emailAddress,
                    onChanged: (val) ,
                    maxLines: 1,
                    validator: (value) 
                      int res = validateEmail(value);
                      if (res == 1) 
                        return "Please  fill email address";
                       else if (res == 2) 
                        return "Please enter valid email address";
                       else 
                        return null;
                      
                    ,
                    focusNode: emailFocus,
                    autofocus: false,
                    decoration: InputDecoration(
                      errorMaxLines: 3,
                      counterText: "",
                      filled: true,
                      fillColor: Colors.white,
                      focusedBorder: OutlineInputBorder(
                        borderRadius: BorderRadius.all(Radius.circular(4)),
                        borderSide: BorderSide(
                          width: 1,
                          color: Color(0xffE5E5E5),
                        ),
                      ),
                      disabledBorder: OutlineInputBorder(
                        borderRadius: BorderRadius.all(Radius.circular(4)),
                        borderSide: BorderSide(
                          width: 1,
                          color: Color(0xffE5E5E5),
                        ),
                      ),
                      enabledBorder: OutlineInputBorder(
                        borderRadius: BorderRadius.all(Radius.circular(4)),
                        borderSide: BorderSide(
                          width: 1,
                          color: Color(0xffE5E5E5),
                        ),
                      ),
                      border: OutlineInputBorder(
                        borderRadius: BorderRadius.all(Radius.circular(4)),
                        borderSide: BorderSide(
                          width: 1,
                        ),
                      ),
                      errorBorder: OutlineInputBorder(
                          borderRadius: BorderRadius.all(Radius.circular(4)),
                          borderSide: BorderSide(
                            width: 1,
                            color: Colors.red,
                          )),
                      focusedErrorBorder: OutlineInputBorder(
                        borderRadius: BorderRadius.all(Radius.circular(4)),
                        borderSide: BorderSide(
                          width: 1,
                          color: Colors.red,
                        ),
                      ),
                      hintText: "Enter email address" ?? "",
                    ),
                  ),
                  SizedBox(
                    height: 15.0,
                  ),

                  /* Password */
                  TextFormField(
                    autovalidateMode: AutovalidateMode.onUserInteraction,
                    /* autovalidate is disabled */
                    controller: pswdController,
                    inputFormatters: [
                      FilteringTextInputFormatter.deny(RegExp(r"\s\s")),
                      FilteringTextInputFormatter.deny(RegExp(
                          r'(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])')),
                    ],
                    keyboardType: TextInputType.text,
                    maxLength: 160,
                    onChanged: (val) ,
                    obscureText: true,
                    maxLines: 1,
                    validator: (value) 
                      int res = validatePassword(value);
                      if (res == 1) 
                        return "Please enter password";
                       else if (res == 2) 
                        return "Please enter minimum 9 characters";
                       else 
                        return null;
                      
                    ,
                    focusNode: pswdFocus,
                    autofocus: false,
                    decoration: InputDecoration(
                      errorMaxLines: 3,
                      counterText: "",
                      filled: true,
                      fillColor: Colors.white,
                      focusedBorder: OutlineInputBorder(
                        borderRadius: BorderRadius.all(Radius.circular(4)),
                        borderSide: BorderSide(
                          width: 1,
                          color: Color(0xffE5E5E5),
                        ),
                      ),
                      disabledBorder: OutlineInputBorder(
                        borderRadius: BorderRadius.all(Radius.circular(4)),
                        borderSide: BorderSide(
                          width: 1,
                          color: Color(0xffE5E5E5),
                        ),
                      ),
                      enabledBorder: OutlineInputBorder(
                        borderRadius: BorderRadius.all(Radius.circular(4)),
                        borderSide: BorderSide(
                          width: 1,
                          color: Color(0xffE5E5E5),
                        ),
                      ),
                      border: OutlineInputBorder(
                        borderRadius: BorderRadius.all(Radius.circular(4)),
                        borderSide: BorderSide(
                          width: 1,
                        ),
                      ),
                      errorBorder: OutlineInputBorder(
                          borderRadius: BorderRadius.all(Radius.circular(4)),
                          borderSide: BorderSide(
                            width: 1,
                            color: Colors.red,
                          )),
                      focusedErrorBorder: OutlineInputBorder(
                        borderRadius: BorderRadius.all(Radius.circular(4)),
                        borderSide: BorderSide(
                          width: 1,
                          color: Colors.red,
                        ),
                      ),
                      hintText: "Enter password" ?? "",
                    ),
                  ),
                ],
              ),
            ),
            SizedBox(
              height: 15.0,
            ),
            OutlinedButton(
              onPressed: () 
                _validationKey.currentState.validate();
                if (emailController.text.isEmpty) 
                  emailFocus.requestFocus();
                 else if (pswdController.text.isEmpty ||
                    pswdController.text.length <= 8) 
                  pswdFocus.requestFocus();
                
              ,
              child: Text("Validate"),
            )
          ],
        ),
      ),
    );
  



解决方案 2

class HomeScreen extends StatelessWidget 
  HomeScreen(Key key) : super(key: key);

  
  final _validationKey = GlobalKey<FormState>();

  final TextEditingController emailAddressTextController =
      TextEditingController();
  bool isValidEmail = true;

  bool isEmail(String string) 
    // Null or empty string is invalid
    if (string == null || string.isEmpty) 
      return false;
    

    const pattern = r'^[\w-\.]+@([\w-]+\.)+[\w-]2,4$';
    final regExp = RegExp(pattern);

    if (!regExp.hasMatch(string)) 
      return false;
    
    return true;
  

  int validateEmailAddress(String emailAddress) 
    String patttern = r'^[\w-\.]+@([\w-]+\.)+[\w-]2,4$';
    RegExp regExp = new RegExp(patttern);
    if (emailAddress.isEmpty || emailAddress.length == 0) 
      return 1;
     else if ((regExp.hasMatch(patttern))) 
      return 2;
     else 
      return 0;
    
  


  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.lightBlue,
        automaticallyImplyLeading: true,
        leading: Icon(
          Icons.arrow_back,
        ),
        title: Text("Example"),
        centerTitle: true,
      ),
      body: Container(
        padding: EdgeInsets.all(15.0),
        child: Column(
          children: [
            Form(
              key: _validationKey,
              child: Column(
                children: [
                  TextFormField(
                    autovalidateMode: AutovalidateMode.always,
                    /* autovalidate is set to true */
                    controller: emailAddressTextController,
                    inputFormatters: [
                      FilteringTextInputFormatter.deny(RegExp(r"\s\s")),
                      FilteringTextInputFormatter.deny(RegExp(
                          r'(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])')),
                    ],
                    keyboardType: TextInputType.emailAddress,
                    maxLength: 160,
                    onChanged: (val) 
                      isValidEmail = isEmail(val);
                    ,
                    maxLines: 1,
                    validator: (value) 
                      if (!isValidEmail) 
                        return "Please enter valid email address";
                       else if (value.isEmpty) 
                        return "please enter email address";
                       else 
                        return null;
                      
                      // int res = validateEmailAddress(value);
                      // if (res == 1) 
                      //   return "Please enter email address";
                      //  else if (res == 2) 
                      //   return "Please enter valid email address";
                      //  else 
                      //   return null;
                      // 
                    ,
                    autofocus: false,
                    decoration: InputDecoration(
                      errorMaxLines: 3,
                      counterText: "",
                      filled: true,
                      fillColor: Colors.white,
                      focusedBorder: OutlineInputBorder(
                        borderRadius: BorderRadius.all(Radius.circular(4)),
                        borderSide: BorderSide(
                          width: 1,
                          color: Color(0xffE5E5E5),
                        ),
                      ),
                      disabledBorder: OutlineInputBorder(
                        borderRadius: BorderRadius.all(Radius.circular(4)),
                        borderSide: BorderSide(
                          width: 1,
                          color: Color(0xffE5E5E5),
                        ),
                      ),
                      enabledBorder: OutlineInputBorder(
                        borderRadius: BorderRadius.all(Radius.circular(4)),
                        borderSide: BorderSide(
                          width: 1,
                          color: Color(0xffE5E5E5),
                        ),
                      ),
                      border: OutlineInputBorder(
                        borderRadius: BorderRadius.all(Radius.circular(4)),
                        borderSide: BorderSide(
                          width: 1,
                        ),
                      ),
                      errorBorder: OutlineInputBorder(
                          borderRadius: BorderRadius.all(Radius.circular(4)),
                          borderSide: BorderSide(
                            width: 1,
                            color: Colors.red,
                          )),
                      focusedErrorBorder: OutlineInputBorder(
                        borderRadius: BorderRadius.all(Radius.circular(4)),
                        borderSide: BorderSide(
                          width: 1,
                          color: Colors.red,
                        ),
                      ),
                      hintText: "Email Address" ?? "",
                    ),
                  ),

                 
                ],
              ),
            ),
            SizedBox(
              height: 15.0,
            ),
          ],
        ),
      ),
    );
  



【讨论】:

【参考方案3】:

试试这个代码!

TextFormField(
 controller: _emailController,
 autovalidateMode: AutovalidateMode.onUserInteraction,
 validator: (value) 
            if (value.isEmpty) 
                return 'Enter your Email address';
             
            if (!RegExp(r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]1,3\.[0-9]1,3\.[0-9]1,3\.[0-9]1,3\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]2,))$').hasMatch(value)) 
                return 'Enter a Valid Email address';
              
               return null;
               ,)

然后点击注册按钮或注册按钮

if (formGlobalKey.currentState.validate()) 
   // take action what you want
  

【讨论】:

【参考方案4】:

我正在使用 form_field_validator

form_field_validator

import 'package:flutter/material.dart';
import 'package:form_field_validator/form_field_validator.dart';
void main() 
  runApp(MaterialApp(
    debugShowCheckedModeBanner: false,
    home: FormValidationExample(),
  ));


class FormValidationExample extends StatelessWidget with InputValidationMixin 
  final formGlobalKey = GlobalKey < FormState > ();

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(
        title: Text('Form validation example'),
      ),
      body:
      Padding(
        padding: const EdgeInsets.symmetric(horizontal: 24),
          child: Form(
            key: formGlobalKey,
            child: Column(
              children: [
            const SizedBox(height: 50),
                  TextFormField(
                    decoration: InputDecoration(
                      labelText: "Email"
                    ),
                    validator: (email) 
                      if (isEmailValid(email)) return null;
                      else
                        return 'Enter a valid email address';
                    ,
                  ),
                  const SizedBox(height: 24),
                    TextFormField(
                      decoration: InputDecoration(
                        labelText: "Password",
                      ),
                      maxLength: 6,
                      obscureText: true,
                      validator: (password) 
                        if (isPasswordValid(password)) return null;
                        else
                          return 'Enter a valid password';
                      ,
                    ),
                    const SizedBox(height: 50),
                      ElevatedButton(
                        onPressed: () 
                          if (formGlobalKey.currentState.validate()) 
                            formGlobalKey.currentState.save();
                            // use the email provided here
                          
                        ,
                        child: Text("Submit"))
          ],
            ),
          ),
      ));
  


mixin InputValidationMixin 
  bool isPasswordValid(String password) => password.length == 6;

  bool isEmailValid(String email) 
    Pattern pattern =
      r '^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]1,3\.[0-9]1,3\.[0-9]1,3\.[0-9]1,3\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]2,))$';
    RegExp regex = new RegExp(pattern);
    return regex.hasMatch(email);
  

【讨论】:

以上是关于如何使用 email_validator 验证电子邮件地址的主要内容,如果未能解决你的问题,请参考以下文章

email_validator 挤压 tefxformfield 颤动

使用 pip 安装 email_validator

如何使用剑道验证器验证多封电子邮件?

如何通过使用 NodeJS 发送验证码来验证用户电子邮件?

如何使用java验证电子邮件地址?

使用 SmtpClient 和 MailMessage 时如何禁止电子邮件验证