我有一个 Firestore 应用程序,可以在文档中记录项目及其价值。我想返回所有这些文档的“值”字段并计算所有这些文档的总价值(将它们相加)。
当我使用下面的代码行时,它只是一个一个地打印值(见附上的截图)。我还附上了我的 Firestore 结构的屏幕截图。我试过使用 sum 和 sum2,但都返回相同的结果。
var getValueSTRING = documentSnapshot['Value'];
var one = int.parse(getValueSTRING);
var sum = [values].reduce((curr, next) => curr + next);
var sum2 = list2.fold(0, (curr, next) => curr + next);
print(sum);
Reloaded 3 of 579 libraries in 446ms.
I/flutter ( 3161): [100]
I/flutter ( 3161): [200]
class Expenses extends StatefulWidget {
@override
ESTATE createState() => ESTATE();
}
class ESTATE extends State<Expenses> {
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: Firestore.instance
.collection('users')
.document(userDocPATH.toString())
.collection(userCardPATH.toString())
.document(selectedCardPATH)
.collection('Expenses')
.snapshots(),
builder: (context, snapshot) {
return ListView.builder(
itemCount: snapshot.data.documents.length,
itemBuilder: (context, index) {
DocumentSnapshot documentSnapshot =
snapshot.data.documents[index];
var getValueSTRING = documentSnapshot['Value'];
var one = int.parse(getValueSTRING);
var list2 = [one];
var sum2 = list2.fold(0, (curr, next) => curr + next);
print(sum2);
return Text(documentSnapshot['Value']);
});
});
}
}
假设你已经QuerySnapshot snapshot
准备好了。您可以像这样计算所有值的总和:
final sum = snapshot.data.documents.fold(0, (prev, next) => prev + int.parse(next['Value']))
换句话说,折叠应该在 上执行List<DocumentSnapshot>
。
编辑以响应更新的代码:
罪魁祸首是这些行:
var one = int.parse(getValueSTRING);
var list2 = [one];
var sum2 = list2.fold(0, (curr, next) => curr + next);
问题在于代码试图折叠只有一个值的列表。包含一项的汇总列表将始终净额等于该项目的价值。
要获得正确的值,所有这些都DocumentSnapshots
需要考虑在内。目前,只DocumentSnapshot
考虑一个,如下行所示:
DocumentSnapshot documentSnapshot = snapshot.data.documents[index];
相反,尝试这样的事情(我省略了不必要的代码以减少视觉噪音):
<...>
builder: (context, snapshot) {
// Add this line to calculate total sum, and use it later on
final sum = snapshot.data.documents.fold(0.0, (prev, next) => prev + int.parse(next['Value']))
return ListView.builder(<...>);
编辑 2(工作代码):
假设以下 Firebase 数据库结构:
Expenses > doc1 > Value: "100"
doc2 > Value: "200"
doc3 > Value: "300"
下面的代码计算总和并将其显示为标题。它还显示每个单独的值。只要 Firebase 结构相同,代码就应该运行并产生正确的结果。添加新文档或编辑现有文档将影响条目列表和总和。
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
void main() {
runApp(Expenses());
}
class Expenses extends StatefulWidget {
@override
ESTATE createState() => ESTATE();
}
class ESTATE extends State<Expenses> {
final collection = Firestore.instance.collection('Expenses');
@override
Widget build(BuildContext context) {
return MaterialApp(
home: StreamBuilder<QuerySnapshot>(
stream: collection.snapshots(),
builder: (context, snapshot) {
if (!snapshot.hasData) return CircularProgressIndicator();
final documents = snapshot.data.documents;
final sum = documents.fold(0, (s, n) => s + int.parse(n['Value']));
return Scaffold(
appBar: AppBar(title: Text("Total sum: $sum")),
body: ListView.builder(
itemCount: snapshot.data.documents.length,
itemBuilder: (context, index) {
final documentSnapshot = snapshot.data.documents[index];
final value = int.parse(documentSnapshot['Value']);
return Padding(
padding: const EdgeInsets.all(8.0),
child: Text('Document $index: $value'),
);
},
),
);
},
),
);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句