Выражение await можно использовать только в функции asyn c - PullRequest
1 голос
/ 10 февраля 2020

Я пытаюсь загрузить некоторые данные из Firestore, когда пользователь входит в систему, и мне нужно дождаться загрузки данных, прежде чем продолжить. Однако мои попытки дождаться результатов не работают.

Future<bool> userListener() async {
  _auth.onAuthStateChanged.listen((firebaseUser) {
    bool isDone = false; 

    if (firebaseUser != null) {
      isDone = await loadUserData(firebaseUser);   // This line is killing me!!
      return isDone;
    } else {
      return false;
    }
  }, onError: (error) {
    print('error in UserListener: $error');
  });
}

Future<bool> loadUserData(FirebaseUser user) async {
  Firestore database = Firestore();
  DocumentReference data = database.collection('userData').document(user.uid);

  try {
    DocumentSnapshot myQuery = await data.get();
    theNumber = myQuery.data['theNumber'];
    return true;
  } on PlatformException catch (e) {
    print(e);
    return false;
  }
}

Я получаю прекрасную ошибку из строки:

 isDone = await loadUserData(firebaseUser);

, что " выражение ожидания может быть только используется в asyn c function".

Я не уверен, как эти функции могут получить асин c. Кроме того, если я не добавлю await, то мне скажут, что Future не может быть назначен на bool, что имеет смысл, и предполагают, что моя функция на самом деле asyn c.

Почему я не могу дождаться результатов моей функции loadUserData?

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Если вы вызываете асинхронную функцию c, ваша вызывающая функция должна быть тоже асин c.

Добавьте ключевое слово asyn c в вашу функцию. Изменить:

void main (List<String> arguments)

на:

void main (List<String> arguments) async

Примеры:

Future<void> main (List<String> arguments) async {
  var done = await readFileByteByByte(); // perform long operation
}

Future<void> main(List<String> arguments) {
  readFileByteByByte().then((done) {
    print('done');
  });
  print('waiting...');
  print('do something else while waiting...');
}
0 голосов
/ 10 февраля 2020

ваша основная функция для этой строки - это функция, передаваемая для прослушивания onAuthStateChanged.this функция должна быть асин c тоже, как показано ниже

  _auth.onAuthStateChanged.listen((firebaseUser) async{
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...