Solución:
Acabo de codificarme una forma de hacer esto sin el código dependiente de la plataforma:
Esto es posible ya que .signInWithEmailAndPassword arroja correctamente Errores con códigos definidos, que podemos tomar para identificar el error y manejar las cosas de la forma en que deberían manejarse.
El siguiente ejemplo crea un nuevo Future.error, si ocurre algún error, y luego se configura un Bloc para transferir esos datos al Widget.
Future<String> signIn(String email, String password) async {
FirebaseUser user;
String errorMessage;
try {
AuthResult result = await _firebaseAuth.signInWithEmailAndPassword(email: email, password: password);
user = result.user;
} catch (error) {
switch (error.code) {
case "ERROR_INVALID_EMAIL":
errorMessage = "Your email address appears to be malformed.";
break;
case "ERROR_WRONG_PASSWORD":
errorMessage = "Your password is wrong.";
break;
case "ERROR_USER_NOT_FOUND":
errorMessage = "User with this email doesn't exist.";
break;
case "ERROR_USER_DISABLED":
errorMessage = "User with this email has been disabled.";
break;
case "ERROR_TOO_MANY_REQUESTS":
errorMessage = "Too many requests. Try again later.";
break;
case "ERROR_OPERATION_NOT_ALLOWED":
errorMessage = "Signing in with Email and Password is not enabled.";
break;
default:
errorMessage = "An undefined Error happened.";
}
}
if (errorMessage != null) {
return Future.error(errorMessage);
}
return user.uid;
}
NUEVA RESPUESTA (18/09/2020)
Si esta usando firebase_auth: ^0.18.0
, los códigos de error han cambiado.
Por ejemplo: ERROR_USER_NOT_FOUND
es ahora user-not-found
No pude encontrar ninguna documentación sobre eso, así que entré en el código fuente y leí los comentarios de cada código de error. (firebase_auth.dart)
No utilizo todos los códigos de error en mi aplicación (por ejemplo, verificación, restablecimiento de contraseña …) pero encontrará los más comunes en este fragmento de código:
(Maneja códigos de error antiguos y nuevos)
String getMessageFromErrorCode() {
switch (this.errorCode) {
case "ERROR_EMAIL_ALREADY_IN_USE":
case "account-exists-with-different-credential":
case "email-already-in-use":
return "Email already used. Go to login page.";
break;
case "ERROR_WRONG_PASSWORD":
case "wrong-password":
return "Wrong email/password combination.";
break;
case "ERROR_USER_NOT_FOUND":
case "user-not-found":
return "No user found with this email.";
break;
case "ERROR_USER_DISABLED":
case "user-disabled":
return "User disabled.";
break;
case "ERROR_TOO_MANY_REQUESTS":
case "operation-not-allowed":
return "Too many requests to log into this account.";
break;
case "ERROR_OPERATION_NOT_ALLOWED":
case "operation-not-allowed":
return "Server error, please try again later.";
break;
case "ERROR_INVALID_EMAIL":
case "invalid-email":
return "Email address is invalid.";
break;
default:
return "Login failed. Please try again.";
break;
}
}
(21/02/20) EDITAR: Esta respuesta es antigua y las otras respuestas contienen soluciones multiplataforma, por lo que debe mirar las suyas primero y tratarlas como una solución alternativa.
El complemento de autenticación de firebase todavía no tiene un sistema de código de error multiplataforma adecuado, por lo que debe manejar los errores para Android e iOS de forma independiente.
Actualmente estoy usando la solución temporal de este problema de github: # 20223
Tenga en cuenta que es un temperatura arreglar, no espere que sea completamente confiable como solución permanente.
enum authProblems { UserNotFound, PasswordNotValid, NetworkError }
try {
FirebaseUser user = await FirebaseAuth.instance.signInWithEmailAndPassword(
email: email,
password: password,
);
} catch (e) {
authProblems errorType;
if (Platform.isAndroid) {
switch (e.message) {
case 'There is no user record corresponding to this identifier. The user may have been deleted.':
errorType = authProblems.UserNotFound;
break;
case 'The password is invalid or the user does not have a password.':
errorType = authProblems.PasswordNotValid;
break;
case 'A network error (such as timeout, interrupted connection or unreachable host) has occurred.':
errorType = authProblems.NetworkError;
break;
// ...
default:
print('Case ${e.message} is not yet implemented');
}
} else if (Platform.isIOS) {
switch (e.code) {
case 'Error 17011':
errorType = authProblems.UserNotFound;
break;
case 'Error 17009':
errorType = authProblems.PasswordNotValid;
break;
case 'Error 17020':
errorType = authProblems.NetworkError;
break;
// ...
default:
print('Case ${e.message} is not yet implemented');
}
}
print('The error is $errorType');
}