¿如何在 Flutter 中迭代快照?

¿How can I iterate a snapshot in Flutter?

我正在构建一个 flutter 应用程序,我正在尝试根据计算器获得的值创建一个时间图表,所以我用 sqflite 创建了一个数据库,数据库中的每个元素都有一个 Id,一个日期和一个值。

import 'package:bezier_chart/bezier_chart.dart';
import 'package:flutter/material.dart';
import 'package:mi_working_app/components/bmi_chart.dart';
import 'package:mi_working_app/services/statistics_bmi_dbhelper.dart';

class StatisticsWidget extends StatefulWidget {
  @override
  _StatisticsWidgetState createState() => _StatisticsWidgetState();
}

class _StatisticsWidgetState extends State<StatisticsWidget> {
  BMIDbHelper bmihelper;

  @override
  void initState() {
    super.initState();
    bmihelper = BMIDbHelper();
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        FutureBuilder(
            future: bmihelper.getBMIs(),
            builder: (BuildContext context, AsyncSnapshot bmisnapshot) {
              if (bmisnapshot.hasData) {
                print(bmisnapshot.data);
                print(bmisnapshot.data.length);
                return Container(
                    child: BMITimeChart(
                  data: data(bmisnapshot),
                ));
              } else {
                return Center(
                  child: CircularProgressIndicator(),
                );
              }
            }),
      ],
    );
  }

}

现在要创建图表,我需要从每个元素中提取日期和值,为此我这样做了:

List<DataPoint<dynamic>> data(rawData) {
    List bmiDataList;

    for (Map m in rawData) {
      bmiDataList.add(DataPoint<DateTime>(
          value: double.parse(rawData.value['value']),
          xAxis: DateTime.parse(rawData.value['date'])));
    }

    print(bmiDataList);
    return bmiDataList;
  }

现在我收到“类型 'AsyncSnapshot<List>' 不是类型 'Iterable' 的子类型”。我明白这个错误,我无法迭代快照,但我不知道我还能如何检索数据

我相信通过,bmisnapshot.data 应该可以解决您的错误,而不是通过 bmisnapshot,

 return Container(
                    child: BMITimeChart(
                  data: data(bmisnapshot.data),
              ),);

如果你要使用列表方法,也总是初始化你的列表,否则你会得到一个 NoSuchMethodError 因为它是在 null 上调用的;

List bmiDataList = [];

我也不确定这是否正确,

    value: double.parse(rawData.value['value']),
          xAxis: DateTime.parse(rawData.value['date'])));

因为 AynscSnapshot 没有值属性,并且由于您已经传入了数据, 你应该能够像这样提取值

    value: double.parse(rawData['value']),
          xAxis: DateTime.parse(rawData['date'])));

您应该使用 AsyncSnapshot.data.data 获取地图。

if (bmisnapshot.hasData) {
                print(bmisnapshot.data);
                print(bmisnapshot.data.length);
                return Container(
                    child: BMITimeChart(
                  data: data(bmisnapshot.data.data),
                ));