为什么我不能在Charts_flutter中将类字符串作为domainFn用作饼图

时间:2019-02-12 19:37:22

标签: charts flutter

您好,我正在尝试根据其example使Piechart 但是我改变了一件事,我改变了

final int year

final String year

但是对于domainFn,我收到此错误:

{
  "resource": "/home/saeb/AndroidStudioProjects/charts/lib/main.dart",
  "owner": "dart",
  "code": "return_of_invalid_type_from_closure",
  "severity": 8,
  "message": "The return type 'String' isn't a 'int', as defined by anonymous closure.",
  "source": "dart",
  "startLineNumber": 36,
  "startColumn": 45,
  "endLineNumber": 36,
  "endColumn": 55,
  "tags": []
}

我的标签应该是字符串而不是int,我该怎么做?

我的代码:

    import 'package:charts_flutter/flutter.dart' as charts;
import 'package:flutter/material.dart';

class PieOutsideLabelChart extends StatelessWidget {
  final List<charts.Series> seriesList;
  final bool animate;

  PieOutsideLabelChart(this.seriesList, {this.animate});

  factory PieOutsideLabelChart.withSampleData() {
    return new PieOutsideLabelChart(
      _createSampleData(),
      animate: false,
    );
  }
  @override
  Widget build(BuildContext context) {
    return new charts.PieChart(seriesList,
        animate: animate,
        defaultRenderer: new charts.ArcRendererConfig(arcRendererDecorators: [
          new charts.ArcLabelDecorator(
              labelPosition: charts.ArcLabelPosition.outside)
        ]));
  }

  static List<charts.Series<LinearSales, int>> _createSampleData() {
    final data = [
      new LinearSales('a long text', 100),
      new LinearSales('even longer text', 75),
      new LinearSales('i am long text', 25),
      new LinearSales('the longest text ever', 5),
    ];
    return [
      new charts.Series<LinearSales, int>(
        id: 'Sales',
        domainFn: (LinearSales sales, _) => sales.year,
        measureFn: (LinearSales sales, _) => sales.sales,
        data: data,
        labelAccessorFn: (LinearSales row, _) => '${row.year}: ${row.sales}',
      )
    ];
  }
}
class LinearSales {
  final String year;
  final int sales;

  LinearSales(this.year, this.sales);
}
main(List<String> args) {
  runApp(MaterialApp(
    title: 'charts',
    home: new Scaffold(
      appBar: new AppBar(title: new Text("نمودار فلان"),),
      body:new ListView(children: <Widget>[
          new Card
          (child: PieOutsideLabelChart(PieOutsideLabelChart._createSampleData()),)
        //   ]
        //  ),
      ]
    )
  )
   )
    );
}

3 个答案:

答案 0 :(得分:0)

非常简单:

再次将Year变量设置为int:

final int year

在这里使用toString()方法:

labelAccessorFn: (LinearSales row, _) => '${row.year.toString()}: ${row.sales}',

答案 1 :(得分:0)

是语法问题。我的坏人:D

我应该将chart.Series从charts.Series<LinearSales, **String**>>更改为charts.Series<LinearSales, **int**>>

此代码有效:

        import 'package:charts_flutter/flutter.dart' as charts;
import 'package:flutter/material.dart';

class PieOutsideLabelChart extends StatelessWidget {
  final List<charts.Series> seriesList;
  final bool animate;

  PieOutsideLabelChart(this.seriesList, {this.animate});

  factory PieOutsideLabelChart.withSampleData() {
    return new PieOutsideLabelChart(
      _createSampleData(),
      animate: false,
    );
  }
  @override
  Widget build(BuildContext context) {
    return new charts.PieChart(seriesList,
        animate: animate,
        defaultRenderer: new charts.ArcRendererConfig(arcRendererDecorators: [
          new charts.ArcLabelDecorator(
              labelPosition: charts.ArcLabelPosition.outside)
        ]));
  }

  static List<charts.Series<LinearSales, String>> _createSampleData() {
    final data = [
      new LinearSales('a long text', 100),
      new LinearSales('even longer text', 75),
      new LinearSales('i am long text', 25),
      new LinearSales('the longest text ever', 5),
    ];
    return [
      new charts.Series<LinearSales, String>(
        id: 'Sales',
        domainFn: (LinearSales sales, _) => sales.year,
        measureFn: (LinearSales sales, _) => sales.sales,
        data: data,
        labelAccessorFn: (LinearSales row, _) => '${row.year}',
      )
    ];
  }
}
class LinearSales {
  final String year;
  final int sales;

  LinearSales(this.year, this.sales);
}
main(List<String> args) {
  runApp(MaterialApp(
    title: 'charts',
    home: new Scaffold(
      appBar: new AppBar(title: new Text("نمودار فلان"),),
      body: PieOutsideLabelChart(PieOutsideLabelChart._createSampleData()),)

  )
   );

}

答案 2 :(得分:0)

您可以在Charts_flutter中将一个类字符串作为domainFn用于饼图。 需要一些调整 第1步:将其添加到图表中,以便在饼图的外部显示标签

defaultRenderer: new charts.ArcRendererConfig(
         arcWidth: 60,
         arcRendererDecorators: [new charts.ArcLabelDecorator(
              labelPosition: charts.ArcLabelPosition.outside)]
      ),

步骤2:现在用于自定义带有属性的字符串的标签。 这是labelAccessorFn

String datas(int id,int value){
      if(id==0){
        return value.toString()+":RT";
      }else if(id==1){
        return value.toString()+":OT";
      }
      else if(id==2){
        return value.toString()+":IT";
      }
    return [
          new charts.Series<VfmProductivityPie, int>(
            id: 'Sales',
            domainFn: (VfmProductivityPie sales, _) => sales.id,
            measureFn: (VfmProductivityPie sales, _) => sales.value,
            data: data,
            labelAccessorFn: (VfmProductivityPie row, _) =>
             // print('object'),
             //'${row.id}r: ${row.value}',
             datas(row.id,row.value)
          )
        ];

注意:在_createSampleData下写入数据功能 working screenshot of piechart