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

Asynchronous 等待表达式只能在异步函数中使用,asynchronous,flutter,dart,google-cloud-firestore,Asynchronous,Flutter,Dart,Google Cloud Firestore,当用户登录时,我试图从Firestore加载一些数据,需要等待数据加载后才能继续。然而,我等待结果的努力没有奏效 Future<bool> userListener() async { _auth.onAuthStateChanged.listen((firebaseUser) { bool isDone = false; if (firebaseUser != null) { isDone = await loadUserData(firebas

当用户登录时,我试图从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;
  }
}
等待表达式只能在异步函数中使用”

我不确定这些函数如何能变得更异步。此外,如果我不添加
await
,那么我被告知未来不能分配给bool,这非常合理,并向我建议我的函数实际上是异步的


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

该行的主要函数是传递给侦听onAuthStateChanged的函数。该函数也应该是异步的,如下所示

  _auth.onAuthStateChanged.listen((firebaseUser) async{

如果您正在调用一个异步函数,那么您的调用函数也应该是异步的

将async关键字添加到函数中。更改:

void main (List<String> arguments)
void main(列出参数)
致:

void主(列表参数)异步
示例:

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...');
}
Future主(列表参数)异步{
var done=wait readfilebytebybyyte();//执行长操作
}
未来主参数(列表参数){
ReadFileByteByByByByte()。然后((完成){
打印(“完成”);
});
打印('等待…');
打印('等待时做其他事情…');
}

谢谢。现在这似乎是显而易见的。
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...');
}