#firebase #flutter #asynchronous #firebase-authentication #future
#firebase #флаттер #асинхронный #firebase-аутентификация #будущее
Вопрос:
У меня есть виджет, который использует Future — async, который возвращает переменную UserData, но по какой-то причине я получаю переменную Future .
строка кода из сборки виджета:
dynamic user = Auth.signIn(_email, _password);
Класс аутентификации:
Future<UserData> signIn(String email, String password) async {
try{
UserCredential userCredential = await _auth.signInWithEmailAndPassword(
email: email,
password: password
);
print('signed in!');
return _createUserFromFirebase(userCredential.user.uid, null);
} on FirebaseAuthException catch (e) {
if (e.code == 'user-not-found') {
print('No user found for that email.');
} else if (e.code == 'wrong-password') {
print('Wrong password provided for that user.');
}
return null;
}
}
Ответ №1:
Вы могли бы попробовать что-то вроде
return Future.value(_createUserFromFirebase(userCredential.user.uid, null);
вместо
return _createUserFromFirebase(userCredential.user.uid, null);
Ответ №2:
Async нельзя использовать, если он не находится в функции с await . Вы не можете случайным образом извлекать асинхронную переменную случайным образом в скрипте, не загружая ее асинхронно, потому что в будущем могут не быть данные, готовые к использованию.
Если вам нужно, чтобы значение future переменной future было в виджете, попробуйте использовать виджет FutureBuilder. Это сделает так, что пользовательские данные будут загружаться асинхронно, и до их загрузки может быть показан выбранный вами заполнитель. Это позволит вам использовать тип UserData в вашем виджете.
Или вы можете получить пользователя, если у кнопки есть асинхронная переменная, которая устанавливает переменную в виджете из null в UserData после входа в систему.
Комментарии:
1. Проблема в том, что мне нужно предоставить методу future адрес электронной почты и пароль, и я получаю их внутри того же виджета (текст поля)
2. Если вам нужно будущее для текстового виджета поля, попробуйте обернуть текстовый виджет поля в конструктор будущего.
Ответ №3:
Я добавил новый метод future внутри класса widget, который сохраняет пользователя в переменной:
Future<void> getUserData(String email, String password) async{
_user = await _auth.signIn(email, password);
print('user: $_user');
}