#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:
Вы сделали все необходимое?
- Создайте приложения для ios / Android в консоли Firebase
- Включите различные методы входа (Google, электронная почта и т. Д.)
- Загрузите 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
На данный момент ответ, по-видимому, заключается в том, чтобы либо пройти через исключения, либо снять флажок «Неперехваченные исключения» в отладчике (что не очень хорошо, поскольку он не будет перехватывать фактические исключения ..)