Future возвращает Future вместо переменной UserData

#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');
  }