【问题标题】:Future returns list before being populated填充前的未来返回列表
【发布时间】:2021-01-24 09:51:16
【问题描述】:

我有以下方法:

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,我有多个作业键(每个都有其作业数据)。

【问题讨论】:

    标签: flutter asynchronous firebase-realtime-database async-await future


    【解决方案1】:

    试试这个:

    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回调..它告诉你出了什么问题;)

    【讨论】:

    • 确实有效!唯一需要更改的是 .orderByKey() 应该在 .once() 之前,否则会出现错误。干杯!
    • 当然.once() 是查询类型,所以它排在最后......没有注意到它不是在编辑您的代码时......很高兴我能提供帮助。正如我所说,如果你上网,事情会变得有点复杂,因为所有 firebase 服务的官方软件包都还不可用。如果你也需要帮助,请告诉我。干杯
    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 2020-07-21
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多