【发布时间】:2020-10-11 09:12:08
【问题描述】:
我正在尝试制作一个简单的饼图,但在工厂构造函数中使用未来数据时遇到了问题。错误消息说:
需要 2 个位置参数,但找到了 1 个。
参数类型“Future
>>”不能分配给参数类型“List
>”。
这是代码:
/// Simple pie chart example.
import 'package:charts_flutter/flutter.dart' as charts;
import 'package:flutter/material.dart';
import 'package:testingflutterapp/models/budget.dart';
import 'package:testingflutterapp/services/db.dart';
class SimplePieChart extends StatefulWidget {
final List<charts.Series> seriesList;
final bool animate;
SimplePieChart(this.seriesList, this.animate);
@override
_SimplePieChartState createState() {
return _SimplePieChartState(this.seriesList, this.animate);
}
}
class _SimplePieChartState extends State<SimplePieChart> {
List<charts.Series> seriesList;
final bool animate;
_SimplePieChartState(this.seriesList, this.animate);
/// Creates a [PieChart] with sample data and no transition.
factory _SimplePieChartState.withSampleData(int goal) {
return _SimplePieChartState(
_createSampleData(goal),
animate: false,
// Disable animations for image tests.
);
}
@override
Widget build(BuildContext context) {
return new charts.PieChart(seriesList, animate: animate);
}
Future<Budget> giveData(int goal) async {
List<Budget> _tasks = [];
List<Map<String, dynamic>> _results =
await DB.rawQuery('SELECT * FROM budget WHERE budget.id="$goal";');
_tasks = _results.map((item) => Budget.fromMap(item)).toList();
Budget budgetToDisplay = _tasks[0];
return budgetToDisplay;
}
Future<double> giveDataSum(int goalID) async {
List<Budget> _tasks = [];
List<Map<String, dynamic>> _results = await DB.rawQuery(
'SELECT sum(value) AS value FROM (SELECT budget_items.* FROM budget_items INNER JOIN budget_items_list ON budget_items_list.budget_items_id=budget_items.id INNER JOIN budget ON budget.id=budget_items_list.budget_id WHERE budget.id="$goalID");');
_tasks = _results.map((item) => Budget.fromMap(item)).toList();
double budgetToDisplay = _tasks[0].goal;
return budgetToDisplay;
}
/// Create one series with sample hard coded data.
Future<List<charts.Series<LinearSales, int>>> _createSampleData(
int goal) async {
// Calculate percentages
//get goal value
Budget budgetDisplay = await giveData(goal);
double goalValue = budgetDisplay.goal;
double keepValue = await giveDataSum(goal);
double graphLine = goalValue - keepValue;
final data = [
new LinearSales(0, keepValue as int), // value saved = x
new LinearSales(1, graphLine as int), // value to save = goal - x
];
return [
new charts.Series<LinearSales, int>(
id: 'Sales',
domainFn: (LinearSales sales, _) => sales.year,
measureFn: (LinearSales sales, _) => sales.sales,
data: data,
)
];
}
}
/// Sample linear data type.
class LinearSales {
final int year;
final int sales;
LinearSales(this.year, this.sales);
}
编辑: 我能够用 Future Builder 解决这个问题。 我的更改代码:
导入 'package:charts_flutter/flutter.dart' 作为图表;
导入“包:charts_flutter/flutter.dart”;
导入“包:颤振/material.dart”;
导入“包:testingflutterapp/models/budget.dart”;
导入“包:testingflutterapp/services/db.dart”;
// 忽略:must_be_immutable
类 SimplePieChart 扩展 StatefulWidget {
SimplePieChart(this.goal);
国际目标;
@覆盖
_SimplePieChartState createState() {
返回 _SimplePieChartState(this.goal);
}
}
类 _SimplePieChartState 扩展 State {
列表 系列列表;
列表 seriesListNew;
布尔动画;
国际目标;
_SimplePieChartState(this.goal);
/// 创建一个带有样本数据且没有转换的 [PieChart]。
@覆盖
小部件构建(BuildContext 上下文){
return FutureBuilder>>(
未来:_createSampleData(目标),
生成器:(上下文,AsyncSnapshot>> seriesList){
if (seriesList.hasData) {
返回图表.PieChart(
seriesList.data,
动画:假);
} 别的 {
返回 CircularProgressIndicator();
}
}
);
}
未来 giveData(int 目标) async {
列表 _tasks = [];
列表> _results =
await DB.rawQuery('SELECT * FROM budget WHERE budget.id="$goal";');
_tasks = _results.map((item) => Budget.fromMap(item)).toList();
预算budgetToDisplay = _tasks[0];
返回budgetToDisplay;
}
Future giveDataSum(int goalID) async {
列表 _tasks = [];
List
【问题讨论】:
-
_SimplePieChartState不应该有构造函数。使用widget.seriesList(例如)访问StatefulWidget中声明的成员。
标签: flutter