填充前的未来 returns 列表

Future returns list before being populated

我有以下方法:

Future<List<Job>> getUserJobs() async {
    Query query = _firebaseDatabase
        .reference()
        .child("jobs")
        .child(_firebaseAuth.currentUser.uid)
        .orderByKey();

    List<Job> userJobs = [];
    if (query == null) {
      return userJobs;
    }

    query.onValue.listen((event) {
      Map<dynamic, dynamic> values = event.snapshot.value;
      values.forEach((key, value) {
        userJobs.add(Job.fromJson(key, Map.from(value)));
      });
    });
    return userJobs;
  }

我想在另一个 class 中获得此响应,但是,通过上述方法 return 编辑的列表始终是 []。我检查过,确实填充了 userJobs 列表,但之前执行了 return 语句。

数据库的结构是: 作业集合有用户 ID,对于每个用户 ID,我有几个作业键(每个都有它的作业数据)。

试试这个:

Future<List<Job>> getUserJobs() async {

  List<Job> userJobs = [];
//  Query query = 
  await _firebaseDatabase
      .reference()
      .child("jobs")
      .child(_firebaseAuth.currentUser.uid)
  .once()
      .orderByKey().then((result) async {
        if (result.value != null) {
          result.value.forEach((key, childSnapshot) {
            userJobs.add(Job.fromJson(key, Map.from(childSnapshot)));
          });
        } else {
        print(
            'getUserJobs() no jobs found');
        }
  }).catchError((e) {
      print(
          'getUserJobs() error: $e');
  });

  
//  if (query == null) {
//    return userJobs;
//  }

//  query.onValue.listen((event) {
//    Map<dynamic, dynamic> values = event.snapshot.value;
//    values.forEach((key, value) {
//      userJobs.add(Job.fromJson(key, Map.from(value)));
//    });
//  });
  return userJobs;
}

你的循环也需要是异步的..否则该方法将在循环完成之前return,return进入空列表..在那里并且对此感到非常沮丧.. 也总是使用 .catchError 回调..它告诉你出了什么问题;)