Вопрос или проблема
Я пытаюсь войти в систему через Firebase, используя вход через Google, и пробую зарегистрировать имя пользователя и аккаунт. В основном, при любой попытке аутентификации я получаю следующую ошибку:
Необработанное исключение: тип ‘List<Object?>’ не является подтипом типа ‘PigeonUserDetails?’ при приведении типов
Вот код для моего входа через Google и регистрации с использованием имени пользователя и пароля:
class LoginAccountBloc extends Bloc<LoginAccountEvent, LoginAccountState> {
LoginAccountBloc() : super(LoginAccountInitial()) {
on<LoginAccountSubmitted>(
(event, emit) async {
emit(LoginAccountSubmitting());
try {
await FirebaseAuth.instance.signInWithEmailAndPassword(
email: event.email,
password: event.password,
);
emit(LoginAccountSuccessful());
} on FirebaseAuthException catch (e) {
if (e.code == 'user-not-found') {
emit(LoginAccountFailure('Пользователь с таким email не найден.'));
} else if (e.code == 'wrong-password') {
emit(LoginAccountFailure('Неправильный пароль для данного пользователя.'));
} else {
emit(LoginAccountFailure(e.toString()));
}
}
},
);
}
}
class RegisterAccountBloc
extends Bloc<RegisterAccountEvent, RegisterAccountState> {
RegisterAccountBloc() : super(RegisterAccountInitial()) {
on<RegisterAccountSubmitted>(
(event, emit) async {
print(event.username);
print(event.email);
print(event.password);
emit(RegisterAccountSubmitting());
if (event.username.isEmpty ||
event.email.isEmpty ||
event.password.isEmpty) {
emit(RegisterAccountFailure("Все поля обязательны для заполнения."));
return;
}
print('Все поля заполнены');
try {
// Шаг 1: Создайте нового пользователя с помощью Firebase Authentication
final credential =
await FirebaseAuth.instance.createUserWithEmailAndPassword(
email: event.email,
password: event.password,
);
print('Учетные данные добавлены в FirebaseAuth');
} on FirebaseAuthException catch (e) {
if (e.code == 'weak-password') {
emit(RegisterAccountFailure('Предоставленный пароль слишком слабый.'));
} else if (e.code == 'email-already-in-use') {
emit(RegisterAccountFailure(
'Аккаунт с таким email уже существует.'));
} else {
emit(RegisterAccountFailure(e.toString()));
}
}
try {
CollectionReference users =
FirebaseFirestore.instance.collection('User');
print("Попытка добавить");
await users.add({
'username': event.username,
'email': event.email,
'password': event.password
});
print("Пользователь создан");
emit(RegisterAccountSuccess());
} catch (error) {
emit(RegisterAccountFailure(error.toString()));
}
},
);
}
}
Я пытался отлаживать несколько часов, но на данный момент никаких изменений. Ранее это работало до того, как Firebase начал показывать это сообщение на вкладке аутентификации.
==> Перенаправление для входа с другой доменной зоны больше не поддерживается во многих браузерах. Обновите ваше приложение, чтобы ваши пользователи могли продолжать входить в ваше приложение.
Ответ или решение
Проблема, с которой вы столкнулись, связана с типами данных, которые вы используете при работе с Firebase и вашей логикой аутентификации. Ошибка type 'List<Object?>' is not a subtype of type 'PigeonUserDetails?' in type cast
указывает на то, что в какой-то момент вы пытаетесь привести объект, который является список, к другому типу, в данном случае PigeonUserDetails
.
Возможные решения проблемы
-
Проверка возвращаемых данных: Убедитесь, что данные, которые вы пытаетесь получить с Firebase, действительно являются экземплярами
PigeonUserDetails
. Это часто происходит при неправильной работе с данными, полученными от Firestore или другими методами Firebase. Например, если вы ожидаете получить объект пользователя, но получаете список — это может привести к подобной ошибке. -
Использование асинхронного ожидающего оператора: При выполнении запросов к Firebase используйте оператор
await
и обрабатывайте результаты правильно. Убедитесь, что все запросы к Firestore или к любой другой части Firebase работают асинхронно. -
Проверка данных в Firestore: Убедитесь, что ваши данные в Firestore соответствуют ожидаемой модели. В вашем методе регистрации создается документ с полей пользователя, но проверьте, что нацеленные данные в коллекции не содержат массивов, если вы не ожидаете их.
-
Отладка и вывод логов: Иногда полезно разобрать всю цепочку получения данных, добавляя логи для каждого шага. Ваши
print
команды уже показывают, что регистрация проходит успешно, но также попытайтесь распечатать данные после их получения из Firestore и перед дальнейшей обработкой.
Пример проверки данных
Если у вас есть метод, который получает пользователя из Firestore, вы можете сделать что-то вроде этого:
DocumentSnapshot snapshot = await users.doc(userId).get();
if (snapshot.exists) {
Map<String, dynamic> data = snapshot.data() as Map<String, dynamic>;
// Проверьте, что поле, которое вы ожидаете, действительно существует и его тип соответствует ожиданиям
if (data.containsKey('username') && data['username'] is String) {
String username = data['username'];
// используйте username
} else {
// обработка ситуации, когда данные в Firestore некорректны
}
} else {
// Обработка, если документ не существует
}
Решение проблемы с кросс-доменной аутентификацией
Если вы столкнулись с сообщением: "Cross origin redirect sign-in is no longer supported in many browsers", вам нужно убедиться, что вы используете правильные настройки для обеспечения безопасной аутентификации. Убедитесь, что ваш проект Firebase корректно настроен для работы с доменами, с которых вы производите запросы.
- Соответствие доменам: В настройках Firebase (консоль Firebase) убедитесь, что все необходимые домены добавлены в раздел "Авторизация". Если ваше приложение работает локально, добавьте
http://localhost:xxxx
, гдеxxxx
— это порт вашего приложения.
Заключение
Соблюдение всех этих рекомендаций должно помочь вам определить и устранить проблему. Если ошибка продолжает возникать, попробуйте создать минимальный пример, воспроизводящий проблему, что может помочь лучше сосредоточиться на конкретных частях кода. Удачи в решении проблемы с аутентификацией!