google / charts

https://pub.dev/packages/charts_flutter
Apache License 2.0
2.81k stars 1.22k forks source link

Exception when reusing series and refreshing quicker than once per second #219

Open FineTillYouCameAlong opened 5 years ago

FineTillYouCameAlong commented 5 years ago

Steps to Reproduce

Here's the code and the exception is thrown when the button is tapped quickly (it calls setState() so when the build function is run too frequently).

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

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Charts bug',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class ClicksPerYear {
  final DateTime year;
  final int clicks;
  final charts.Color color;

  ClicksPerYear(this.year, this.clicks, Color color)
      : this.color = new charts.Color(
      r: color.red, g: color.green, b: color.blue, a: color.alpha);
}

getSeries() {
  if (oldSeries!=null) return oldSeries;

  var data = [
    new ClicksPerYear(DateTime(2017), 12, Colors.red),
    new ClicksPerYear(DateTime(2018), 42, Colors.yellow),
    new ClicksPerYear(DateTime(2019), 80, Colors.green),
  ];
  var data2 = [
    new ClicksPerYear(DateTime(2017), 6, Colors.red),
    new ClicksPerYear(DateTime(2018), 21, Colors.yellow),
    new ClicksPerYear(DateTime(2019), 40, Colors.green),
  ];

  var newSeries = [
    new charts.Series(
      domainFn: (ClicksPerYear clickData, _) => clickData.year,
      measureFn: (ClicksPerYear clickData, _) => clickData.clicks,
      colorFn: (ClicksPerYear clickData, _) => clickData.color,
      id: 'Clicks',
      data: data,
    ),
    new charts.Series(
      domainFn: (ClicksPerYear clickData, _) => clickData.year,
      measureFn: (ClicksPerYear clickData, _) => clickData.clicks,
      colorFn: (ClicksPerYear clickData, _) => clickData.color,
      id: 'Clicks line',
      data: data2,
    )..setAttribute(charts.rendererIdKey, "line2"),
  ];
  oldSeries = newSeries;
  return newSeries;
}

var oldSeries;

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: new Center(
        child: new Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            SizedBox(
              height: 200.0,
              child: charts.TimeSeriesChart(
                getSeries(),
                animate: false,
                defaultRenderer: new charts.BarRendererConfig(),
                customSeriesRenderers: [
                  new charts.LineRendererConfig(
                      customRendererId: 'line2'
                  )
                ],
              ),
            ),
            RaisedButton(child: Text('TAP THIS QUICKLY'), onPressed: () {
              setState(() {});
            },)
          ],
        ),
      ),
    );
  }
}

The problem disappears when the second series is removed or when it doesn't use the line renderer or when the line if (oldSeries!=null) return oldSeries; is removed.

Logs

I/flutter (18276): ══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════
I/flutter (18276): The following assertion was thrown during paint():
I/flutter (18276): 'package:charts_common/src/chart/layout/layout_manager_impl.dart': Failed assertion: line 115 pos
I/flutter (18276): 12: '_drawAreaBoundsOutdated == false': is not true.
I/flutter (18276): Either the assertion indicates an error in the framework itself, or we should provide substantially
I/flutter (18276): more information in this error message to help you determine and fix the underlying cause.
I/flutter (18276): In either case, please report this assertion by filing a bug on GitHub:
I/flutter (18276):   https://github.com/flutter/flutter/issues/new?template=BUG.md
I/flutter (18276): When the exception was thrown, this was the stack:
I/flutter (18276): #2      LayoutManagerImpl.drawableLayoutAreaBounds (package:charts_common/src/chart/layout/layout_manager_impl.dart:115:12)
I/flutter (18276): #3      BaseChart.drawableLayoutAreaBounds (package:charts_common/src/chart/common/base_chart.dart:414:22)
I/flutter (18276): #4      _LinePointLayoutView.paint (package:charts_common/src/chart/common/behavior/line_point_highlighter.dart:418:30)
I/flutter (18276): #5      BaseChart.paint.<anonymous closure> (package:charts_common/src/chart/common/base_chart.dart:579:12)
I/flutter (18276): #6      List.forEach (dart:core/runtime/libgrowable_array.dart:278:8)
I/flutter (18276): #7      BaseChart.paint (package:charts_common/src/chart/common/base_chart.dart:577:38)
I/flutter (18276): #8      ChartContainerCustomPaint.paint (package:charts_flutter/src/chart_container.dart:381:11)
I/flutter (18276): #9      RenderCustomPaint._paintWithPainter (package:flutter/src/rendering/custom_paint.dart:521:13)
I/flutter (18276): #10     RenderCustomPaint.paint (package:flutter/src/rendering/custom_paint.dart:559:7)
I/flutter (18276): #11     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2092:7)
I/flutter (18276): #12     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:173:13)
I/flutter (18276): #13     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:123:15)
I/flutter (18276): #14     RenderPointerListener.paint (package:flutter/src/rendering/proxy_box.dart:2629:11)
I/flutter (18276): #15     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2092:7)
I/flutter (18276): #16     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:173:13)
I/flutter (18276): #17     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:123:15)
I/flutter (18276): #18     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2092:7)
I/flutter (18276): #19     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:173:13)
I/flutter (18276): #20     _RenderCustomMultiChildLayoutBox&RenderBox&ContainerRenderObjectMixin&RenderBoxContainerDefaultsMixin.defaultPaint (package:flutter/src/rendering/box.dart:2273:15)
I/flutter (18276): #21     RenderCustomMultiChildLayoutBox.paint (package:flutter/src/rendering/custom_layout.dart:361:5)
I/flutter (18276): #22     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2092:7)
I/flutter (18276): #23     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:173:13)
I/flutter (18276): #24     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:123:15)
I/flutter (18276): #25     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2092:7)
I/flutter (18276): #26     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:173:13)
I/flutter (18276): #27     _RenderFlex&RenderBox&ContainerRenderObjectMixin&RenderBoxContainerDefaultsMixin.defaultPaint (package:flutter/src/rendering/box.dart:2273:15)
I/flutter (18276): #28     RenderFlex.paint (package:flutter/src/rendering/flex.dart:931:7)
I/flutter (18276): #29     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2092:7)
I/flutter (18276): #30     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:173:13)
I/flutter (18276): #31     RenderShiftedBox.paint (package:flutter/src/rendering/shifted_box.dart:70:15)
I/flutter (18276): #32     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2092:7)
I/flutter (18276): #33     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:173:13)
I/flutter (18276): #34     _RenderCustomMultiChildLayoutBox&RenderBox&ContainerRenderObjectMixin&RenderBoxContainerDefaultsMixin.defaultPaint (package:flutter/src/rendering/box.dart:2273:15)
I/flutter (18276): #35     RenderCustomMultiChildLayoutBox.paint (package:flutter/src/rendering/custom_layout.dart:361:5)
I/flutter (18276): #36     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2092:7)
I/flutter (18276): #37     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:173:13)
I/flutter (18276): #38     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:123:15)
I/flutter (18276): #39     _RenderInkFeatures.paint (package:flutter/src/material/material.dart:504:11)
I/flutter (18276): #40     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2092:7)
I/flutter (18276): #41     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:173:13)
I/flutter (18276): #42     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:123:15)
I/flutter (18276): #43     RenderPhysicalModel.paint.<anonymous closure> (package:flutter/src/rendering/proxy_box.dart:1737:88)
I/flutter (18276): #44     ClipContext._clipAndPaint (package:flutter/src/painting/clip.dart:29:12)
I/flutter (18276): #45     ClipContext.clipRRectAndPaint (package:flutter/src/painting/clip.dart:49:5)
I/flutter (18276): #46     RenderPhysicalModel.paint (package:flutter/src/rendering/proxy_box.dart:1737:17)
I/flutter (18276): #47     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2092:7)
I/flutter (18276): #48     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:173:13)
I/flutter (18276): #49     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:123:15)
I/flutter (18276): #50     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2092:7)
I/flutter (18276): #51     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:173:13)
I/flutter (18276): #52     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:123:15)
I/flutter (18276): #53     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2092:7)
I/flutter (18276): #54     PaintingContext._repaintCompositedChild (package:flutter/src/rendering/object.dart:128:11)
I/flutter (18276): #55     PaintingContext.repaintCompositedChild (package:flutter/src/rendering/object.dart:96:5)
I/flutter (18276): #56     PipelineOwner.flushPaint (package:flutter/src/rendering/object.dart:853:29)
I/flutter (18276): #57     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:331:19)
I/flutter (18276): #58     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:701:13)
I/flutter (18276): #59     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:268:5)
I/flutter (18276): #60     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:988:15)
I/flutter (18276): #61     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:928:9)
I/flutter (18276): #62     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:840:5)
I/flutter (18276): #66     _invoke (dart:ui/hooks.dart:209:10)
I/flutter (18276): #67     _drawFrame (dart:ui/hooks.dart:168:3)
I/flutter (18276): (elided 5 frames from class _AssertionError and package dart:async)
I/flutter (18276): The following RenderObject was being processed when the exception was fired:
I/flutter (18276):   ChartContainerRenderObject<DateTime>#cae6d
I/flutter (18276):   creator: ChartContainer<DateTime> ← Listener ← _GestureSemantics ← RawGestureDetector ←
I/flutter (18276):   GestureDetector ← LayoutId-[<chartContainer>] ← CustomMultiChildLayout ← TimeSeriesChart ←
I/flutter (18276):   SizedBox ← Column ← Center ← MediaQuery ← ⋯
I/flutter (18276):   parentData: <none> (can use size)
I/flutter (18276):   constraints: BoxConstraints(w=384.0, h=200.0)
I/flutter (18276):   semantic boundary
I/flutter (18276):   size: Size(384.0, 200.0)
I/flutter (18276): This RenderObject has no descendants.

flutter_analyze output:

Analyzing charts_test...
No issues found! (ran in 1.6s)

flutter_doctor output:

[√] Flutter (Channel stable, v1.2.1, on Microsoft Windows [Version 10.0.17763.316], locale en-US)
    • Flutter version 1.2.1 at C:\flutter
    • Framework revision 8661d8aecd (4 weeks ago), 2019-02-14 19:19:53 -0800
    • Engine revision 3757390fa4
    • Dart version 2.1.2 (build 2.1.2-dev.0.0 0a7dcf17eb)

[√] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
    • Android SDK at c:\Android/sdk
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform android-28, build-tools 28.0.3
    • Java binary at: C:\Program Files\Android\Android Studio\jre\bin\java
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1248-b01)
    • All Android licenses accepted.

[√] Android Studio (version 3.3)
    • Android Studio at C:\Program Files\Android\Android Studio
    • Flutter plugin version 33.3.1
    • Dart plugin version 182.5215
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1248-b01)

[!] VS Code (version 1.26.0)
    • VS Code at C:\Users\Work OS\AppData\Local\Programs\Microsoft VS Code
    X Flutter extension not installed; install from
      https://marketplace.visualstudio.com/items?itemName=Dart-Code.flutter

[!] VS Code, 64-bit edition (version 1.26.0)
    • VS Code at C:\Program Files\Microsoft VS Code
    X Flutter extension not installed; install from
      https://marketplace.visualstudio.com/items?itemName=Dart-Code.flutter

[√] Connected device (1 available)
    • Android SDK built for x86 • emulator-5556 • android-x86 • Android 9 (API 28) (emulator)

! Doctor found issues in 2 categories.
Basher7 commented 4 years ago

same error in my project

════════ Exception caught by rendering library ═════════════════════════════════
'package:charts_common/src/chart/layout/layout_manager_impl.dart': Failed assertion: line 115 pos 12: '_drawAreaBoundsOutdated == false': is not true.
User-created ancestor of the error-causing widget was
    TimeSeriesChart 
lib\…\home_pages\dashboard.dart:1624