skip to Main Content

I created a view model for sign up and in there are my validators.

String? emailValidator(String? s) {
  if(s == null || s.isEmpty || s.isWhiteSpace()){
    return "Email is required";
  }

  if(!s.isValidEmail()){
    return "Invalid email address";
  }

  return null;
}

When I create an account I call createUserWithEmailAndPassword but when the user already exists this throws an exception.

onPressed: () {                  
  final isValid = formKey.currentState!.validate();

  assert(isValid == viewModel.isValid(),
    "The view model and form must agree on whether the form is valid");

  if(isValid && viewModel.isValid()){
    try{
      FirebaseAuth.instance.createUserWithEmailAndPassword(email: viewModel.email!, password: viewModel.password!);
    }catch{
      // what should I do here?
    }
  }
},

Now I want to catch it and update my validator so that i can display an error like "email address already in use". How can I do this?

2

Answers


  1. Create a bool

    bool emailExists = false;
    
    String? emailValidator(String? s) {
      if(s == null || s.isEmpty || s.isWhiteSpace()){
        return "Email is required";
      }
    
      if(!s.isValidEmail()){
        return "Invalid email address";
      }
      if(emailExists) return "Registered Email Exists";
      return null;
    }
    

    and on button press in catch you can update the bool and validate again

    onPressed: () {                  
      final isValid = formKey.currentState!.validate();
    
      assert(isValid == viewModel.isValid(),
        "The view model and form must agree on whether the form is valid");
    
      if(isValid && viewModel.isValid()){
        try{
          FirebaseAuth.instance.createUserWithEmailAndPassword(email: viewModel.email!, password: viewModel.password!);
        }catch{
          emailExists = true;
         formKey.currentState!.validate();
        }
      }
    },
    
    Login or Signup to reply.
  2. Since you to use try/catch, the syntax for handling exception is:

    try {
      await FirebaseAuth.instance.createUserWithEmailAndPassword(
        email: "[email protected]",
        password: "CorrectHorseBatteryStaple"
      );
    } on FirebaseAuthException catch (e) {
      print("Caught FirebaseAuthException");
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text(e.code+'nnn'+e.message!))
      );                            
    } catch (e) {
      print("Caught other error");
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text(e.toString()))
      );                            
    }
    

    You likely only need the first catch block which handles FirebaseAuthExceptions, and in there you can use e.code to determine the actual error code from Firebase. For the actual codes, see what are the error codes for Flutter Firebase Auth Exception?

    We did an episode of the Flutter Boring Show on this topic a while ago, so I recommend checking that out: Firebase Authentication in Flutter (The Boring Flutter Development Show, Ep. 55), also see the final code of what we created there.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search