0

我正在用 Flutter 制作一个应用程序。现在我已将validator其用于验证电子邮件。但我希望如果有 google gmail 帐户或任何其他有效的电子邮件(实际上有用户),那么只有用户应该在应用程序中创建帐户。

例如 - 目前,如果我输入xyz@gmail.com,那么该帐户也会在我的应用程序上创建,尽管此电子邮件不作为 google 帐户存在。

所以我的问题是,应用程序有什么方法应该首先验证(如果电子邮件是 gmail、outlook 或任何其他的有效帐户但应该是有效的)然后帐户将创建,否则它应该给出错误Enter valid email???

我正在使用Firebase for Authentication.

我的代码如下LoginPage.dart

class _LoginPageState extends State<LoginPage> {
final _formKey = GlobalKey<FormState>();
String _email, _password, error = '';
bool _obscureText = true;
final Auth _auth = Auth();

_toggle(){
setState(() {
  _obscureText = !_obscureText;
});
}

_submit() async {
if(_formKey.currentState.validate()){
  _formKey.currentState.save();
  SharedPreferences prefs = await SharedPreferences.getInstance();
  prefs.setString('email', _email);
  dynamic result = await _auth.login(_email, _password);
  if(result == null){
    setState(() => error = 'There is no user record found. Please create account first!!!');
  } else {
    Navigator.pushNamed(context, HomePage.id);
  }
  print(_email);
  print(_password);
}
}

@override
Widget build(BuildContext context) {
return GestureDetector(
  onTap: (){
    FocusScopeNode currentFocus = FocusScope.of(context);

    if (!currentFocus.hasPrimaryFocus) {
      currentFocus.unfocus();
    }
  },
  child: Scaffold(
    body: Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: <Widget>[
          Text(
            'Login',
            style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
          ),
          Form(
              key: _formKey,
              child: Column(
                mainAxisSize: MainAxisSize.min,
                children: <Widget>[
                  Padding(
                    padding: const EdgeInsets.symmetric(
                        horizontal: 30.0, vertical: 10.0),
                    child: Padding(
                        padding: EdgeInsets.only(left: 5, right: 5, top: 5),
                      child: TextFormField(
                        decoration: InputDecoration(
                            labelText: 'Email',
                          border: InputBorder.none,
                          filled: true,
                          fillColor: Colors.white60,
                          focusedBorder: OutlineInputBorder(
                            borderSide: BorderSide(color: Colors.blue,width: 2.0),
                            borderRadius: BorderRadius.circular(10.0)
                          ),
                          /*enabledBorder: UnderlineInputBorder(
                              borderRadius: BorderRadius.circular(10.0)
                          )*/
                        ),
                        validator: (input) => !input.contains('@')
                            ? 'Please enter valid email'
                            : null,
                        onSaved: (input) => _email = input,
                      ),
                    ),
                  ),
                  Padding(
                    padding: const EdgeInsets.symmetric(
                        horizontal: 30.0, vertical: 10.0),
                    child: Stack(
                      alignment: const Alignment(0, 0),
                      children: <Widget>[
                        TextFormField(
                          decoration: InputDecoration(
                              labelText: 'Password',
                            border: InputBorder.none,
                            filled: true,
                            fillColor: Colors.white60,
                            focusedBorder: OutlineInputBorder(
                                borderSide: BorderSide(color: Colors.blue,width: 2.0),
                                borderRadius: BorderRadius.circular(10.0)
                            ),
                          ),
                          validator: (input) => input.length < 6
                              ? 'Must be at least 6 characters'
                              : null,
                          onSaved: (input) => _password = input,
                          obscureText: _obscureText,
                        ),
                        Positioned(
                          right: 15,
                          child: Container(
                            height: 30,
                            child: ElevatedButton(
                              onPressed: (){
                                _toggle();
                              },
                              child: Text(
                                  _obscureText ? 'Show' : 'Hide'
                              ),
                            ),
                          ),
                        ),
                      ],
                    ),
                  ),
                  verticalSpaceMedium,
                  Container(
                    width: 200.0,
                    child: TextButton(
                      onPressed: _submit,
                      style: TextButton.styleFrom(
                        primary: Colors.white,
                        backgroundColor: Colors.blue,
                        elevation: 5,
                      ),
                      child: Text(
                        'Login',
                        style: TextStyle(color: Colors.white, fontSize: 16.0),
                      ),
                    ),
                  ),
                  verticalSpaceMedium,
                  Container(
                    width: 200.0,
                    child: TextButton(
                      style: TextButton.styleFrom(
                        primary: Colors.white,
                        backgroundColor: Colors.blue,
                        elevation: 5,
                      ),
                      onPressed: () => Navigator.pushNamed(context, SignupPage.id),
                      child: Text(
                        'Create Account',
                      ),
                    ),
                  ),
                  verticalSpaceMedium,
                  Text(error, style: TextStyle(color: Colors.red, fontSize: 14),)
                ],
              ),
          )
        ],
      ),
    ),
  ),
);

上面的代码工作正常,但想添加我上面解释过的验证器。

4

1 回答 1

1

请参阅https://pub.dev/packages/email_validator。不要尝试编写正则表达式来验证电子邮件地址。它肯定会遗漏一些您可能还没有遇到过的完全有效的电子邮件表单。例如,fred&barney@stonehenge.com(我的自动回复)和*@qz.to(一个朋友使用多年但现在使用的地址*@unspecified.example.com)都是有效的。电子邮件验证器包正确接受这两者。

于 2021-03-29T17:11:52.703 回答