Допустим, у вас есть 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'),
);
},
),
);
},
),
);
}
}