【问题标题】:What can make this code accomplish my objective of visualizing this pie chart in flutter?什么可以使这段代码实现我在颤动中可视化这个饼图的目标?
【发布时间】:2020-09-02 07:31:44
【问题描述】:

我想在 Flutter 中创建一个饼图。我在网上观看了几个视频,并在更改了一些参数和参数后进行了复制。我创建的饼图将代表 Recovered、Active 和印度的冠状病毒死亡病例。我要使用的数据来自https://coronavirus-19-api.herokuapp.com/countries

通常,饼图需要 3 个图例,如上所述。我尝试实现此功能,但遇到了非常规错误。我已经获取了数据并用 dart 对其进行了解码,但我很遗憾未能在饼图中实现它。

import 'dart:async';
import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:charts_flutter/flutter.dart' as charts;
import 'package:http/http.dart' as http;
void main()=>runApp(App());

class Task{
  String task;
  int taskvalue;
  Color colors;
  Task({this.task,this.taskvalue,this.colors});
}



class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
home:Home()
    );
  }
}

class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {

  List<dynamic> data;
  Map<String,dynamic> statsIndia;
  List<charts.Series<Task,String>> _seriesPieData;
  int a,b,c;

  Future<String> getData() async {
    var response = await http.get(
      Uri.encodeFull("https://coronavirus-19-api.herokuapp.com/countries"), //https://corona-virus-stats.herokuapp.com/api/v1/cases/countries-search
      //https://api.thevirustracker.com/free-api?global=stats print(data["results"][0]["total_cases"])
      headers: {
        "Accept": "application/json"
      }

    );

    this.setState(() {
      data = json.decode(response.body);
      statsIndia=data[11];
      a = statsIndia["cases"];
      b=statsIndia["recovered"];
      c = statsIndia["deaths"];
    });

    return "Sucesss!";
  }

get(){


  var piedata=[
    new Task(task: "Confirmed",taskvalue: a,colors:Color(0xFF003cbf)),
    new Task(task: "Recovered",taskvalue: b,colors:Color(0xFF06cafd)),
    new Task(task:"Deaths",taskvalue: c,colors:Color(0xFFff5c4d))

    ];
    _seriesPieData.add(
      charts.Series(
        data:piedata,
        domainFn: (Task task,_)=>task.task,
        measureFn: (Task task,_)=>task.taskvalue,
        colorFn: (Task task,_)=>
        charts.ColorUtil.fromDartColor(task.colors),
        id:"India",
        labelAccessorFn: (Task row,_)=>'${row.taskvalue}',

      )
    );
}

@override
  void initState() {
    super.initState();
    this.getData();
    _seriesPieData=List<charts.Series<Task,String>>();
    get();

  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
          body: Container(
        child:Padding(
          padding:EdgeInsets.all(8.0),
          child:Container(
            child:Center(
              child:Column(
                children: <Widget>[
                  Text("Stats"),
                  Expanded(
                    child:charts.PieChart(
                                    _seriesPieData,
                                    animate: true,
                                    animationDuration: Duration(seconds:5),
                                    behaviors: [
                                      new charts.DatumLegend(
                                        outsideJustification: charts.OutsideJustification.endDrawArea,
                                        horizontalFirst: false,
                                        desiredMaxRows: 2,
                                        cellPadding: new EdgeInsets.only(right:4.0,bottom:4.0),
                                        entryTextStyle: charts.TextStyleSpec(
                                          color:charts.MaterialPalette.purple.shadeDefault,
                                          fontFamily: "Montserrat",
                                          fontSize: 11),
                                        ),

                                    ],
                                    defaultRenderer: new charts.ArcRendererConfig(
                                      arcWidth: 50,
                                      arcRendererDecorators: [
                                        new charts.ArcLabelDecorator(
                                          labelPosition: charts.ArcLabelPosition.inside
                                        )
                                      ]
                                    ),
                                  ),
                  )
                ],
              )
            )
          )
        )
      ),
    );
  }
}

序列化 json 没有问题。噩梦在于将其可视化为饼图。因此,必须用于绘制饼图的数据存储在 statsIndia 中。经过数小时的调试,我无法弄清楚出了什么问题。错误日志是

I/flutter ( 5237): ══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════
I/flutter ( 5237): The following RangeError was thrown during performLayout():
I/flutter ( 5237): RangeError (index): Invalid value: Valid value range is empty: 0
I/flutter ( 5237):
I/flutter ( 5237): The relevant error-causing widget was:
I/flutter ( 5237):   ChartContainer<dynamic>
I/flutter ( 5237):   file:///C:/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/charts_flutter-0.9.0/lib/src/base_chart_state.dart:89:32
I/flutter ( 5237):
I/flutter ( 5237): When the exception was thrown, this was the stack:
I/flutter ( 5237): #0      List.[] (dart:core-patch/growable_array.dart:146:60)
I/flutter ( 5237): #1      ArcRenderer.update.<anonymous closure> (package:charts_common/src/chart/pie/arc_renderer.dart:231:39)
I/flutter ( 5237): #2      List.forEach (dart:core-patch/growable_array.dart:282:8)
I/flutter ( 5237): #3      ArcRenderer.update (package:charts_common/src/chart/pie/arc_renderer.dart:176:16)
I/flutter ( 5237): #4      BaseChart.onPostLayout.<anonymous closure> (package:charts_common/src/chart/common/base_chart.dart:584:37)
I/flutter ( 5237): #5      _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:379:8)
I/flutter ( 5237): #6      BaseChart.onPostLayout (package:charts_common/src/chart/common/base_chart.dart:583:10)
I/flutter ( 5237): #7      BaseChart.layout (package:charts_common/src/chart/common/base_chart.dart:398:7)
I/flutter ( 5237): #8      ChartContainerRenderObject.performLayout (package:charts_flutter/src/chart_container.dart:215:12)
I/flutter ( 5237): #9      RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
I/flutter ( 5237): #10     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
I/flutter ( 5237): #11     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
I/flutter ( 5237): #12     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
I/flutter ( 5237): #13     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
I/flutter ( 5237): #14     MultiChildLayoutDelegate.layoutChild (package:flutter/src/rendering/custom_layout.dart:171:11)
I/flutter ( 5237): #15     WidgetLayoutDelegate.performLayout (package:charts_flutter/src/widget_layout_delegate.dart:80:7)
I/flutter ( 5237): #16     MultiChildLayoutDelegate._callPerformLayout (package:flutter/src/rendering/custom_layout.dart:240:7)
I/flutter ( 5237): #17     RenderCustomMultiChildLayoutBox.performLayout (package:flutter/src/rendering/custom_layout.dart:399:14)
I/flutter ( 5237): #18     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
I/flutter ( 5237): #19     RenderFlex.performLayout (package:flutter/src/rendering/flex.dart:808:17)
I/flutter ( 5237): #20     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
I/flutter ( 5237): #21     RenderPositionedBox.performLayout (package:flutter/src/rendering/shifted_box.dart:394:13)
I/flutter ( 5237): #22     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
I/flutter ( 5237): #23     RenderPadding.performLayout (package:flutter/src/rendering/shifted_box.dart:207:11)
I/flutter ( 5237): #24     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
I/flutter ( 5237): #25     MultiChildLayoutDelegate.layoutChild (package:flutter/src/rendering/custom_layout.dart:171:11)
I/flutter ( 5237): #26     _ScaffoldLayout.performLayout (package:flutter/src/material/scaffold.dart:484:7)
I/flutter ( 5237): #27     MultiChildLayoutDelegate._callPerformLayout (package:flutter/src/rendering/custom_layout.dart:240:7)
I/flutter ( 5237): #28     RenderCustomMultiChildLayoutBox.performLayout (package:flutter/src/rendering/custom_layout.dart:399:14)
I/flutter ( 5237): #29     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
I/flutter ( 5237): #30     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
I/flutter ( 5237): #31     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
I/flutter ( 5237): #32     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
I/flutter ( 5237): #33     _RenderCustomClip.performLayout (package:flutter/src/rendering/proxy_box.dart:1248:11)
I/flutter ( 5237): #34     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
I/flutter ( 5237): #35     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
I/flutter ( 5237): #36     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
I/flutter ( 5237): #37     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
I/flutter ( 5237): #38     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
I/flutter ( 5237): #39     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
I/flutter ( 5237): #40     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
I/flutter ( 5237): #41     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
I/flutter ( 5237): #42     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
I/flutter ( 5237): #43     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
I/flutter ( 5237): #44     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
I/flutter ( 5237): #45     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
I/flutter ( 5237): #46     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
I/flutter ( 5237): #47     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
I/flutter ( 5237): #48     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
I/flutter ( 5237): #49     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
I/flutter ( 5237): #50     RenderOffstage.performLayout (package:flutter/src/rendering/proxy_box.dart:3225:13)
I/flutter ( 5237): #51     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
I/flutter ( 5237): #52     _RenderTheatre.performLayout (package:flutter/src/widgets/overlay.dart:700:15)
I/flutter ( 5237): #53     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
I/flutter ( 5237): #54     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
I/flutter ( 5237): #55     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
I/flutter ( 5237): #56     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
I/flutter ( 5237): #57     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
I/flutter ( 5237): #58     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
I/flutter ( 5237): #59     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
I/flutter ( 5237): #60     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
I/flutter ( 5237): #61     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
I/flutter ( 5237): #62     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
I/flutter ( 5237): #63     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
I/flutter ( 5237): #64     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
I/flutter ( 5237): #65     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
I/flutter ( 5237): #66     RenderView.performLayout (package:flutter/src/rendering/view.dart:167:13)
I/flutter ( 5237): #67     RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1630:7)
I/flutter ( 5237): #68     PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:887:18)
I/flutter ( 5237): #69     RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:402:19)
I/flutter ( 5237): #70     WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:884:13)
I/flutter ( 5237): #71     RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:284:5)
I/flutter ( 5237): #72     SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1113:15)
I/flutter ( 5237): #73     SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1052:9)
I/flutter ( 5237): #74     SchedulerBinding.scheduleWarmUpFrame.<anonymous closure> (package:flutter/src/scheduler/binding.dart:861:7)
I/flutter ( 5237): (elided 11 frames from class _RawReceivePortImpl, class _Timer, dart:async, and dart:async-patch)
I/flutter ( 5237):
I/flutter ( 5237): The following RenderObject was being processed when the exception was fired: ChartContainerRenderObject<dynamic>#9a7c9 NEEDS-LAYOUT NEEDS-PAINT:
I/flutter ( 5237):   creator: ChartContainer<dynamic> ← _PointerListener ← Listener ← _GestureSemantics ←
I/flutter ( 5237):     RawGestureDetector ← GestureDetector ← LayoutId-[<chartContainer>] ← CustomMultiChildLayout ←
I/flutter ( 5237):     PieChart<dynamic> ← Expanded ← Column ← Center ← ⋯
I/flutter ( 5237):   parentData: <none> (can use size)
I/flutter ( 5237):   constraints: BoxConstraints(w=395.4, h=651.4)
I/flutter ( 5237):   semantic boundary
I/flutter ( 5237):   size: MISSING
I/flutter ( 5237): This RenderObject has no descendants.
I/flutter ( 5237): ════════════════════════════════════════════════════════════════════════════════════════════════════
I/flutter ( 5237): Another exception was thrown: RenderBox was not laid out: ChartContainerRenderObject<dynamic>#9a7c9 NEEDS-PAINT
I/flutter ( 5237): Another exception was thrown: RenderBox was not laid out: RenderPointerListener#7e538 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
I/flutter ( 5237): Another exception was thrown: RenderBox was not laid out: RenderSemanticsGestureHandler#5b0cd NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
I/flutter ( 5237): Another exception was thrown: RenderBox was not laid out: ChartContainerRenderObject<dynamic>#9a7c9
I/flutter ( 5237): Another exception was thrown: RangeError (index): Invalid value: Valid value range is empty: 0
I/flutter ( 5237): Another exception was thrown: RenderBox was not laid out: ChartContainerRenderObject<dynamic>#9a7c9 NEEDS-PAINT
I/flutter ( 5237): Another exception was thrown: RenderBox was not laid out: RenderPointerListener#7e538 NEEDS-PAINT
I/flutter ( 5237): Another exception was thrown: RenderBox was not laid out: RenderSemanticsGestureHandler#5b0cd NEEDS-PAINT
I/flutter ( 5237): Another exception was thrown: RenderBox was not laid out: ChartContainerRenderObject<dynamic>#9a7c9
I/flutter ( 5237): Another exception was thrown: RenderBox was not laid out: RenderSemanticsGestureHandler#5b0cd NEEDS-PAINT
I/flutter ( 5237): Another exception was thrown: RenderBox was not laid out: ChartContainerRenderObject<dynamic>#9a7c9

I/flutter ( 5237): Another exception was thrown: 'package:flutter/src/rendering/object.dart': Failed assertion: line 1697 pos 12: '!_debugDoingThisLayout': is not true.
I/flutter ( 5237): Another exception was thrown: RangeError (index): Invalid value: Valid value range is empty: 0
I/flutter ( 5237): Another exception was thrown: RenderBox was not laid out: ChartContainerRenderObject<dynamic>#9a7c9 NEEDS-PAINT
I/flutter ( 5237): Another exception was thrown: RenderBox was not laid out: ChartContainerRenderObject<dynamic>#9a7c9
I/flutter ( 5237): Another exception was thrown: 'package:flutter/src/rendering/object.dart': Failed assertion: line 1697 pos 12: '!_debugDoingThisLayout': is not true.
I/flutter ( 5237): Another exception was thrown: RenderBox was not laid out: ChartContainerRenderObject<dynamic>#9a7c9

【问题讨论】:

    标签: json api flutter dart charts


    【解决方案1】:

    您必须等到所有数据都从api到达然后您才能构建图表。

    以下代码将为您工作。

    List<dynamic> data = [];
      Map<String, dynamic> statsIndia;
      List<charts.Series<Task, String>> _seriesPieData =
          List<charts.Series<Task, String>>();
      int a, b, c;
    
      Future<String> getData() async {
        var response = await http.get(
            Uri.encodeFull(
                "https://coronavirus-19-api.herokuapp.com/countries"), //https://corona-virus-stats.herokuapp.com/api/v1/cases/countries-search
            //https://api.thevirustracker.com/free-api?global=stats print(data["results"][0]["total_cases"])
            headers: {"Accept": "application/json"});
    
        data = json.decode(response.body);
        statsIndia = data[11];
        a = statsIndia["cases"];
        b = statsIndia["recovered"];
        c = statsIndia["deaths"];
        print(a);
        get();
        setState(() {});
        return "Sucesss!";
      }
    
      get() {
        var piedata = [
          new Task(task: "Confirmed", taskvalue: a, colors: Color(0xFF003cbf)),
          new Task(task: "Recovered", taskvalue: b, colors: Color(0xFF06cafd)),
          new Task(task: "Deaths", taskvalue: c, colors: Color(0xFFff5c4d))
        ];
        _seriesPieData.add(charts.Series(
          data: piedata,
          domainFn: (Task task, _) => task.task,
          measureFn: (Task task, _) => task.taskvalue,
          colorFn: (Task task, _) => charts.ColorUtil.fromDartColor(task.colors),
          id: "India",
          labelAccessorFn: (Task row, _) => '${row.taskvalue}',
        ));
        print(_seriesPieData.length);
      }
    
      @override
      void initState() {
        super.initState();
        getData();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Container(
              child: Padding(
                  padding: EdgeInsets.all(8.0),
                  child: Container(
                      child: Center(
                          child: Column(
                    children: <Widget>[
                      Text("Stats"),
                      _seriesPieData.length > 0
                          ? Expanded(
                              child: charts.PieChart(
                                _seriesPieData,
                                animate: true,
                                animationDuration: Duration(seconds: 5),
                                behaviors: [
                                  new charts.DatumLegend(
                                    outsideJustification:
                                        charts.OutsideJustification.endDrawArea,
                                    horizontalFirst: false,
                                    desiredMaxRows: 2,
                                    cellPadding: new EdgeInsets.only(
                                        right: 4.0, bottom: 4.0),
                                    entryTextStyle: charts.TextStyleSpec(
                                        color: charts
                                            .MaterialPalette.purple.shadeDefault,
                                        fontFamily: "Montserrat",
                                        fontSize: 11),
                                  ),
                                ],
                                defaultRenderer: new charts.ArcRendererConfig(
                                    arcWidth: 50,
                                    arcRendererDecorators: [
                                      new charts.ArcLabelDecorator(
                                          labelPosition:
                                              charts.ArcLabelPosition.inside)
                                    ]),
                              ),
                            )
                          : Container()
                    ],
                  ))))),
        );
      }
    

    【讨论】:

    • 这是救命稻草,马恩!!非常感谢!
    • 有什么办法可以将此图表添加到所需宽度的容器中?
    • 以及如何减小这个展开的小部件的大小以使其适合我愿意附加的容器?
    • 我不确定,但请尝试关注。容器(固定高度或宽度)->列->扩展->图表。
    • 老兄!我试过了,但它不起作用。还有其他方法吗? :(
    猜你喜欢
    • 2013-08-18
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多