Welcome to the Flutter feedback portal. We’re happy you’re here! If you have feedback on how to improve the Flutter, we’d love to hear it!

  • Check out the features or bugs others have reported and vote on your favorites. Feedback will be prioritized based on popularity.
  • If you have feedback that’s not listed yet, submit your own.

Thanks for joining our community and helping improve Syncfusion products!

2
Votes

Axis object should be able to set the range of zoomFactor to avoid user "over-zoom".


Also, there is a bug related to this feature.

When zoom is enabled, a UnsupportedError will be thrown if user keep zooming in until zoomFactor = 0.


══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════

The following UnsupportedError was thrown building LayoutBuilder:

Unsupported operation: Infinity or NaN toInt


The relevant error-causing widget was:

  SfCartesianChart lib/main.dart:32:13


When the exception was thrown, this was the stack:

#0 double.toInt (dart:core-patch/double.dart:192:36)

#1 double.floor (dart:core-patch/double.dart:161:34)

#2 DateTimeAxis._alignRangeStart (package:syncfusion_flutter_charts/src/chart/axis/datetime_axis.dart:496:43)

#3 DateTimeAxis.generateVisibleLabels (package:syncfusion_flutter_charts/src/chart/axis/datetime_axis.dart:416:16)

#4 DateTimeAxis._calculateRangeAndInterval (package:syncfusion_flutter_charts/src/chart/axis/datetime_axis.dart:271:9)

#5 _calculateYRangeOnZoomX (package:syncfusion_flutter_charts/src/chart/utils/helper.dart:2853:11)

#6 NumericAxis._calculateActualRange (package:syncfusion_flutter_charts/src/chart/axis/numeric_axis.dart:309:22)

#7 NumericAxis._calculateRangeAndInterval (package:syncfusion_flutter_charts/src/chart/axis/numeric_axis.dart:287:5)

#8 _ChartAxis._measureAxesBounds (package:syncfusion_flutter_charts/src/chart/axis/axis_panel.dart:105:14)

#9 _ContainerArea._calculateBounds (package:syncfusion_flutter_charts/src/chart/base/chart_base.dart:1765:23)

#10 _ContainerArea._initializeChart (package:syncfusion_flutter_charts/src/chart/base/chart_base.dart:1747:5)

#11 _ContainerArea.build. (package:syncfusion_flutter_charts/src/chart/base/chart_base.dart:1738:22)

#12 _LayoutBuilderElement._layout. (package:flutter/src/widgets/layout_builder.dart:121:33)

#13 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2620:19)

#14 _LayoutBuilderElement._layout (package:flutter/src/widgets/layout_builder.dart:117:11)

#15 RenderObject.invokeLayoutCallback. (package:flutter/src/rendering/object.dart:1868:58)

#16 PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:920:15)

#17 RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:1868:13)

#18 RenderConstrainedLayoutBuilder.rebuildIfNecessary (package:flutter/src/widgets/layout_builder.dart:226:7)

#19 _RenderLayoutBuilder.performLayout (package:flutter/src/widgets/layout_builder.dart:299:5)

#20 RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1632:7)

#21 PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:889:18)

#22 RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:404:19)

#23 WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:867:13)

#24 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:286:5)

#25 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1117:15)

#26 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1056:9)

#27 SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:972:5)

#31 _invoke (dart:ui/hooks.dart:253:10)

#32 _drawFrame (dart:ui/hooks.dart:211:3)

(elided 3 frames from dart:async)


════════════════════════════════════════════════════════════════════════════════════════════════════


mport 'dart:async';

import 'package:flutter/material.dart';
import 'package:syncfusion_flutter_charts/charts.dart';
import 'package:intl/intl.dart';

void main() {
runApp(MaterialApp(
home: TestPage(),
));
}

class TestPage extends StatefulWidget {
@override
_TestPageState createState() => _TestPageState();
}

class _TestPageState extends State<TestPage> {
Future future;

@override
void initState() {
super.initState();
future = Future.delayed(Duration(seconds: 1));
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: SfCartesianChart(
series: [
LineSeries<Datum, DateTime>(
dataSource: [
Datum(DateTime(2020, 7, 1), 3),
Datum(DateTime(2020, 7, 2), 1),
Datum(DateTime(2020, 7, 3), 4),
Datum(DateTime(2020, 7, 4), 8),
Datum(DateTime(2020, 7, 5), 5),
Datum(DateTime(2020, 7, 6), 1),
Datum(DateTime(2020, 7, 7), 3),
Datum(DateTime(2020, 7, 8), 7),
Datum(DateTime(2020, 7, 9), 2),
],
xValueMapper: (Datum datum, _) => datum.x,
yValueMapper: (Datum datum, _) => datum.y,
markerSettings: MarkerSettings(
isVisible: true,
),
),
],
primaryXAxis: DateTimeAxis(
dateFormat: DateFormat.Md().add_Hm(),
),
zoomPanBehavior: ZoomPanBehavior(
enablePanning: true,
enablePinching: true,
zoomMode: ZoomMode.x,
),
),
);
}
}

class Datum {
DateTime x;
num y;

Datum(this.x, this.y);
}