Я не могу поймать исключение аутентификации Firebase при flutter

#flutter #dart #firebase-authentication

#flutter #dart #firebase-аутентификация

Вопрос:

Я пытаюсь создать функцию входа в свое приложение, используя аутентификацию firebase на flutter.

Есть много исключений, с которыми мне приходится иметь дело, но я вообще не могу их поймать.

Вот мой код.

 Future<void> onSubmitted(
    String email, AnimationController controller, BuildContext context) async {
  controller.repeat();
  FirebaseAuth _auth = FirebaseAuth.instance;
  try {
    _auth.signInWithEmailAndPassword(email: email, password: "1");
  } on PlatformException catch (e) {
    debugPrint(e.toString());
  } on FirebaseAuthException catch (e) {
    debugPrint(e.toString());
  }
}
  

Это упрощенная форма для тестирования. В любом случае это даже не доходит до оператора catch. Он вызывает исключение PlatformException до того, как достигнет оператора catch. Я не понимаю.

Код ошибки выглядит следующим образом.

Необработанное исключение: [firebase_auth/user-not-found] Нет записи пользователя, соответствующей этому идентификатору. Возможно, пользователь был удален.

Я явно указал тип исключения, и предполагается, что оно выведет сообщение об ошибке, но оно даже не достигает debugPrint() функции.

Как я должен перехватить исключение?

Ответ №1:

Проблема заключалась в том, что «они действительно были пойманы».

В операторе catch или где-либо еще нет проблем, но поведение отладчика было проблемой. В Android Studio я могу настроить настройку так, чтобы она не останавливалась при возникновении исключения, но в VSCode, что бы я ни делал, она остановится, когда исключение возникает перед оператором catch.

Поэтому, если я хочу перейти к следующим строкам, мне просто нужно нажать продолжить на панели инструментов отладки.

Но я действительно надеюсь, что смогу также изменить настройку разрывов для исключений в VSCode.

Ответ №2:


Согласно официальной документации FlutterFire, вы должны сохранить `UserCredential`, полученный из объекта метода `signInWithEmailAndPassword ()` в переменной. Итак, ваш код должен выглядеть примерно так:

 try {
  UserCredential userCredential = await FirebaseAuth.instance.signInWithEmailAndPassword(
    email: email,
    password: "1"
  );
} on FirebaseAuthException catch (e) {
  if (e.code == 'user-not-found') {
    print('No user exists with this email.');
  } else if (e.code == 'wrong-password') {
    print('Incorrect Password.');
  }
}
  

Комментарии:

1. Это не имело никакого значения: ( Мой код по-прежнему не может перехватить исключение PlatformException …. это действительно странно, я думал, что любое исключение, вызванное в try операторе, будет перехвачено в следующем catch операторе…

2. Можете ли вы сказать мне, какую среду IDE вы используете?

3. Это VSCode, и я нашел причину, по которой я сам ответил.

Ответ №3:

Вы сделали все необходимое?

  1. Создайте приложения для ios / Android в консоли Firebase
  2. Включите различные методы входа (Google, электронная почта и т. Д.)
  3. Загрузите google-сервисы.json и GoogleService-info.plist и поместите их в соответствующие папки

Кроме того, _auth.signInWithEmailAndPassword(email: электронная почта, пароль: «1») является асинхронным процессом и требует времени для завершения.

Вам нужно иметь await

Комментарии:

1. Да, я уже закончил все настройки на консоли Firebase, и мне очень грустно, что добавление «await» ничего не изменило 🙁

Ответ №4:

Похоже, это проблема с тем, как генерируются и перехватываются ошибки при работе с async, FlutterFire еще не удосужился поместить их в try / catch, с чем мы ничего не можем поделать.

Здесь они обсуждают это: https://github.com/FirebaseExtended/flutterfire/issues/3475

Вот ожидающее исправления: https://github.com/FirebaseExtended/flutterfire/pull/3700

На данный момент ответ, по-видимому, заключается в том, чтобы либо пройти через исключения, либо снять флажок «Неперехваченные исключения» в отладчике (что не очень хорошо, поскольку он не будет перехватывать фактические исключения ..)