flatter.io(Dart)-如何计算满足特定条件的Firebase查询返回的项目
在屏幕中,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
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实时数据库可能工作得更好,但我认为在您和我尝试做的事情方面,它将类似。祝您好运!