¿如何在 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),
));
我正在构建一个 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),
));