首页 > 解决方案 > 如何在使用 Firebase 和 Flutter 登录和注册时发现身份验证错误?

问题描述

我对 Flutter 很陌生,这是我第一个使用 Firebase 等后端的项目。因此,我预先构建了一个 ui 并开始将 firebase 集成到其中,它已成功完成并且工作正常,但是当我在登录注册时尝试打印错误时,我没有这样做,我能够赶上我的控制台中出现错误,但我等待使用该错误文本更新我的用户。每当我尝试登录时,虽然我提供了错误的密码,但它会将我带到我不想要的主页

这是我的登录页面,带有预构建 ui 和登录的工作设置

import 'package:flutter/material.dart';
import 'package:notepad/Authentigation%20Screens/signUp.dart';
import 'package:notepad/animation/bouncypagetrans.dart';
import 'package:notepad/animation/fadeanimation.dart';
import 'package:notepad/auth/authMethod.dart';
import 'package:notepad/screens/homepage.dart';
import 'package:notepad/widgets/VxTextsHeaders.dart';
import 'package:notepad/widgets/customRaisedButton.dart';
import 'package:notepad/widgets/loading.dart';
import 'package:notepad/widgets/textformField.dart';
import 'ForgotPassword.dart';

class LogIn extends StatefulWidget {
  @override
  _LogInState createState() => _LogInState();
}

class _LogInState extends State<LogIn> {
  String error;
  AuthMethods authMethods = new AuthMethods();
  bool isLoading = false;
  final formKey = GlobalKey<FormState>();
  TextEditingController emailTextEditingController =
      new TextEditingController();
  TextEditingController passwordTextEditingController =
      new TextEditingController();

  logMein()  {
    if (formKey.currentState.validate()) {
      try {
        setState(() {
          isLoading = true;
        });

        authMethods
            .signInWithEmailAndPassword(emailTextEditingController.text,
                passwordTextEditingController.text)
            .then((val) {
          // print("${val.uId}");
          Navigator.pushReplacement(
            context,
            BouncyPageRout(
              widget: HomePage(),
            ),
          );
        });
      } catch (e) {
        setState(() {
          error = e.message;
        });
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      resizeToAvoidBottomPadding: true,
      body: isLoading
          ? Loading()
          : SafeArea(
              child: Container(
                width: double.infinity,
                padding: EdgeInsets.fromLTRB(30.0, 100.0, 30.0, 20.0),
                height: MediaQuery.of(context).size.height,
                child: SingleChildScrollView(
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      Column(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: [
                          FadeAnimation(
                            1.0,
                            headerTitle("Hello,"),
                          ),
                          FadeAnimation(
                            2.0,
                            headerSubTitle("Log in to continue"),
                          ),
                        ],
                      ),
                      SizedBox(height: 65),
                      Column(
                        children: [
                          Form(
                              key: formKey,
                              child: Column(children: [
                                SizedBox(height: 20),
                                
                                FadeAnimation(
                                  3.0,
                                  buildTextField(
                                      validator: (val) {
                                        return val.isEmpty ||
                                                RegExp(r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+")
                                                    .hasMatch(val)
                                            ? null
                                            : "Please provide a valid Email";
                                      },
                                      labelText: "Email",
                                      controller: emailTextEditingController),
                                ),
                                SizedBox(height: 20),
                                FadeAnimation(
                                  3.5,
                                  buildTextField(
                                      validator: (val) {
                                        return val.isEmpty || val.length < 6
                                            ? "Please Provide a Strong Password,/n Provide somthing greater than 6  "
                                            : null;
                                      },
                                      labelText: "Password",
                                      obscureText: true,
                                      controller:
                                          passwordTextEditingController),
                                ),
                              ])),
                          SizedBox(height: 10.0),
                          Container(
                            alignment: Alignment.centerRight,
                            child: FadeAnimation(
                              4.0,
                              InkWell(
                                onTap: () {
                                  Navigator.push(
                                    context,
                                    BouncyPageRout(
                                      widget: ForgotPassword(),
                                    ),
                                  );
                                },
                                child: Text(
                                  'Forgot Password?',
                                  style: TextStyle(
                                      fontWeight: FontWeight.bold,
                                      color: Colors.deepOrange,
                                      fontSize: 14),
                                ),
                              ),
                            ),
                          ),
                          SizedBox(height: 40),
                          FadeAnimation(
                            4.5,
                            raisedButton(
                              context: context,
                              onPressed: () {
                                logMein();
                              },
                              color: Colors.deepOrange,
                              title: "Log In",
                              textColor: Colors.white,
                            ),
                          ),
                          SizedBox(
                            height: 20.0,
                          ),
                          FadeAnimation(
                            5.0,
                            raisedButton(
                                context: context,
                                onPressed: () {
                                  Navigator.push(
                                    context,
                                    BouncyPageRout(
                                      widget: SignUp(),
                                    ),
                                  );
                                },
                                color: Colors.white,
                                title: "SignUp"),
                          ),
                        ],
                      )
                    ],
                  ),
                ),
              ),
            ),
    );
  }


}

AuthMethods 页面包含 firebase 的所有代码

import 'package:notepad/auth/user.dart';

class AuthMethods {
  String error;
  final FirebaseAuth _auth = FirebaseAuth.instance;

  User _userFromFirebaseUser(FirebaseUser user) {
    return user != null ? User(userId: user.uid) : null;
  }

  Future signInWithEmailAndPassword(String email, String password) async {
    try {
      AuthResult result = await _auth.signInWithEmailAndPassword(
          email: email, password: password);
      FirebaseUser firebaseUser = result.user;
      return _userFromFirebaseUser(firebaseUser);
    } catch (e) {
      print(e.toString());
    }
  }

  Future signUpwithEmailAndPassword(String email, String password) async {
    try {
      AuthResult result = await _auth.createUserWithEmailAndPassword(
          email: email, password: password);
      FirebaseUser firebaseUser = result.user;
      return _userFromFirebaseUser(firebaseUser);
    } catch (e) {
      print(e.toString());
    }
  }

  Future resetPass(String email) async {
    try {
      return await _auth.sendPasswordResetEmail(email: email);
    } catch (e) {
      print(e.toString());
    }
  }

  Future signOut() async {
    try {
      return await _auth.signOut();
    } catch (e) {
      print(e.toString());
    }
  }
}

所以基本上我想通知我的用户一个有效的错误消息,直到他们解决他们不应该导航到特定屏幕

标签: firebaseflutterfirebase-authentication

解决方案


您可以使用snackbar小部件并在 throw 函数中调用它们!点击此链接了解更多关于小吃店的信息 https://flutter.dev/docs/cookbook/design/snackbars


推荐阅读