等待表达式只能在异步函数中使用。

5

当用户登录时,我正在尝试从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);

“await”表达式只能在异步函数中使用。

我不确定这些函数如何变得更加异步。而且,如果我不添加“await”,则会告诉我将Future分配给bool是不可能的,这很合理,并提示我的函数实际上是异步的。

为什么我不能等待我的“loadUserData”函数的结果呢?

2个回答

6

你在该行的主要功能是传递给 onAuthStateChanged 的 listen。这个函数也应该像下面一样是异步的。

  _auth.onAuthStateChanged.listen((firebaseUser) async{

谢谢。现在看起来非常明显。 - August W Danowski

2
如果您调用的是异步函数,则您的调用函数也应该是异步的。请将async关键字添加到您的函数中。更改为:
void main (List<String> arguments)

to:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接