Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
flatter.io(Dart)-如何计算满足特定条件的Firebase查询返回的项目_Firebase_Dart_Flutter - Fatal编程技术网

flatter.io(Dart)-如何计算满足特定条件的Firebase查询返回的项目

flatter.io(Dart)-如何计算满足特定条件的Firebase查询返回的项目,firebase,dart,flutter,Firebase,Dart,Flutter,在屏幕中,Firebase列表的逻辑应用于 反应式检测小部件的蓝色 隐藏蓝色小部件 显示非蓝色小部件 我想数一数蓝色的小部件 最好的方法是什么 return new StreamBuilder<int>( stream: subscribeMyThings(thing.id), builder: (context, thingsSnapshot) { return new FirebaseAnimatedList( query: g

在屏幕中,Firebase列表的逻辑应用于

  • 反应式检测小部件的蓝色
  • 隐藏蓝色小部件
  • 显示非蓝色小部件
  • 我想数一数蓝色的小部件

    最好的方法是什么

    return new StreamBuilder<int>(
        stream: subscribeMyThings(thing.id),
        builder: (context, thingsSnapshot) {
            return new FirebaseAnimatedList(
              query: getThings(thing.id),
              itemBuilder: (context, snapshot, animation, index) {
                return new ReactiveWidget<int>(
                  reactiveRef: getThingBlueness(snapshot.key),
                  widgetBuilder: (checkBlueness) {
                    // code to check blueness here
    
                    // if Thing is blue, place empty container
                    if (thingIsBlue) {
                      return new Container();
                      // *** how do I count these??? ***
                    }
    
                    // or, if Thing is NOT blue
                    return new Thing(thing.id);
                    );
                  },
                );
            );
          }
    
    返回新的StreamBuilder(
    stream:subscribeMyThings(thing.id),
    构建者:(上下文、内容快照){
    返回新的FirebaseAnimatedList(
    查询:getThings(thing.id),
    itemBuilder:(上下文、快照、动画、索引){
    返回新的ReactiveWidget(
    reactiveRef:getThingBlueness(snapshot.key),
    widgetBuilder:(检查蓝色){
    //在这里检查蓝色的代码
    //如果东西是蓝色的,则放置空容器
    if(thingIsBlue){
    返回新容器();
    //***我如何计算这些***
    }
    //或者,如果东西不是蓝色的
    返回新事物(Thing.id);
    );
    },
    );
    );
    }
    
    我认为你没有从正确的角度看待问题,加上标题有误导性

    您可能不打算计算屏幕上显示的小部件,而是计算符合某些条件的Firebase数据库条目的子集。 这在flatter中有很大的不同,因为计算小部件通常涉及渲染树、布局和图形,而看起来您想要解决数据问题

    如果我是正确的,那么你可以考虑在你的数据库中有一个索引来跟踪蓝色项目的数量,并在另一个流构建器中监听它。 长话短说,您可能希望保留一个映射,在构建时更新每个元素,并在需要计数时迭代映射

    // somewhere in your outer scope
    Map<int, bool> _bluenessMap = new Map<int, bool>();
    
      return new StreamBuilder<int>(
        stream: subscribeMyThings(thing.id),
        builder: (context, thingsSnapshot) {
            return new FirebaseAnimatedList(
              query: getThings(thing.id),
              itemBuilder: (context, snapshot, animation, index) {
                return new ReactiveWidget<int>(
                  reactiveRef: getThingBlueness(snapshot.key),
                  widgetBuilder: (checkBlueness) {
                    // code to check blueness here
    
    
                    // ----------------------------
                    // before return let us update the map
    
                    _bluenessMap[thing.id] = thingIsBlue
    
                    // ----------------------------
    
                    // if Thing is blue, place empty container
                    if (thingIsBlue) {
                      return new Container();
                    }
    
                    // or, if Thing is NOT blue
                    return new Thing(thing.id);
    
                    );
                  },
                );
            );
          }
    
      // call me when you want to count
      int fancyBlueCounter(){
          int result = 0;
          for(bool isBlue in _bluenessMap.values){
            if(isBlue) result += 1;
          }
          return result;
      }
    
    //在外部范围内的某个地方
    地图_bluenessMap=新地图();
    返回新的StreamBuilder(
    stream:subscribeMyThings(thing.id),
    构建者:(上下文、内容快照){
    返回新的FirebaseAnimatedList(
    查询:getThings(thing.id),
    itemBuilder:(上下文、快照、动画、索引){
    返回新的ReactiveWidget(
    reactiveRef:getThingBlueness(snapshot.key),
    widgetBuilder:(检查蓝色){
    //在这里检查蓝色的代码
    // ----------------------------
    //在返回之前,让我们更新地图
    _bluenessMap[thing.id]=thingIsBlue
    // ----------------------------
    //如果东西是蓝色的,则放置空容器
    if(thingIsBlue){
    返回新容器();
    }
    //或者,如果东西不是蓝色的
    返回新事物(Thing.id);
    );
    },
    );
    );
    }
    //你想数数的时候给我打电话
    int fancyBlueCounter(){
    int结果=0;
    for(bool在_bluenessMap.values中为蓝色){
    如果(蓝色)结果+=1;
    }
    返回结果;
    }
    
    编辑

    既然问题的作者确认这是一个“数据问题”,我想建议另一种(也许更好)解决方法


    聚合或索引(在我看来)是解决问题的正确方法。任何时候,只要有人触摸某个东西(取决于它的蓝色),它就会刷新数据库中特意创建的聚合(实际上也是一个简单的数据输入计数)。您可以使用事务更新蓝色计数,或使用云函数(参见文档)监听更改事件(创建、删除和编辑)来执行任何函数编辑操作以及更新计数。

    你完全正确,我想计算满足某些条件的数据子集。这看起来应该运行得很好,但我无法让它运行。我会继续尝试,如果我能正确运行,我会将其标记为答案。编辑标题和问题以更好地反映这一点。@Deborah,正如我提到的那样仅用您提供的代码很难提供一个最小的工作示例。无论如何,如果可以的话,我很乐意提供帮助,请随意提供有关结果的更多详细信息。@Deborah请同时检查“数据”解决方案如更新的答案所示。我完全同意@fabio veronese。我在与Firestore合作的Flatter应用程序中遇到了您的确切问题,并最终在我的主收藏旁边创建了一个文档id集合,即,我的主收藏中的每个文档的id都放在一个单独的id集合中。我只需添加一些内容在应用程序中添加广告,以管理/使用与主Firestore流平行的id集合。效果很好。我认为Firebase实时数据库可能工作得更好,但我认为在您和我尝试做的事情方面,它将类似。祝您好运!