Диаграммы: тип аргумента Future >> 'нельзя присвоить типу параметра' Список > ' - PullRequest
0 голосов
/ 21 июня 2020

Я пытаюсь создать простую диаграмму p ie, но у меня возникают проблемы с использованием будущих данных в конструкторе фабрики. В сообщении об ошибке говорится:

2 позиционных аргумента ожидаются, но найден 1.

Тип аргумента 'Future >> 'нельзя присвоить типу параметра' Список > '.

Это код:

/// 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);
}

EDIT: Мне удалось исправить это с помощью Future Builder. Мой код с изменениями:

import 'package:charts_flutter/flutter.dart' as charts;
import 'package:charts_flutter/flutter.dart';
import 'package:flutter/material.dart';
import 'package:testingflutterapp/models/budget.dart';
import 'package:testingflutterapp/services/db.dart';

// ignore: must_be_immutable
class SimplePieChart extends StatefulWidget {
  SimplePieChart(this.goal);

  int goal;
  @override
  _SimplePieChartState createState() {
    return _SimplePieChartState(this.goal);
  }
}

class _SimplePieChartState extends State<SimplePieChart> {

  List<charts.Series> seriesList;
  List<charts.Series> seriesListNew;
  bool animate;
  int goal;
  _SimplePieChartState(this.goal);

  /// Creates a [PieChart] with sample data and no transition.

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<List<charts.Series<LinearSales, int>>>(
        future: _createSampleData(goal),
        builder: (context, AsyncSnapshot<List<charts.Series<LinearSales, int>>> seriesList) {
          if (seriesList.hasData) {
            return charts.PieChart(
                seriesList.data,
                animate: false);
          } else {
            return CircularProgressIndicator();
          }
        }
    );
  }

  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;
    String x = _results[0].values.toString().replaceAll(new RegExp(r'[\(,\)]'), "");
    double y = double.parse(x);
    return y;
  }

  /// 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;
    //print(graphLine.round());
    final data = [
      new LinearSales(0, keepValue.round()), // value saved = x
      new LinearSales(1, graphLine.round()), // 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,
      )
    ];
    //return seriesList;
  }
}

/// Sample linear data type.
class LinearSales {
  final int year;
  final int sales;

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

1 Ответ

0 голосов
/ 21 июня 2020

Ваши проблемы здесь

return _SimplePieChartState(
  _createSampleData(goal),
  animate: false,
  // Disable animations for image tests.
);
  1. _createSampleData возвращает Future, поэтому вам нужно дождаться его, чтобы получить List<Series<dynamic, dynamic>>, конструкторы фабрики не могут быть async, поэтому вам нужно будет переосмыслить свой лог. c

  2. _SimplePieChartState имеет 2 позиционных параметра, и вы используете параметр animate в качестве имени. Это должно быть false, а не animate: false

.
...