【问题标题】:Charts:The argument type 'Future<List<Series<LinearSales, int>>>' can't be assigned to the parameter type 'List<Series<dynamic, dynamic>>'图表:参数类型 'Future<List<Series<LinearSales, int>>>' 不能分配给参数类型 'List<Series<dynamic, dynamic>>'
【发布时间】: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> _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;
    字符串 x = _results[0].values.toString().replaceAll(new RegExp(r'[\(,\)]'), "");
    双 y = double.parse(x);
    返回 y;
  }

  /// 使用示例硬编码数据创建一个系列。
  Future>> _createSampleData(int goal) async {

    // 计算百分比
    //获取目标值
    预算budgetDisplay = await giveData(goal);

    双目标值 = 预算显示.目标;

    double keepValue = await giveDataSum(goal);

    双图线 = 目标值 - 保持值;
    //打印(graphLine.round());
    最终数据 = [
      new LinearSales(0, keepValue.round()), // 保存的值 = x
      new LinearSales(1, graphLine.round()), // 要保存的值 = 目标 - x
    ];


    返回 [
      新图表.Series(
        id: '销售',
        domainFn: (LinearSales sales, _) => sales.year,
        measureFn: (LinearSales sales, _) => sales.sales,
        数据:数据,
      )
    ];
    //返回系列列表;
  }
}

/// 示例线性数据类型。
类线性销售{
  最终的 int 年;
  最终的内部销售;

  LinearSales(this.year, this.sales);
}```

【问题讨论】:

  • _SimplePieChartState 不应该有构造函数。使用widget.seriesList(例如)访问StatefulWidget中声明的成员。

标签: flutter


【解决方案1】:

你的问题在这里

return _SimplePieChartState(
  _createSampleData(goal),
  animate: false,
  // Disable animations for image tests.
);
  1. _createSampleData 返回一个Future,所以你必须等待它才能获得List&lt;Series&lt;dynamic, dynamic&gt;&gt;,工厂构造函数不能是async,所以你需要重新考虑你的逻辑

  2. _SimplePieChartState 有 2 个位置参数,您正在使用命名的 animate 参数。应该是false 而不是animate: false

【讨论】:

  • 谢谢!我理解你的第二点并且能够解决这个问题。像这样编辑代码_SimplePieChartState.withSampleData(int goal, this.animate) { _SimplePieChartState( await _createSampleData(goal), false, // Disable animations for image tests. ); } 这当然仍然是错误的,因为await 但我应该对逻辑进行哪些更改?
  • 没错@CatarinaNunes。工厂构造函数不能包含等待,因此您需要重新考虑该部分
  • 我能够修复它!感谢您的帮助!
猜你喜欢
  • 2021-09-15
  • 2021-10-18
  • 2019-10-05
  • 2021-10-24
  • 2021-11-13
  • 2021-12-24
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
相关资源
最近更新 更多