如何将数据从Firebase传递到Flutter中的条形图中?

问题描述

我希望将数据从Firebase传递到分为7列的颤动图中,以便将其分成几天,以便将其传递到条形图中。我已经尝试将total_Sunday + total_Monday + total_Tuesday + total_Wednesday + total_Thursday + total_Friday + total_Saturday加上我的总和,但是它不起作用,它正在将这些周的总和与我添加的每笔新交易相加。

这是我的代码,用于从Firebase和条形图中读取数据。

 void read_data() async {
    database.once().then(
      (DataSnapshot snapshot) {
        Map<dynamic,dynamic> values = snapshot.value;

        //for loop
        values.forEach(
          (key,value) {
            setState(() {
              _amountController = value['amount'];
              _deuration = value['Deuration'];

              if (deuration == _deuration) {
                if (value['Day'] == "Monday") {
                  total_Monday = total_Monday + double.parse(_amountController);
                  print("Monday");
                  print(total_Monday);
                }
                if (value['Day'] == "Tuesday") {
                  total_Tuesday =
                      total_Tuesday + double.parse(_amountController);
                  print("Tuesday");
                  print(total_Tuesday);
                }
                if (value['Day'] == "Wednesday") {
                  total_Wednesday =
                      total_Wednesday + double.parse(_amountController);
                  print("Wednesday");
                  print(total_Wednesday);
                }
                if (value['Day'] == "Thursday") {
                  total_Thursday =
                      total_Thursday + double.parse(_amountController);
                  print("Thursday");
                  print(total_Thursday);
                }
                if (value['Day'] == "Friday") {
                  total_Friday = total_Friday + double.parse(_amountController);
                  print("Friday");
                  print(total_Friday);
                }
                if (value['Day'] == "Saturday") {
                  total_Saturday =
                      total_Saturday + double.parse(_amountController);
                  print("Saturday");
                  print(total_Saturday);
                }
                if (value['Day'] == "Sunday") {
                  total_Sunday = total_Sunday + double.parse(_amountController);
                  print("Sunday");
                  print(total_Sunday);
                }
              }
            });
          },);
      },);
  }

List<Map<String,Object>> get groupedTransactionValues {
    return List.generate(7,(index) {
      final weekDay = DateTime.Now().subtract(
        Duration(days: index),);
      double totalSum = 0.0;

      for (var i = 0; i < widget.recentTransaction.length; i++) {
        if ((widget.recentTransaction[i].date.day == weekDay.day) &&
            (widget.recentTransaction[i].date.month == weekDay.month) &&
            (widget.recentTransaction[i].date.year == weekDay.year)) {
          totalSum += widget.recentTransaction[i].amount +
              total_Sunday +
              total_Monday +
              total_Tuesday +
              total_Wednesday +
              total_Thursday +
              total_Friday +
              total_Saturday;
          print("qqqqqsxdecv");
          print(totalSum);
        }
      }

      return {
        'day': DateFormat.E().format(weekDay).substring(0,1),'amount': totalSum,// 'totalSunday': total_Sunday,// 'totalMonday': total_Monday,// 'totalTuesday': total_Tuesday,// 'totalWednesday': total_Wednesday,// 'totalThursday': total_Thursday,// 'totalFriday': total_Friday,// 'totalsaturday': total_Saturday,};
    }).reversed.toList();
  }

  double get totaLSpending {
    return groupedTransactionValues.fold(0.0,(sum,item) {
      return sum + item['amount'];
      // item['totalSunday'] +
      // item['totalMonday'] +
      // item['totalTuesday'] +
      // item['totalWednesday'] +
      // item['totalThursday'] +
      // item['totalFriday'] +
      // item['totalsaturday'];
    });
  }

  @override
  Widget build(BuildContext context) {
    print('build() Chart');
    return Card(
      elevation: 6,margin: EdgeInsets.all(10),child: Container(
        padding: EdgeInsets.all(8),child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceAround,children: groupedTransactionValues.map(
            (data) {
              return Flexible(
                fit: FlexFit.tight,child: ChartBar(
                    data['day'],data['amount'],totaLSpending == 0.0
                        ? 0.0
                        : (data['amount'] as double) / totaLSpending),);
            },).toList(),),);
  }
}

代码是条形图的另一个小部件

class ChartBar extends StatefulWidget {
  final String label;
  final double spendingAmount;
  final double spendingPercentageOfTotal;

  ChartBar(
    this.label,this.spendingAmount,this.spendingPercentageOfTotal,);

  @override
  _ChartBarState createState() => _ChartBarState();
}
class _ChartBarState extends State<ChartBar> {
  @override
  Widget build(BuildContext context) {
    print('build() ChartBar');
    return LayoutBuilder(builder: (ctx,constraints) {
      return Column(
        children: <Widget>[
          Container(
            height: constraints.maxHeight * 0.15,child: FittedBox(
              child: Text('\$${widget.spendingAmount.toStringAsFixed(0)}'),SizedBox(
            height: constraints.maxHeight * 0.05,Container(
            height: constraints.maxHeight * 0.6,width: 10,child: Stack(
              children: <Widget>[
                Container(
                  decoration: Boxdecoration(
                    border: Border.all(color: Colors.grey,width: 1.0),color: Color.fromrGBO(220,220,borderRadius: BorderRadius.circular(10),FractionallySizedBox(
                    heightFactor: widget.spendingPercentageOfTotal,alignment: Alignment.bottomCenter,child: Container(
                      decoration: Boxdecoration(
                        color: Colors.purple,)),],Container(
            height: constraints.maxHeight * 0.15,child: FittedBox(
              child: Text(widget.label),)
        ],);
    });
  }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)