【问题标题】:How to use email_validator to validate an email address如何使用 email_validator 验证电子邮件地址
【发布时间】: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;
                }
              },

【问题讨论】:

    标签: flutter email-validation


    【解决方案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);
            }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-11-03
            • 2019-09-17
            • 1970-01-01
            • 1970-01-01
            • 2014-06-12
            • 1970-01-01
            相关资源
            最近更新 更多