Flutter Firestore函数未返回计数器的合计值

时间:2019-03-06 05:26:54

标签: dart flutter google-cloud-firestore

我已经设置了一个点赞的分布式计数器,并希望在该分布式计数器中计算总点赞。

在我的“帖子”模型下,将计数器设置为“ count_shrads”的子集合,该子集合包括三个文档(1、2、3),每个文档都有一个“ count”字段。我想在flutter中创建一个函数,该函数返回给定文章的三个文档中每个文档的这些计数字段的总数。

Future getTotal(postID) async {
    int counter;
    Firestore.instance
        .collection('post').document(postID).collection('count_shrads')
        .snapshots()
        .listen((data) =>
        data.documents.forEach((doc) => counter += (doc["count"])));
    print("The total is $counter");
    return counter;
  }

当前返回null。有人知道我如何返回汇总值吗?


使用reduce函数:

Future getTotal(postID) async {
    int value;
    Firestore.instance
        .collection('post').document(postID).collection('count_shrads')
        .snapshots()
        .listen((data) =>
        data.documents.reduce((value, element) => value + doc["count"])
    );
    return value;
  }

在Firestore中添加数据模型的图片。enter image description here

1 个答案:

答案 0 :(得分:0)

如果要使用异步调用的结果,则需要等待结果变为可用

Future getTotal(postID) async {
    int counter;
    await Firestore.instance // <<<== changed
        .collection('post').document(postID).collection('count_shrads')
        .snapshots()
        .listen((data) =>
        data.documents.forEach((doc) => counter += (doc["count"])));
    print("The total is $counter");
    return counter;
  }
}

如果没有awaitreturn counter;将立即执行,而当Firebase服务器的响应到达时,counter += ...将在稍后执行。 await确保仅在异步调用返回的Future完成(执行完成或发生错误)之后执行以下代码