简体   繁体   English

如果电子邮件和密码在 Firebase Flutter 中无效,如何显示错误消息?

[英]how to display an error message if email and password is not valid in firebase flutter?

i have developed an login page,if the email and password matches from the database it successfully login's and moves to the new page,but if its wrong i want to display an error message email or password doesn't match.我已经开发了一个登录页面,如果数据库中的电子邮件和密码匹配它成功登录并移动到新页面,但如果它错误我想显示错误消息电子邮件或密码不匹配。

Here's my code:这是我的代码:

class _AdminLoginState extends State<AdminLogin> {
  String _username, _password;
  TextEditingController _email = TextEditingController();


  final GlobalKey<FormState> _formkey = GlobalKey<FormState>();
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('LOGIN'),
        backgroundColor: Colors.indigo[900],


      ),
      body: SingleChildScrollView(
        child: Column(
          children: <Widget>[
            Container(
              padding: const EdgeInsets.only(top: 50),
              child: SizedBox(
                height: 150.0,
                width: 300,
                child: Image.asset("assets/admin.png",
                  fit: BoxFit.contain,),


              ),
            ),
            Container(

              child: Text("ADMIN",style: TextStyle(fontSize: 15,fontWeight: FontWeight.bold,color: Colors.indigo),),

            ),
            Container(
              padding: const EdgeInsets.only(bottom: 50),
              child: Column(
                children: <Widget>[
                  SingleChildScrollView(

                    child: Form(
                      key: _formkey,
                      child: Column(
                        children: <Widget>[
                          SizedBox(
                            height: 60,
                          ),

                          SizedBox(
                            width: 380,
                            height: 70,
                            child: Container(
                              padding: EdgeInsets.all(4),
                              width: 500,
                              height: 60,
                              child: TextFormField(
                                autofocus: false,
                                obscureText: false,
                                keyboardType: TextInputType.emailAddress,
                                validator:(input){
                                  if(input.isEmpty){
                                    return 'please type username';
                                  }
                                  return null;
                                },
                                onSaved: (input) => _username =input ,
                                decoration: InputDecoration(
                                    labelText: 'Email',
                                    hintText: "Email",
                                    labelStyle: TextStyle(
                                      color: Colors.black,
                                      fontSize: 16,
                                    ),
                                  border: new OutlineInputBorder(
                                    borderRadius: const BorderRadius.all(

                                      const Radius.circular(20.0),
                                    ),
                                  ),
                                ),


                              ),
                            ),
                          ),

                          SizedBox(
                            width: 380,
                            height: 70,
                            child: Container(
                              padding: EdgeInsets.all(4),
                              width: 400,
                              height: 60,
                              child: TextFormField(
                                autofocus: false,
                                obscureText: true,
                                validator:(input){
                                  if(input.isEmpty){
                                    return 'please type Password';
                                  }
                                  return null;
                                },
                                onSaved: (input) => _password =input ,
                                decoration: InputDecoration(
                                    labelText: 'Password',
                                    hintText: "Password",
                                    labelStyle: TextStyle(
                                      color: Colors.black,
                                      fontSize: 16,
                                    ),
                                  border: new OutlineInputBorder(
                                    borderRadius: const BorderRadius.all(
                                      const Radius.circular(20.0),
                                    ),
                                  ),
                                ),


                              ),
                            ),
                          ),
                          Container(
                            padding: EdgeInsets.all(4),
                            width: 500,
                            height: 60,
                            child: RaisedButton(
                              onPressed: login,
                              textColor: Colors.white,
                              color: Colors.indigo[900],
                              child: Text('Login'),
                            ),
                          )


                        ],
                      ),
                    ),
                  ),


                ],


              ),
            ),

          ],

        ),
      ),
      );

  }
  Future<void> login() async{
    final  formState = _formkey.currentState;
    if(formState.validate()){
      formState.save();
      try{

        final FirebaseUser user = (await FirebaseAuth.instance.signInWithEmailAndPassword(email: _username, password: _password)).user;
        Navigator.push(context, MaterialPageRoute(builder: (context) => Admin()));
      }catch(e){
        print(e.message);
      }


    }
  }
}

it will be really helpful if someone also helps me in validating the right email format and give give the proper validation for password如果有人也帮助我验证正确的电子邮件格式并提供正确的密码验证,那将非常有帮助

signInWithEmailAndPassword() returns an exception with a special code if the attempt is unsuccessful.如果尝试不成功,signInWithEmailAndPassword() 将返回带有特殊代码的异常。

In order to print a message you need to add a catch block to your signInWithEmailAndPassword() method.为了打印一条消息,您需要在您的 signInWithEmailAndPassword() 方法中添加一个 catch 块。 Then you can use the error message.然后您可以使用错误消息。

Example:例子:

firebase.auth().signInWithEmailAndPassword(email, password)
    .catch(function(error) {
  // Handle Errors here.
  var errorCode = error.code;
  var errorMessage = error.message;
  if (errorCode === 'auth/wrong-password') {
    alert('Wrong password.');
  } else {
    alert(errorMessage);
  }
  console.log(error);
});

For security purposes I would suggest combining some of the messages together instead of giving a possible attacker a hint about if the email is already in the system or not.出于安全目的,我建议将一些消息组合在一起,而不是向可能的攻击者提示电子邮件是否已经在系统中。

I do not know how to use flutter so I can only give an idea;我不知道如何使用颤振,所以我只能提供一个想法;

In here you are directly trying to get the user from the method.在这里,您直接尝试从该方法中获取用户。

final FirebaseUser user = (await FirebaseAuth.instance.signInWithEmailAndPassword(email: _username, password: _password)).user;

Instead I would suggest using something like this (this is angular but I think you can easily apply to flutter with some modification)相反,我建议使用这样的东西(这是有角度的,但我认为您可以通过一些修改轻松地应用于颤振)

final FirebaseUser user;

 await firebase.auth().signInWithEmailAndPassword(email, password)
      .then((data) => {
          this.user = data.user;
      })
      .catch((error) => {
        switch (error.code) {
          case "auth/invalid-email":
          case "auth/wrong-password":
          case "auth/user-not-found":
            {
              this.accountErrorMessage = "Wrong email address or password.";
              break;
            }
          case "auth/user-disabled":
          case "user-disabled":
            {
              this.accountErrorMessage = "This account is disabled";
              break;
            }
        }

You can find which kind of errors it may return from here: https://firebase.google.com/docs/reference/js/firebase.auth.Auth.html#signinwithemailandpassword您可以从这里找到它可能返回的错误类型: https ://firebase.google.com/docs/reference/js/firebase.auth.Auth.html#signinwithemailandpassword

Use errortext in InputDecorationInputDecoration中使用errortext

here is demo这是演示

@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[

            TextField(
              controller: _text,
              decoration: InputDecoration(
                labelText: 'email',
                errorText: loginfail ? 'email not match' : null,
              ),
            ),
            TextField(
              controller: _text,
              decoration: InputDecoration(
                labelText: 'password',
                errorText: loginfail ? 'password not match' : null,
              ),
            ),
            RaisedButton(
              onPressed: () {
                login();
              },
              child: Text('Submit'),
              textColor: Colors.white,
              color: Colors.blueAccent,
            )
          ],
        ),
      ),
    );
  }

Future<void> login() async{
    final  formState = _formkey.currentState;
    if(formState.validate()){
      formState.save();
      try{

        final FirebaseUser user = (await FirebaseAuth.instance.signInWithEmailAndPassword(email: _username, password: _password)).user;
        if(!user.uid.isEmpty()){
         Navigator.push(context, MaterialPageRoute(builder: (context) => Admin()));
        }else{
         setState((){
           loginfail = true; //loginfail is bool
          });
        }

      }catch(e){
        print(e.message);
      }
    }

hope it helps..希望能帮助到你..

Following @Jaydeepchatrola answer's关注@Jaydeepchatrola 的回答

I used a try catch block and checked if password was invalid or email, for better results!我使用了 try catch 块并检查密码是否无效或电子邮件,以获得更好的结果!

               try {
                    setState(() {
                      wrongEmail = false;
                      wrongPassword = false;
                    });
                    final newUser = await _auth.signInWithEmailAndPassword(
                        email: email, password: password);
                    if (newUser != null) {
                      Navigator.pushNamed(context, Done.id);
                    }
                  } catch (e) {
                    print(e.code);
                    if (e.code == 'ERROR_WRONG_PASSWORD') {
                      setState(() {
                        wrongPassword = true;
                      });
                    } else {
                      setState(() {
                        emailText = 'User doesn\'t exist';
                        passwordText = 'Please check your email';

                        wrongPassword = true;
                        wrongEmail = true;
                      });
                    }
                  }

You need to catch the specific error.您需要捕获特定的错误。 I had the problem by myself, with this code I solved the problem.我自己遇到了问题,用这段代码我解决了这个问题。

try {
        final user = await _auth.signInWithEmailAndPassword(
            email: email, password: password);
        if (user != null) {
          Navigator.pushNamed(context, HomeScreen.id);
        }
      } on auth.FirebaseAuthException catch (e) {
     //Here you catch the specific error 
        if (e.code == 'wrong-password') {
    //The thing that should happen if the password is incorrect
   //In my case it will the change the hinttext  
          setState(() {
            hintTextPassword = 'Password incorrect. Please try again';
            passwordHintColor = Colors.red;
          });
        } else if (e.code == 'user-not-found') {
          setState(() {
            hintTextEmail = 'No user found for that email.';
            emailHintColor = Colors.red;
          });
        }
      } catch (e) {
        print(e);
      }
  1. add rflutter_alert: ^2.0.4 in your project file pubspec.yaml under dependencies: and save it在你的项目文件 pubspec.yaml 中添加 rflutter_alert: ^2.0.4 并保存

  2. add import 'package:rflutter_alert/rflutter_alert.dart';添加import 'package:rflutter_alert/rflutter_alert.dart'; in your file of your auth screen在您的身份验证屏幕文件中

  3. add添加

    Alert( context: context, title: "Failed Login", desc: "Incorrect Email Or Password.") .show();警报(上下文:上下文,标题:“登录失败”,说明:“电子邮件或密码不正确。”).show();

in catch(e){}在捕获(e)中{}

like that:像那样:

Future<void> login() async{
    final  formState = _formkey.currentState;
    if(formState.validate()){
      formState.save();
      try{

        final FirebaseUser user = (await FirebaseAuth.instance.signInWithEmailAndPassword(email: _username, password: _password)).user;
        Navigator.push(context, MaterialPageRoute(builder: (context) => Admin()));
      }catch(e){
        Alert(
                                context: context,
                                title: "Failed Login",
                                desc: "Incorrect Email Or Password.")
                            .show();
      }


    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何验证 email 和密码 flutter firebase - how to verify email and password flutter firebase 如果 flutter 登录表单中的密码或用户 email 错误,则返回错误消息 - Return error message if password or user email wrong in flutter login form 颤振/火力,如何在不输入密码的情况下验证 email? - flutter/firebase, how can I verify the email without entering a password? 如何处理Firebase密码重置email错误Flutter - How to handle Firebase password reset email errors Flutter Flutter Firebase Auth:如何在Flutter抽屉中显示用户电子邮件和名称 - Flutter Firebase Auth: How to display the user email and name in the Flutter Drawer Flutter:如何获取 Firebase Auth Credentials 以更新 email 和密码 - Flutter: How to get Firebase Auth Credentials to update email and password Firebase 尝试登录时显示无效电子邮件/错误的消息 - Firebase Message to display invalid email/error when trying to sign in 如何在Firebase中设置电子邮件注册(无密码)和显示名称? - How to set up registration with email (no password) and display name in firebase? 在控制台中显示错误消息而不是抛出异常(Flutter Firebase) - Display error message instead of throw exception in console (Flutter Firebase) 无法在颤振中将 firebase 身份验证异常错误显示为吐司消息 - Not able to display firebase auth exception error as toast message in flutter
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM