Flutter: Błąd: „await” można używać tylko w metodach „async” lub „async *”. nawet myślałem, że metoda jest asynchroniczna

Nov 20 2020

Mam taką metodę:

Future<AppUser> _getUser(String documentId) async {
    var document = await firestore.collection('customers').doc(documentId);
    document.get().then((DocumentSnapshot documentSnapshot) {
          print(documentSnapshot.data());
    });
    AppUser bruceUser = AppUser(userId: 'user006',);

    return bruceUser;   
}

A poniżej mam zmienną używającą tej metody:

AppUser _user = await _getUser(document.id);

Jednak zwraca to następujący błąd:

Error: 'await' can only be used in 'async' or 'async*' methods.

Co ja tu robię źle? Nie chcę zmieniać _user na Future, ponieważ to jeszcze bardziej skomplikuje kod, więc dlaczego czekanie nie działa?

Odpowiedzi

1 JustCode Nov 20 2020 at 00:57

_getUser()jest funkcją asnyc, ale nie funkcją wywołującą. Otrzymany błąd informuje, że awaitzostał użyty w funkcji innej niż asynchroniczna. Jeśli masz trudności z konwersją funkcji wywołującej na asynchroniczną, spróbuj wykonać thennastępujące czynności.

snapshot.data.docs.map((DocumentSnapshot document) {
    _getUser(document.id).then((user) {
          //code here
    });
}

Podsumowując, istnieją dwa rozwiązania tego problemu

  1. Przekonwertuj funkcję dzwoniącego na async.
  2. Posługiwać się _getUser().then((user){});