首页 > 解决方案 > 填充前的未来返回列表

问题描述

我有以下方法:

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;
  }

我想在另一个类中得到这个响应,但是,上述方法返回的列表总是[]。我检查并确实填充了 userJobs 列表,但之前执行了 return 语句。

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

标签: flutterasynchronousfirebase-realtime-databaseasync-awaitfuture

解决方案


尝试这个:

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;
}

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


推荐阅读