google / charts

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

TimeSeriesChart : PanAndZoomBehavior causing error #73

Open rtolar opened 6 years ago

rtolar commented 6 years ago

Moved from https://github.com/flutter/flutter/issues/19301

While attempting to figure out how to implement pan-and-zoom on a time series graph, I received the following error:

Performing hot reload... I/flutter ( 7381): ══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════ I/flutter ( 7381): The following assertion was thrown during performLayout(): I/flutter ( 7381): type 'int' is not a subtype of type 'double' I/flutter ( 7381): I/flutter ( 7381): Either the assertion indicates an error in the framework itself, or we should provide substantially I/flutter ( 7381): more information in this error message to help you determine and fix the underlying cause. I/flutter ( 7381): In either case, please report this assertion by filing a bug on GitHub: I/flutter ( 7381): https://github.com/flutter/flutter/issues/new I/flutter ( 7381): I/flutter ( 7381): When the exception was thrown, this was the stack: I/flutter ( 7381): #0 LinearScaleViewportSettings.updateViewportScaleFactor (package:charts_common/src/chart/cartesian/axis/linear/linear_scale_viewport.dart) I/flutter ( 7381): #1 LinearScale._configureScale (package:charts_common/src/chart/cartesian/axis/linear/linear_scale.dart:219:23) I/flutter ( 7381): #2 LinearScale.viewportDomain (package:charts_common/src/chart/cartesian/axis/linear/linear_scale.dart:145:5) I/flutter ( 7381): #3 DateTimeScale.viewportDomain (package:charts_common/src/chart/cartesian/axis/time/date_time_scale.dart:84:34) I/flutter ( 7381): #4 AutoAdjustingDateTimeTickProvider.getTicks (package:charts_common/src/chart/cartesian/axis/time/auto_adjusting_date_time_tick_provider.dart:117:28) I/flutter ( 7381): #5 PanningTickProvider.getTicks (package:charts_common/src/chart/common/behavior/zoom/panning_tick_provider.dart:74:29) I/flutter ( 7381): #6 Axis._updateProvidedTicks (package:charts_common/src/chart/cartesian/axis/axis.dart:196:35) I/flutter ( 7381): #7 Axis._measureHorizontalAxis (package:charts_common/src/chart/cartesian/axis/axis.dart:360:5) I/flutter ( 7381): #8 Axis.measure (package:charts_common/src/chart/cartesian/axis/axis.dart:347:11) I/flutter ( 7381): #9 HorizontalMarginStrategy.measure. (package:charts_common/src/chart/layout/layout_margin_strategy.dart:198:21) I/flutter ( 7381): #10 Iterable.forEach (dart:core/iterable.dart:281:30) I/flutter ( 7381): #11 HorizontalMarginStrategy.measure (package:charts_common/src/chart/layout/layout_margin_strategy.dart:180:11) I/flutter ( 7381): #12 LayoutManagerImpl._measure (package:charts_common/src/chart/layout/layout_manager_impl.dart:237:56) I/flutter ( 7381): #13 LayoutManagerImpl.measure (package:charts_common/src/chart/layout/layout_manager_impl.dart:100:24) I/flutter ( 7381): #14 BaseChart.measure (package:charts_common/src/chart/common/base_chart.dart:252:22) I/flutter ( 7381): #15 ChartContainerRenderObject.performLayout (package:charts_flutter/src/chart_container.dart:129:12) I/flutter ( 7381): #16 RenderObject.layout (package:flutter/src/rendering/object.dart:1570:7) I/flutter ( 7381): #17 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13) I/flutter ( 7381): #18 RenderObject.layout (package:flutter/src/rendering/object.dart:1570:7) I/flutter ( 7381): #19 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13) I/flutter ( 7381): #20 RenderObject.layout (package:flutter/src/rendering/object.dart:1570:7) I/flutter ( 7381): #21 MultiChildLayoutDelegate.layoutChild (package:flutter/src/rendering/custom_layout.dart:141:11) I/flutter ( 7381): #22 WidgetLayoutDelegate.performLayout (package:charts_flutter/src/widget_layout_delegate.dart:80:7) I/flutter ( 7381): #23 MultiChildLayoutDelegate._callPerformLayout (package:flutter/src/rendering/custom_layout.dart:211:7) I/flutter ( 7381): #24 RenderCustomMultiChildLayoutBox.performLayout (package:flutter/src/rendering/custom_layout.dart:355:14) I/flutter ( 7381): #25 RenderObject.layout (package:flutter/src/rendering/object.dart:1570:7) I/flutter ( 7381): #26 MultiChildLayoutDelegate.layoutChild (package:flutter/src/rendering/custom_layout.dart:141:11) I/flutter ( 7381): #27 _ScaffoldLayout.performLayout (package:flutter/src/material/scaffold.dart:399:7) I/flutter ( 7381): #28 MultiChildLayoutDelegate._callPerformLayout (package:flutter/src/rendering/custom_layout.dart:211:7) I/flutter ( 7381): #29 RenderCustomMultiChildLayoutBox.performLayout (package:flutter/src/rendering/custom_layout.dart:355:14) I/flutter ( 7381): #30 RenderObject.layout (package:flutter/src/rendering/object.dart:1570:7) I/flutter ( 7381): #31 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13) I/flutter ( 7381): #32 RenderObject.layout (package:flutter/src/rendering/object.dart:1570:7) I/flutter ( 7381): #33 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13) I/flutter ( 7381): #34 _RenderCustomClip.performLayout (package:flutter/src/rendering/proxy_box.dart:1143:11) I/flutter ( 7381): #35 RenderObject.layout (package:flutter/src/rendering/object.dart:1570:7) I/flutter ( 7381): #36 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13) I/flutter ( 7381): #37 RenderObject.layout (package:flutter/src/rendering/object.dart:1570:7) I/flutter ( 7381): #38 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13) I/flutter ( 7381): #39 RenderObject.layout (package:flutter/src/rendering/object.dart:1570:7) I/flutter ( 7381): #40 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13) I/flutter ( 7381): #41 RenderObject.layout (package:flutter/src/rendering/object.dart:1570:7) I/flutter ( 7381): #42 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13) I/flutter ( 7381): #43 RenderObject.layout (package:flutter/src/rendering/object.dart:1570:7) I/flutter ( 7381): #44 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13) I/flutter ( 7381): #45 RenderObject.layout (package:flutter/src/rendering/object.dart:1570:7) I/flutter ( 7381): #46 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13) I/flutter ( 7381): #47 RenderObject.layout (package:flutter/src/rendering/object.dart:1570:7) I/flutter ( 7381): #48 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13) I/flutter ( 7381): #49 RenderObject.layout (package:flutter/src/rendering/object.dart:1570:7) I/flutter ( 7381): #50 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13) I/flutter ( 7381): #51 RenderOffstage.performLayout (package:flutter/src/rendering/proxy_box.dart:2831:13) I/flutter ( 7381): #52 RenderObject.layout (package:flutter/src/rendering/object.dart:1570:7) I/flutter ( 7381): #53 RenderStack.performLayout (package:flutter/src/rendering/stack.dart:520:15) I/flutter ( 7381): #54 RenderObject.layout (package:flutter/src/rendering/object.dart:1570:7) I/flutter ( 7381): #55 __RenderTheatre&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13) I/flutter ( 7381): #56 RenderObject.layout (package:flutter/src/rendering/object.dart:1570:7) I/flutter ( 7381): #57 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13) I/flutter ( 7381): #58 RenderObject.layout (package:flutter/src/rendering/object.dart:1570:7) I/flutter ( 7381): #59 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13) I/flutter ( 7381): #60 RenderObject.layout (package:flutter/src/rendering/object.dart:1570:7) I/flutter ( 7381): #61 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13) I/flutter ( 7381): #62 RenderObject.layout (package:flutter/src/rendering/object.dart:1570:7) I/flutter ( 7381): #63 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13) I/flutter ( 7381): #64 RenderObject.layout (package:flutter/src/rendering/object.dart:1570:7) I/flutter ( 7381): #65 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13) I/flutter ( 7381): #66 RenderObject.layout (package:flutter/src/rendering/object.dart:1570:7) I/flutter ( 7381): #67 RenderView.performLayout (package:flutter/src/rendering/view.dart:125:13) I/flutter ( 7381): #68 RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1445:7) I/flutter ( 7381): #69 PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:709:18) I/flutter ( 7381): #70 _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:270:19) I/flutter ( 7381): #71 _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:627:13) I/flutter ( 7381): #72 _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:208:5) I/flutter ( 7381): #73 _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:990:15) I/flutter ( 7381): #74 _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:930:9) I/flutter ( 7381): #75 _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.scheduleWarmUpFrame. (package:flutter/src/scheduler/binding.dart:751:7) I/flutter ( 7381): #77 _Timer._runTimers (dart:isolate/runtime/libtimer_impl.dart:382:19) I/flutter ( 7381): #78 _Timer._handleMessage (dart:isolate/runtime/libtimer_impl.dart:416:5) I/flutter ( 7381): #79 _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:165:12) I/flutter ( 7381): (elided one frame from package dart:async) I/flutter ( 7381): I/flutter ( 7381): The following RenderObject was being processed when the exception was fired: I/flutter ( 7381): ChartContainerRenderObject#1c86c NEEDS-LAYOUT NEEDS-PAINT I/flutter ( 7381): creator: ChartContainer ← Listener ← _GestureSemantics ← RawGestureDetector ← I/flutter ( 7381): GestureDetector ← LayoutId-[] ← CustomMultiChildLayout ← TimeSeriesChart ← I/flutter ( 7381): SimpleTimeSeriesChart ← MediaQuery ← LayoutId-[<_ScaffoldSlot.body>] ← CustomMultiChildLayout ← ⋯ I/flutter ( 7381): parentData: (can use size) I/flutter ( 7381): constraints: BoxConstraints(w=411.4, h=603.4) I/flutter ( 7381): semantic boundary I/flutter ( 7381): size: Size(411.4, 603.4) I/flutter ( 7381): This RenderObject has no descendants. I/flutter ( 7381): ════════════════════════════════════════════════════════════════════════════════════════════════════ Reloaded 2 of 608 libraries in 1,518ms. /// Timeseries chart example import 'package:charts_flutter/flutter.dart' as charts; import 'package:flutter/material.dart';

class SimpleTimeSeriesChart extends StatelessWidget { final List seriesList; final bool animate;

//SimpleTimeSeriesChart(this.seriesList, {this.animate}); SimpleTimeSeriesChart(this.seriesList, {this.animate}); /// Creates a [TimeSeriesChart] with sample data and no transition. factory SimpleTimeSeriesChart.withSampleData() { return new SimpleTimeSeriesChart( _createSampleData(), // Disable animations for image tests. animate: true, ); }

@override Widget build(BuildContext context) {

var c =  charts.TimeSeriesChart(
  seriesList,
  animate: animate,
  // Optionally pass in a [DateTimeFactory] used by the chart. The factory
  // should create the same type of [DateTime] as the data provided. If none
  // specified, the default creates local date time.
  dateTimeFactory: const charts.LocalDateTimeFactory(),
  //domainAxis: new charts.OrdinalAxisSpec(viewport: new charts.OrdinalViewport((new DateTime(2017, 9, 19)).toString(), 4)),
  domainAxis: new charts.DateTimeAxisSpec(viewport: new charts.DateTimeExtents(start: new DateTime(2017, 9, 19), end: new DateTime(2017, 9, 20))),

// LINE CAUSING THE ERROR BELOW behaviors: [new charts.PanAndZoomBehavior()], );

return c;

}

/// Create one series with sample hard coded data. static List<charts.Series<XYValue, DateTime>> _createSampleData() { final data = [ new XYValue(new DateTime(2017, 9, 19), 5), new XYValue(new DateTime(2017, 9, 26), 25), new XYValue(new DateTime(2017, 9, 28), 26), new XYValue(new DateTime(2017, 10, 3), 100), new XYValue(new DateTime(2017, 10, 10), 75), ];

return [
  new charts.Series<XYValue, DateTime>(
    id: 'Sales',
    colorFn: (_, __) => charts.MaterialPalette.blue.shadeDefault,
    domainFn: (XYValue datapoints, _) => datapoints.time,
    measureFn: (XYValue datapoints, _) => datapoints.value,
    data: data,
    strokeWidthPxFn: (XYValue datapoints, _) => 5,
    //domainLowerBoundFn: (_, __) => new DateTime(2017, 8, 1),
    //domainUpperBoundFn: (_, __) => new DateTime(2017, 11, 1),

  )
];

} }

/// Sample time series data type. class XYValue { final DateTime time; final int value;

XYValue(this.time, this.value); }

jerherrero commented 5 years ago

Does commenting out domainAxis: new charts.DateTimeAxisSpec(... bring back PanAndZoomBehavior()?

oetiker commented 5 years ago

Does commenting out domainAxis: new charts.DateTimeAxisSpec(... bring back PanAndZoomBehavior()?

for me it does NOT @jerherrero any idea ?

jerherrero commented 5 years ago

@oetiker It's been a while since I've dug in there, but as I remember, each axis type had its own class except for the one used for a Time Series, which is an extension of another axis class.

oetiker commented 5 years ago

@jerherrero I found the solution here: https://github.com/google/charts/issues/287#issuecomment-521999694