Расчеты Flireter Firestore не работают - PullRequest
1 голос
/ 30 сентября 2019

Цель

У меня есть приложение 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']);
              });
        });
  }
}

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

итоговая коллекция = Firestore.instance.collection («Расходы»);// Как получить UID, то документы ???

0 голосов
/ 30 сентября 2019

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