juliansteenbakker / community_charts

This project is a fork of google/charts.
Apache License 2.0
84 stars 34 forks source link

Fix multiple null exceptions when tapping on bar graph rapidly #25

Open jasaw opened 3 months ago

jasaw commented 3 months ago

When tapping on bar graph rapidly, there is a race condition between bar selection and graph rendering, causing null exceptions at various places.

This is one of the exceptions:


-------- Exception caught by rendering library ---------------------------------
The following _TypeError was thrown during performLayout():
Null check operator used on a null value

The relevant error-causing widget was:
    OrdinalComboChart OrdinalComboChart:file:///E:/work/app/lib/screens/stat_chart.dart:485:18

When the exception was thrown, this was the stack:
#0      BarRenderer.addPositionToDetailsForSeriesDatum (package:community_charts_common/src/chart/bar/bar_renderer.dart:89:59)
bar_renderer.dart:89
#1      BaseSeriesRenderer.getDetailsForSeriesDatum (package:community_charts_common/src/chart/common/series_renderer.dart:402:12)
series_renderer.dart:402
#2      BaseChart.getSelectedDatumDetails (package:community_charts_common/src/chart/common/base_chart.dart:318:41)
base_chart.dart:318
#3      LinePointHighlighter._updateViewData (package:community_charts_common/src/chart/common/behavior/line_point_highlighter.dart:198:16)
line_point_highlighter.dart:198
#4      BaseChart.fireOnAxisConfigured.<anonymous closure> (package:community_charts_common/src/chart/common/base_chart.dart:686:34)
base_chart.dart:686
#5      List.forEach (dart:core-patch/growable_array.dart:416:8)
growable_array.dart:416
#6      BaseChart.fireOnAxisConfigured (package:community_charts_common/src/chart/common/base_chart.dart:685:25)
base_chart.dart:685
#7      CartesianChart.onPostLayout (package:community_charts_common/src/chart/cartesian/cartesian_chart.dart:491:5)
cartesian_chart.dart:491
#8      BaseChart.layout (package:community_charts_common/src/chart/common/base_chart.dart:441:7)
base_chart.dart:441
#9      ChartContainerRenderObject.performLayout (package:community_charts_flutter/src/chart_container.dart:171:13)
chart_container.dart:171
#10     RenderObject.layout (package:flutter/src/rendering/object.dart:2577:7)
object.dart:2577
#11     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:21)
proxy_box.dart:105
#12     RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:2416:7)
object.dart:2416
#13     PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:1051:18)
object.dart:1051
#14     PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:1064:15)
object.dart:1064
#15     RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:577:23)
binding.dart:577
#16     WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:1138:13)
binding.dart:1138
#17     RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:443:5)
binding.dart:443
#18     SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1392:15)
binding.dart:1392
#19     SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1313:9)
binding.dart:1313
#20     SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:1171:5)
binding.dart:1171
#21     _invoke (dart:ui/hooks.dart:312:13)
hooks.dart:312
#22     PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:419:5)
platform_dispatcher.dart:419
#23     _drawFrame (dart:ui/hooks.dart:283:31)
hooks.dart:283

The following RenderObject was being processed when the exception was fired: ChartContainerRenderObject<String>#db013 NEEDS-LAYOUT NEEDS-PAINT
    parentData: <none> (can use size)
    constraints: BoxConstraints(w=324.0, h=201.1)
    semantic boundary
    size: Size(324.0, 201.1)
    painter: ChartContainerCustomPaint#33163()
RenderObject: ChartContainerRenderObject<String>#db013 NEEDS-LAYOUT NEEDS-PAINT
    parentData: <none> (can use size)
    constraints: BoxConstraints(w=324.0, h=201.1)
    semantic boundary
    size: Size(324.0, 201.1)
    painter: ChartContainerCustomPaint#33163()
--------------------------------------------------------------------------------