From 10673fafe89b3a7e8b885601536ce8c3b8e73907 Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sat, 26 Aug 2023 18:09:34 +0200 Subject: [PATCH 001/149] Add draggable logic for LineChart --- .../base/axis_chart/axis_chart_painter.dart | 19 ++++++++++ lib/src/chart/line_chart/line_chart.dart | 38 ++++++++++++++++++- lib/src/chart/line_chart/line_chart_data.dart | 8 ++++ .../chart/line_chart/line_chart_painter.dart | 8 ++++ 4 files changed, 71 insertions(+), 2 deletions(-) diff --git a/lib/src/chart/base/axis_chart/axis_chart_painter.dart b/lib/src/chart/base/axis_chart/axis_chart_painter.dart index 610e0dac5..46967ccf8 100644 --- a/lib/src/chart/base/axis_chart/axis_chart_painter.dart +++ b/lib/src/chart/base/axis_chart/axis_chart_painter.dart @@ -410,6 +410,25 @@ abstract class AxisChartPainter return viewSize.height - (((spotY - data.minY) / deltaY) * viewSize.height); } + /// Function converts pixelX and pixelY to the [FlSpot], + /// reversed logic of [getPixelY] and [getPixelX] + FlSpot getTouchedCoordinates( + double pixelX, + double pixelY, + Size viewSize, + PaintHolder holder, + ) { + final data = holder.data; + final deltaY = data.maxY - data.minY; + final deltaX = data.maxX - data.minX; + + final x = ((pixelX * deltaX) / viewSize.width) + data.minX; + final y = + ((viewSize.height - pixelY) * deltaY) / viewSize.height + data.minY; + + return FlSpot(x, y); + } + /// With this function we can get horizontal /// position for the tooltip. double getTooltipLeft( diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index cee6c9d60..3c6c3bdcb 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -44,6 +44,22 @@ class _LineChartState extends AnimatedWidgetBaseState { final Map> _showingTouchedIndicators = {}; + List _lineBarsData = []; + + @override + void initState() { + _lineBarsData = widget.data.lineBarsData; + super.initState(); + } + + @override + void didUpdateWidget(covariant LineChart oldWidget) { + if (widget.data.lineBarsData != _lineBarsData) { + _lineBarsData = widget.data.lineBarsData; + } + super.didUpdateWidget(oldWidget); + } + @override Widget build(BuildContext context) { final showingData = _getData(); @@ -80,11 +96,13 @@ class _LineChartState extends AnimatedWidgetBaseState { if (lineTouchData.enabled && lineTouchData.handleBuiltInTouches) { _providedTouchCallback = lineTouchData.touchCallback; return widget.data.copyWith( + lineBarsData: _lineBarsData, lineTouchData: widget.data.lineTouchData .copyWith(touchCallback: _handleBuiltInTouch), ); } - return widget.data; + + return widget.data.copyWith(lineBarsData: _lineBarsData); } void _handleBuiltInTouch( @@ -94,8 +112,8 @@ class _LineChartState extends AnimatedWidgetBaseState { if (!mounted) { return; } - _providedTouchCallback?.call(event, touchResponse); + _providedTouchCallback?.call(event, touchResponse); if (!event.isInterestedForInteractions || touchResponse?.lineBarSpots == null || touchResponse!.lineBarSpots!.isEmpty) { @@ -121,6 +139,22 @@ class _LineChartState extends AnimatedWidgetBaseState { ..clear() ..add(ShowingTooltipIndicators(sortedLineSpots)); }); + + if (event is FlPanStartEvent || event is FlPanUpdateEvent) { + final barIndex = touchResponse.lineBarSpots?.first.barIndex; + final spotIndex = touchResponse.lineBarSpots?.first.spotIndex; + final newDataSpot = touchResponse.lineBarSpots?.first.touchedAxesPoint; + + if (spotIndex != null && newDataSpot != null && barIndex != null) { + final isDraggable = widget.data.lineBarsData[barIndex].isDraggable; + + if (isDraggable) { + setState(() { + _lineBarsData[barIndex].spots[spotIndex] = newDataSpot; + }); + } + } + } } @override diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index 6c2b7d18f..2b0a4a7fa 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -246,6 +246,7 @@ class LineChartBarData with EquatableMixin { this.shadow = const Shadow(color: Colors.transparent), this.isStepLineChart = false, this.lineChartStepData = const LineChartStepData(), + this.isDraggable = false, }) : color = color ?? ((color == null && gradient == null) ? Colors.cyan : null), belowBarData = belowBarData ?? BarAreaData(), @@ -311,6 +312,9 @@ class LineChartBarData with EquatableMixin { /// Determines to show or hide the line. final bool show; + /// Determines if spots are draggable + final bool isDraggable; + /// If provided, this [LineChartBarData] draws with this [color] /// Otherwise we use [gradient] to draw the background. /// It throws an exception if you provide both [color] and [gradient] @@ -1376,10 +1380,14 @@ class TouchLineBarSpot extends LineBarSpot { super.barIndex, super.spot, this.distance, + this.touchedAxesPoint, ); /// Distance in pixels from where the user taped final double distance; + + /// Position in spots' values converted from local position + final FlSpot touchedAxesPoint; } /// Holds data of showing each row item in the tooltip popup. diff --git a/lib/src/chart/line_chart/line_chart_painter.dart b/lib/src/chart/line_chart/line_chart_painter.dart index 3cc5a6060..c6acdaf07 100644 --- a/lib/src/chart/line_chart/line_chart_painter.dart +++ b/lib/src/chart/line_chart/line_chart_painter.dart @@ -1233,6 +1233,13 @@ class LineChartPainter extends AxisChartPainter { return null; } + final axesPoint = getTouchedCoordinates( + touchedPoint.dx, + touchedPoint.dy, + viewSize, + holder, + ); + /// Find the nearest spot (based on distanceCalculator) final sortedSpots = []; double? smallestDistance; @@ -1264,6 +1271,7 @@ class LineChartPainter extends AxisChartPainter { barDataPosition, sortedSpots.first, smallestDistance!, + axesPoint, ); } else { return null; From b0d0cedb329f5fce827c894caaca2b1276198e8d Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sat, 26 Aug 2023 20:41:27 +0200 Subject: [PATCH 002/149] Remake logic of updating spot's position and adjust tests --- lib/src/chart/line_chart/line_chart.dart | 39 ++- lib/src/chart/line_chart/line_chart_data.dart | 29 +- .../chart/line_chart/line_chart_painter.dart | 23 +- .../chart/line_chart/line_chart_renderer.dart | 4 +- .../bar_chart_painter_test.mocks.dart | 2 +- .../bar_chart_renderer_test.mocks.dart | 150 ++++++---- test/chart/data_pool.dart | 20 +- .../line_chart/line_chart_painter_test.dart | 32 ++- .../line_chart_painter_test.mocks.dart | 258 ++++++++++------- .../line_chart/line_chart_renderer_test.dart | 2 +- .../line_chart_renderer_test.mocks.dart | 266 +++++++++++------- .../pie_chart_painter_test.mocks.dart | 2 +- .../pie_chart_renderer_test.mocks.dart | 2 +- .../radar_chart_painter_test.mocks.dart | 2 +- .../radar_chart_renderer_test.mocks.dart | 2 +- .../scatter_chart_painter_test.mocks.dart | 2 +- .../scatter_chart_renderer_test.mocks.dart | 134 +++++---- test/utils/canvas_wrapper_test.mocks.dart | 2 +- test/utils/utils_test.mocks.dart | 2 +- 19 files changed, 616 insertions(+), 357 deletions(-) diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index 3c6c3bdcb..82a601469 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -46,16 +46,22 @@ class _LineChartState extends AnimatedWidgetBaseState { List _lineBarsData = []; + /// Keeps index of bar and spot that currently is being dragging + (int barIndex, int spotIndex)? _draggingSpotIndexes; + + bool get _isAnyDraggable => + _lineBarsData.indexWhere((lineBarData) => lineBarData.isDraggable) != -1; + @override void initState() { - _lineBarsData = widget.data.lineBarsData; + _lineBarsData = List.from(widget.data.lineBarsData); super.initState(); } @override void didUpdateWidget(covariant LineChart oldWidget) { if (widget.data.lineBarsData != _lineBarsData) { - _lineBarsData = widget.data.lineBarsData; + _lineBarsData = List.from(widget.data.lineBarsData); } super.didUpdateWidget(oldWidget); } @@ -97,12 +103,14 @@ class _LineChartState extends AnimatedWidgetBaseState { _providedTouchCallback = lineTouchData.touchCallback; return widget.data.copyWith( lineBarsData: _lineBarsData, - lineTouchData: widget.data.lineTouchData - .copyWith(touchCallback: _handleBuiltInTouch), + lineTouchData: widget.data.lineTouchData.copyWith( + touchCallback: _handleBuiltInTouch, + distanceCalculator: _isAnyDraggable ? vectorDistanceCalculator : null, + ), ); } - return widget.data.copyWith(lineBarsData: _lineBarsData); + return widget.data; } void _handleBuiltInTouch( @@ -113,6 +121,20 @@ class _LineChartState extends AnimatedWidgetBaseState { return; } + if (event is FlPanEndEvent || event is FlLongPressEnd) { + setState(() { + _draggingSpotIndexes = null; + }); + } + + if (_draggingSpotIndexes != null) { + setState(() { + final (barIndex, spotIndex) = _draggingSpotIndexes!; + _lineBarsData[barIndex].spots[spotIndex] = + touchResponse!.touchedAxesPoint!; + }); + } + _providedTouchCallback?.call(event, touchResponse); if (!event.isInterestedForInteractions || touchResponse?.lineBarSpots == null || @@ -140,17 +162,16 @@ class _LineChartState extends AnimatedWidgetBaseState { ..add(ShowingTooltipIndicators(sortedLineSpots)); }); - if (event is FlPanStartEvent || event is FlPanUpdateEvent) { + if (event is FlPanStartEvent || event is FlLongPressStart) { final barIndex = touchResponse.lineBarSpots?.first.barIndex; final spotIndex = touchResponse.lineBarSpots?.first.spotIndex; - final newDataSpot = touchResponse.lineBarSpots?.first.touchedAxesPoint; - if (spotIndex != null && newDataSpot != null && barIndex != null) { + if (spotIndex != null && barIndex != null) { final isDraggable = widget.data.lineBarsData[barIndex].isDraggable; if (isDraggable) { setState(() { - _lineBarsData[barIndex].spots[spotIndex] = newDataSpot; + _draggingSpotIndexes = (barIndex, spotIndex); }); } } diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index 2b0a4a7fa..f4c9ce1ec 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -1,4 +1,5 @@ // coverage:ignore-file +import 'dart:math'; import 'dart:ui'; import 'package:equatable/equatable.dart'; @@ -227,7 +228,7 @@ class LineChartBarData with EquatableMixin { /// If you want to have a Step Line Chart style, just set [isStepLineChart] true, /// also you can tweak the [LineChartBarData.lineChartStepData]. LineChartBarData({ - this.spots = const [], + List spots = const [], this.show = true, Color? color, this.gradient, @@ -257,6 +258,7 @@ class LineChartBarData with EquatableMixin { FlSpot? mostBottom; FlSpot? firstValidSpot; + this.spots = List.from(spots); try { firstValidSpot = spots.firstWhere((element) => element != FlSpot.nullSpot); @@ -295,7 +297,7 @@ class LineChartBarData with EquatableMixin { /// /// You can have multiple lines by splitting them, /// put a [FlSpot.nullSpot] between each section. - final List spots; + late final List spots; /// We keep the most left spot to prevent redundant calculations late final FlSpot mostLeftSpot; @@ -385,6 +387,7 @@ class LineChartBarData with EquatableMixin { aboveBarData: BarAreaData.lerp(a.aboveBarData, b.aboveBarData, t), curveSmoothness: b.curveSmoothness, isCurved: b.isCurved, + isDraggable: b.isDraggable, isStrokeCapRound: b.isStrokeCapRound, isStrokeJoinRound: b.isStrokeJoinRound, preventCurveOverShooting: b.preventCurveOverShooting, @@ -1187,6 +1190,17 @@ double _xDistance(Offset touchPoint, Offset spotPixelCoordinates) { return (touchPoint.dx - spotPixelCoordinates.dx).abs(); } +/// distance calculator that calculates distance using vectors' math +double vectorDistanceCalculator( + Offset touchPoint, + Offset spotPixelCoordinates, +) { + return sqrt( + pow(touchPoint.dx - spotPixelCoordinates.dx, 2) + + pow(touchPoint.dy - spotPixelCoordinates.dy, 2), + ); +} + /// Default presentation of touched indicators. List defaultTouchedIndicators( LineChartBarData barData, @@ -1380,14 +1394,10 @@ class TouchLineBarSpot extends LineBarSpot { super.barIndex, super.spot, this.distance, - this.touchedAxesPoint, ); /// Distance in pixels from where the user taped final double distance; - - /// Position in spots' values converted from local position - final FlSpot touchedAxesPoint; } /// Holds data of showing each row item in the tooltip popup. @@ -1478,19 +1488,24 @@ class LineTouchResponse extends BaseTouchResponse { /// If touch happens, [LineChart] processes it internally and /// passes out a list of [lineBarSpots] it gives you information about the touched spot. /// They are sorted based on their distance to the touch event - const LineTouchResponse(this.lineBarSpots); + const LineTouchResponse(this.lineBarSpots, this.touchedAxesPoint); /// touch happened on these spots /// (if a single line provided on the chart, [lineBarSpots]'s length will be 1 always) final List? lineBarSpots; + /// Position in spots' values converted from local position + final FlSpot? touchedAxesPoint; + /// Copies current [LineTouchResponse] to a new [LineTouchResponse], /// and replaces provided values. LineTouchResponse copyWith({ List? lineBarSpots, + FlSpot? touchedAxesPoint, }) { return LineTouchResponse( lineBarSpots ?? this.lineBarSpots, + touchedAxesPoint ?? this.touchedAxesPoint, ); } } diff --git a/lib/src/chart/line_chart/line_chart_painter.dart b/lib/src/chart/line_chart/line_chart_painter.dart index c6acdaf07..e0a31a265 100644 --- a/lib/src/chart/line_chart/line_chart_painter.dart +++ b/lib/src/chart/line_chart/line_chart_painter.dart @@ -1191,7 +1191,7 @@ class LineChartPainter extends AxisChartPainter { /// Processes [localPosition] and checks /// the elements of the chart that are near the offset, /// then makes a [LineTouchResponse] from the elements that has been touched. - List? handleTouch( + LineTouchResponse handleTouch( Offset localPosition, Size size, PaintHolder holder, @@ -1214,9 +1214,20 @@ class LineChartPainter extends AxisChartPainter { } } + final axesPoint = getTouchedCoordinates( + localPosition.dx, + localPosition.dy, + size, + holder, + ); + touchedSpots.sort((a, b) => a.distance.compareTo(b.distance)); + final response = LineTouchResponse( + touchedSpots.isEmpty ? null : touchedSpots, + axesPoint, + ); - return touchedSpots.isEmpty ? null : touchedSpots; + return response; } /// find the nearest spot base on the touched offset @@ -1233,13 +1244,6 @@ class LineChartPainter extends AxisChartPainter { return null; } - final axesPoint = getTouchedCoordinates( - touchedPoint.dx, - touchedPoint.dy, - viewSize, - holder, - ); - /// Find the nearest spot (based on distanceCalculator) final sortedSpots = []; double? smallestDistance; @@ -1271,7 +1275,6 @@ class LineChartPainter extends AxisChartPainter { barDataPosition, sortedSpots.first, smallestDistance!, - axesPoint, ); } else { return null; diff --git a/lib/src/chart/line_chart/line_chart_renderer.dart b/lib/src/chart/line_chart/line_chart_renderer.dart index dfae057dd..59165d1fd 100644 --- a/lib/src/chart/line_chart/line_chart_renderer.dart +++ b/lib/src/chart/line_chart/line_chart_renderer.dart @@ -104,11 +104,11 @@ class RenderLineChart extends RenderBaseChart { @override LineTouchResponse getResponseAtLocation(Offset localPosition) { - final touchedSpots = painter.handleTouch( + final touchedSpotsResponse = painter.handleTouch( localPosition, mockTestSize ?? size, paintHolder, ); - return LineTouchResponse(touchedSpots); + return touchedSpotsResponse; } } diff --git a/test/chart/bar_chart/bar_chart_painter_test.mocks.dart b/test/chart/bar_chart/bar_chart_painter_test.mocks.dart index 7e4833f7e..6efe33bca 100644 --- a/test/chart/bar_chart/bar_chart_painter_test.mocks.dart +++ b/test/chart/bar_chart/bar_chart_painter_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/chart/bar_chart/bar_chart_painter_test.dart. // Do not manually edit this file. diff --git a/test/chart/bar_chart/bar_chart_renderer_test.mocks.dart b/test/chart/bar_chart/bar_chart_renderer_test.mocks.dart index 48490ff23..9c980a59d 100644 --- a/test/chart/bar_chart/bar_chart_renderer_test.mocks.dart +++ b/test/chart/bar_chart/bar_chart_renderer_test.mocks.dart @@ -1,22 +1,22 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/chart/bar_chart/bar_chart_renderer_test.dart. // Do not manually edit this file. // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:typed_data' as _i7; +import 'dart:typed_data' as _i8; import 'dart:ui' as _i2; -import 'package:fl_chart/fl_chart.dart' as _i13; -import 'package:fl_chart/src/chart/bar_chart/bar_chart_painter.dart' as _i10; +import 'package:fl_chart/fl_chart.dart' as _i7; +import 'package:fl_chart/src/chart/bar_chart/bar_chart_painter.dart' as _i11; import 'package:fl_chart/src/chart/base/base_chart/base_chart_painter.dart' - as _i12; -import 'package:fl_chart/src/utils/canvas_wrapper.dart' as _i11; + as _i13; +import 'package:fl_chart/src/utils/canvas_wrapper.dart' as _i12; import 'package:flutter/foundation.dart' as _i5; -import 'package:flutter/gestures.dart' as _i8; +import 'package:flutter/gestures.dart' as _i9; import 'package:flutter/material.dart' as _i6; import 'package:flutter/rendering.dart' as _i3; import 'package:flutter/src/rendering/layer.dart' as _i4; -import 'package:flutter/src/widgets/notification_listener.dart' as _i9; +import 'package:flutter/src/widgets/notification_listener.dart' as _i10; import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: type=lint @@ -137,6 +137,16 @@ class _FakeDiagnosticsNode_7 extends _i1.SmartFake super.toString(); } +class _FakeFlSpot_8 extends _i1.SmartFake implements _i7.FlSpot { + _FakeFlSpot_8( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + /// A class which mocks [Canvas]. /// /// See the documentation for Mockito's code generation for more information. @@ -246,7 +256,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { returnValueForMissingStub: null, ); @override - void transform(_i7.Float64List? matrix4) => super.noSuchMethod( + void transform(_i8.Float64List? matrix4) => super.noSuchMethod( Invocation.method( #transform, [matrix4], @@ -254,13 +264,13 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { returnValueForMissingStub: null, ); @override - _i7.Float64List getTransform() => (super.noSuchMethod( + _i8.Float64List getTransform() => (super.noSuchMethod( Invocation.method( #getTransform, [], ), - returnValue: _i7.Float64List(0), - ) as _i7.Float64List); + returnValue: _i8.Float64List(0), + ) as _i8.Float64List); @override void clipRect( _i2.Rect? rect, { @@ -585,7 +595,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { @override void drawRawPoints( _i2.PointMode? pointMode, - _i7.Float32List? points, + _i8.Float32List? points, _i2.Paint? paint, ) => super.noSuchMethod( @@ -644,9 +654,9 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { @override void drawRawAtlas( _i2.Image? atlas, - _i7.Float32List? rstTransforms, - _i7.Float32List? rects, - _i7.Int32List? colors, + _i8.Float32List? rstTransforms, + _i8.Float32List? rects, + _i8.Int32List? colors, _i2.BlendMode? blendMode, _i2.Rect? cullRect, _i2.Paint? paint, @@ -922,7 +932,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { _i4.TransformLayer? pushTransform( bool? needsCompositing, _i2.Offset? offset, - _i8.Matrix4? transform, + _i9.Matrix4? transform, _i3.PaintingContextCallback? painter, { _i4.TransformLayer? oldLayer, }) => @@ -1089,7 +1099,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { returnValueForMissingStub: null, ); @override - void dispatchNotification(_i9.Notification? notification) => + void dispatchNotification(_i10.Notification? notification) => super.noSuchMethod( Invocation.method( #dispatchNotification, @@ -1168,7 +1178,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { /// A class which mocks [BarChartPainter]. /// /// See the documentation for Mockito's code generation for more information. -class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { +class MockBarChartPainter extends _i1.Mock implements _i11.BarChartPainter { MockBarChartPainter() { _i1.throwOnMissingStub(this); } @@ -1176,8 +1186,8 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { @override void paint( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1191,10 +1201,10 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { returnValueForMissingStub: null, ); @override - List<_i10.GroupBarsPosition> calculateGroupAndBarsPosition( + List<_i11.GroupBarsPosition> calculateGroupAndBarsPosition( _i2.Size? viewSize, List? groupsX, - List<_i13.BarChartGroupData>? barGroups, + List<_i7.BarChartGroupData>? barGroups, ) => (super.noSuchMethod( Invocation.method( @@ -1205,13 +1215,13 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { barGroups, ], ), - returnValue: <_i10.GroupBarsPosition>[], - ) as List<_i10.GroupBarsPosition>); + returnValue: <_i11.GroupBarsPosition>[], + ) as List<_i11.GroupBarsPosition>); @override void drawBars( - _i11.CanvasWrapper? canvasWrapper, - List<_i10.GroupBarsPosition>? groupBarsPosition, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + List<_i11.GroupBarsPosition>? groupBarsPosition, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1227,14 +1237,14 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { @override void drawTouchTooltip( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - List<_i10.GroupBarsPosition>? groupPositions, - _i13.BarTouchTooltipData? tooltipData, - _i13.BarChartGroupData? showOnBarGroup, + _i12.CanvasWrapper? canvasWrapper, + List<_i11.GroupBarsPosition>? groupPositions, + _i7.BarTouchTooltipData? tooltipData, + _i7.BarChartGroupData? showOnBarGroup, int? barGroupIndex, - _i13.BarChartRodData? showOnRodData, + _i7.BarChartRodData? showOnRodData, int? barRodIndex, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1255,14 +1265,14 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { ); @override void drawStackItemBorderStroke( - _i11.CanvasWrapper? canvasWrapper, - _i13.BarChartRodStackItem? stackItem, + _i12.CanvasWrapper? canvasWrapper, + _i7.BarChartRodStackItem? stackItem, int? index, int? rodStacksSize, double? barThickSize, _i2.RRect? barRRect, _i2.Size? drawSize, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1281,10 +1291,10 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { returnValueForMissingStub: null, ); @override - _i13.BarTouchedSpot? handleTouch( + _i7.BarTouchedSpot? handleTouch( _i2.Offset? localPosition, _i2.Size? viewSize, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => (super.noSuchMethod(Invocation.method( #handleTouch, @@ -1293,11 +1303,11 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { viewSize, holder, ], - )) as _i13.BarTouchedSpot?); + )) as _i7.BarTouchedSpot?); @override void drawGrid( - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1311,8 +1321,8 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { ); @override void drawBackground( - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1326,8 +1336,8 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { ); @override void drawRangeAnnotation( - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1342,8 +1352,8 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { @override void drawExtraLines( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1359,8 +1369,8 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { @override void drawHorizontalLines( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.BarChartData>? holder, _i2.Size? viewSize, ) => super.noSuchMethod( @@ -1378,8 +1388,8 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { @override void drawVerticalLines( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.BarChartData>? holder, _i2.Size? viewSize, ) => super.noSuchMethod( @@ -1398,7 +1408,7 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { double getPixelX( double? spotX, _i2.Size? viewSize, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -1415,7 +1425,7 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { double getPixelY( double? spotY, _i2.Size? viewSize, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -1429,10 +1439,40 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { returnValue: 0.0, ) as double); @override + _i7.FlSpot getTouchedCoordinates( + double? pixelX, + double? pixelY, + _i2.Size? viewSize, + _i13.PaintHolder<_i7.BarChartData>? holder, + ) => + (super.noSuchMethod( + Invocation.method( + #getTouchedCoordinates, + [ + pixelX, + pixelY, + viewSize, + holder, + ], + ), + returnValue: _FakeFlSpot_8( + this, + Invocation.method( + #getTouchedCoordinates, + [ + pixelX, + pixelY, + viewSize, + holder, + ], + ), + ), + ) as _i7.FlSpot); + @override double getTooltipLeft( double? dx, double? tooltipWidth, - _i13.FLHorizontalAlignment? tooltipHorizontalAlignment, + _i7.FLHorizontalAlignment? tooltipHorizontalAlignment, double? tooltipHorizontalOffset, ) => (super.noSuchMethod( diff --git a/test/chart/data_pool.dart b/test/chart/data_pool.dart index 2bb1f1315..f046668ff 100644 --- a/test/chart/data_pool.dart +++ b/test/chart/data_pool.dart @@ -305,7 +305,7 @@ class MockData { ); static final lineTouchResponse1 = - LineTouchResponse([lineBarSpot1, lineBarSpot2]); + LineTouchResponse([lineBarSpot1, lineBarSpot2], const FlSpot(1, 1)); static final barChartRodData1 = BarChartRodData(toY: 11); static final barChartRodData2 = BarChartRodData(toY: 22); @@ -1020,8 +1020,12 @@ final TouchLineBarSpot lineBarSpot1Clone = TouchLineBarSpot( 0, ); -final TouchLineBarSpot lineBarSpot2 = - TouchLineBarSpot(lineChartBarData1, 2, flSpot1, 2); +final TouchLineBarSpot lineBarSpot2 = TouchLineBarSpot( + lineChartBarData1, + 2, + flSpot1, + 2, +); final TouchLineBarSpot lineBarSpot3 = TouchLineBarSpot( lineChartBarData1, @@ -1035,12 +1039,14 @@ final LineTouchResponse lineTouchResponse1 = LineTouchResponse( lineBarSpot1, lineBarSpot2, ], + const FlSpot(1, 1), ); final LineTouchResponse lineTouchResponse1Clone = LineTouchResponse( [ lineBarSpot1Clone, lineBarSpot2, ], + const FlSpot(1, 1), ); final LineTouchResponse lineTouchResponse2 = LineTouchResponse( @@ -1048,17 +1054,18 @@ final LineTouchResponse lineTouchResponse2 = LineTouchResponse( lineBarSpot2, lineBarSpot1, ], + const FlSpot(1, 1), ); -const LineTouchResponse lineTouchResponse3 = LineTouchResponse( - [], -); +const LineTouchResponse lineTouchResponse3 = + LineTouchResponse([], FlSpot(1, 1)); final LineTouchResponse lineTouchResponse4 = LineTouchResponse( [ lineBarSpot1, lineBarSpot2, ], + const FlSpot(1, 1), ); final LineTouchResponse lineTouchResponse5 = LineTouchResponse( @@ -1066,6 +1073,7 @@ final LineTouchResponse lineTouchResponse5 = LineTouchResponse( lineBarSpot1, lineBarSpot2, ], + const FlSpot(1, 1), ); const TouchedSpotIndicatorData touchedSpotIndicatorData1 = diff --git a/test/chart/line_chart/line_chart_painter_test.dart b/test/chart/line_chart/line_chart_painter_test.dart index c702c6431..510a8a955 100644 --- a/test/chart/line_chart/line_chart_painter_test.dart +++ b/test/chart/line_chart/line_chart_painter_test.dart @@ -2663,7 +2663,7 @@ void main() { final holder = PaintHolder(data, data, 1); final touchResponse = lineChartPainter.handleTouch(const Offset(35, 0), viewSize, holder); - expect(touchResponse, null); + expect(touchResponse.lineBarSpots, null); }); test('test 2', () { @@ -2720,21 +2720,25 @@ void main() { final holder = PaintHolder(data, data, 1); expect( lineChartPainter - .handleTouch(const Offset(30, 0), viewSize, holder)! + .handleTouch(const Offset(30, 0), viewSize, holder) + .lineBarSpots! .length, 1, ); expect( - lineChartPainter.handleTouch( - const Offset(29.99, 0), - viewSize, - holder, - ), + lineChartPainter + .handleTouch( + const Offset(29.99, 0), + viewSize, + holder, + ) + .lineBarSpots, null, ); expect( lineChartPainter - .handleTouch(const Offset(10, 0), viewSize, holder)! + .handleTouch(const Offset(10, 0), viewSize, holder) + .lineBarSpots! .length, 2, ); @@ -2794,14 +2798,14 @@ void main() { final holder = PaintHolder(data, data, 1); final result1 = - lineChartPainter.handleTouch(const Offset(11, 0), viewSize, holder)!; - expect(result1[0].barIndex, 0); - expect(result1[1].barIndex, 1); + lineChartPainter.handleTouch(const Offset(11, 0), viewSize, holder); + expect(result1.lineBarSpots![0].barIndex, 0); + expect(result1.lineBarSpots![1].barIndex, 1); final result2 = - lineChartPainter.handleTouch(const Offset(12, 0), viewSize, holder)!; - expect(result2[0].barIndex, 1); - expect(result2[1].barIndex, 0); + lineChartPainter.handleTouch(const Offset(12, 0), viewSize, holder); + expect(result2.lineBarSpots![0].barIndex, 1); + expect(result2.lineBarSpots![1].barIndex, 0); }); }); diff --git a/test/chart/line_chart/line_chart_painter_test.mocks.dart b/test/chart/line_chart/line_chart_painter_test.mocks.dart index 36127099e..be5479b46 100644 --- a/test/chart/line_chart/line_chart_painter_test.mocks.dart +++ b/test/chart/line_chart/line_chart_painter_test.mocks.dart @@ -1,16 +1,16 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/chart/line_chart/line_chart_painter_test.dart. // Do not manually edit this file. // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:typed_data' as _i5; +import 'dart:typed_data' as _i6; import 'dart:ui' as _i2; -import 'package:fl_chart/fl_chart.dart' as _i7; +import 'package:fl_chart/fl_chart.dart' as _i5; import 'package:fl_chart/src/chart/base/base_chart/base_chart_painter.dart' as _i10; import 'package:fl_chart/src/chart/line_chart/line_chart_painter.dart' as _i9; -import 'package:fl_chart/src/utils/canvas_wrapper.dart' as _i6; +import 'package:fl_chart/src/utils/canvas_wrapper.dart' as _i7; import 'package:fl_chart/src/utils/utils.dart' as _i8; import 'package:flutter/cupertino.dart' as _i3; import 'package:flutter/foundation.dart' as _i4; @@ -152,6 +152,27 @@ class _FakePath_9 extends _i1.SmartFake implements _i2.Path { ); } +class _FakeLineTouchResponse_10 extends _i1.SmartFake + implements _i5.LineTouchResponse { + _FakeLineTouchResponse_10( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeFlSpot_11 extends _i1.SmartFake implements _i5.FlSpot { + _FakeFlSpot_11( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + /// A class which mocks [Canvas]. /// /// See the documentation for Mockito's code generation for more information. @@ -261,7 +282,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { returnValueForMissingStub: null, ); @override - void transform(_i5.Float64List? matrix4) => super.noSuchMethod( + void transform(_i6.Float64List? matrix4) => super.noSuchMethod( Invocation.method( #transform, [matrix4], @@ -269,13 +290,13 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { returnValueForMissingStub: null, ); @override - _i5.Float64List getTransform() => (super.noSuchMethod( + _i6.Float64List getTransform() => (super.noSuchMethod( Invocation.method( #getTransform, [], ), - returnValue: _i5.Float64List(0), - ) as _i5.Float64List); + returnValue: _i6.Float64List(0), + ) as _i6.Float64List); @override void clipRect( _i2.Rect? rect, { @@ -600,7 +621,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { @override void drawRawPoints( _i2.PointMode? pointMode, - _i5.Float32List? points, + _i6.Float32List? points, _i2.Paint? paint, ) => super.noSuchMethod( @@ -659,9 +680,9 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { @override void drawRawAtlas( _i2.Image? atlas, - _i5.Float32List? rstTransforms, - _i5.Float32List? rects, - _i5.Int32List? colors, + _i6.Float32List? rstTransforms, + _i6.Float32List? rects, + _i6.Int32List? colors, _i2.BlendMode? blendMode, _i2.Rect? cullRect, _i2.Paint? paint, @@ -705,7 +726,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { /// A class which mocks [CanvasWrapper]. /// /// See the documentation for Mockito's code generation for more information. -class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { +class MockCanvasWrapper extends _i1.Mock implements _i7.CanvasWrapper { MockCanvasWrapper() { _i1.throwOnMissingStub(this); } @@ -954,8 +975,8 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ); @override void drawDot( - _i7.FlDotPainter? painter, - _i7.FlSpot? spot, + _i5.FlDotPainter? painter, + _i5.FlSpot? spot, _i2.Offset? offset, ) => super.noSuchMethod( @@ -975,7 +996,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { _i2.Offset? rotationOffset = _i2.Offset.zero, _i2.Offset? drawOffset = _i2.Offset.zero, required double? angle, - required _i6.DrawCallback? drawCallback, + required _i7.DrawCallback? drawCallback, }) => super.noSuchMethod( Invocation.method( @@ -1362,8 +1383,8 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { @override void paint( _i3.BuildContext? context, - _i6.CanvasWrapper? canvasWrapper, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1378,8 +1399,8 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ); @override void clipToBorder( - _i6.CanvasWrapper? canvasWrapper, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1393,9 +1414,9 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ); @override void drawBarLine( - _i6.CanvasWrapper? canvasWrapper, - _i7.LineChartBarData? barData, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i5.LineChartBarData? barData, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1410,10 +1431,10 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ); @override void drawBetweenBarsArea( - _i6.CanvasWrapper? canvasWrapper, - _i7.LineChartData? data, - _i7.BetweenBarsData? betweenBarsData, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i5.LineChartData? data, + _i5.BetweenBarsData? betweenBarsData, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1429,9 +1450,9 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ); @override void drawDots( - _i6.CanvasWrapper? canvasWrapper, - _i7.LineChartBarData? barData, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i5.LineChartBarData? barData, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1446,9 +1467,9 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ); @override void drawTouchedSpotsIndicator( - _i6.CanvasWrapper? canvasWrapper, + _i7.CanvasWrapper? canvasWrapper, List<_i9.LineIndexDrawingInfo>? lineIndexDrawingInfo, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1464,9 +1485,9 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { @override _i2.Path generateBarPath( _i2.Size? viewSize, - _i7.LineChartBarData? barData, - List<_i7.FlSpot>? barSpots, - _i10.PaintHolder<_i7.LineChartData>? holder, { + _i5.LineChartBarData? barData, + List<_i5.FlSpot>? barSpots, + _i10.PaintHolder<_i5.LineChartData>? holder, { _i2.Path? appendToPath, }) => (super.noSuchMethod( @@ -1497,9 +1518,9 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { @override _i2.Path generateNormalBarPath( _i2.Size? viewSize, - _i7.LineChartBarData? barData, - List<_i7.FlSpot>? barSpots, - _i10.PaintHolder<_i7.LineChartData>? holder, { + _i5.LineChartBarData? barData, + List<_i5.FlSpot>? barSpots, + _i10.PaintHolder<_i5.LineChartData>? holder, { _i2.Path? appendToPath, }) => (super.noSuchMethod( @@ -1530,9 +1551,9 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { @override _i2.Path generateStepBarPath( _i2.Size? viewSize, - _i7.LineChartBarData? barData, - List<_i7.FlSpot>? barSpots, - _i10.PaintHolder<_i7.LineChartData>? holder, { + _i5.LineChartBarData? barData, + List<_i5.FlSpot>? barSpots, + _i10.PaintHolder<_i5.LineChartData>? holder, { _i2.Path? appendToPath, }) => (super.noSuchMethod( @@ -1563,10 +1584,10 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { @override _i2.Path generateBelowBarPath( _i2.Size? viewSize, - _i7.LineChartBarData? barData, + _i5.LineChartBarData? barData, _i2.Path? barPath, - List<_i7.FlSpot>? barSpots, - _i10.PaintHolder<_i7.LineChartData>? holder, { + List<_i5.FlSpot>? barSpots, + _i10.PaintHolder<_i5.LineChartData>? holder, { bool? fillCompletely = false, }) => (super.noSuchMethod( @@ -1599,10 +1620,10 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { @override _i2.Path generateAboveBarPath( _i2.Size? viewSize, - _i7.LineChartBarData? barData, + _i5.LineChartBarData? barData, _i2.Path? barPath, - List<_i7.FlSpot>? barSpots, - _i10.PaintHolder<_i7.LineChartData>? holder, { + List<_i5.FlSpot>? barSpots, + _i10.PaintHolder<_i5.LineChartData>? holder, { bool? fillCompletely = false, }) => (super.noSuchMethod( @@ -1634,11 +1655,11 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ) as _i2.Path); @override void drawBelowBar( - _i6.CanvasWrapper? canvasWrapper, + _i7.CanvasWrapper? canvasWrapper, _i2.Path? belowBarPath, _i2.Path? filledAboveBarPath, - _i10.PaintHolder<_i7.LineChartData>? holder, - _i7.LineChartBarData? barData, + _i10.PaintHolder<_i5.LineChartData>? holder, + _i5.LineChartBarData? barData, ) => super.noSuchMethod( Invocation.method( @@ -1655,11 +1676,11 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ); @override void drawAboveBar( - _i6.CanvasWrapper? canvasWrapper, + _i7.CanvasWrapper? canvasWrapper, _i2.Path? aboveBarPath, _i2.Path? filledBelowBarPath, - _i10.PaintHolder<_i7.LineChartData>? holder, - _i7.LineChartBarData? barData, + _i10.PaintHolder<_i5.LineChartData>? holder, + _i5.LineChartBarData? barData, ) => super.noSuchMethod( Invocation.method( @@ -1676,11 +1697,11 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ); @override void drawBetweenBar( - _i6.CanvasWrapper? canvasWrapper, + _i7.CanvasWrapper? canvasWrapper, _i2.Path? barPath, - _i7.BetweenBarsData? betweenBarsData, + _i5.BetweenBarsData? betweenBarsData, _i2.Rect? aroundRect, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1697,9 +1718,9 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ); @override void drawBarShadow( - _i6.CanvasWrapper? canvasWrapper, + _i7.CanvasWrapper? canvasWrapper, _i2.Path? barPath, - _i7.LineChartBarData? barData, + _i5.LineChartBarData? barData, ) => super.noSuchMethod( Invocation.method( @@ -1714,10 +1735,10 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ); @override void drawBar( - _i6.CanvasWrapper? canvasWrapper, + _i7.CanvasWrapper? canvasWrapper, _i2.Path? barPath, - _i7.LineChartBarData? barData, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i5.LineChartBarData? barData, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1734,11 +1755,11 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { @override void drawTouchTooltip( _i3.BuildContext? context, - _i6.CanvasWrapper? canvasWrapper, - _i7.LineTouchTooltipData? tooltipData, - _i7.FlSpot? showOnSpot, - _i7.ShowingTooltipIndicators? showingTooltipSpots, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i5.LineTouchTooltipData? tooltipData, + _i5.FlSpot? showOnSpot, + _i5.ShowingTooltipIndicators? showingTooltipSpots, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1756,9 +1777,9 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ); @override double getBarLineXLength( - _i7.LineChartBarData? barData, + _i5.LineChartBarData? barData, _i2.Size? chartUsableSize, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -1772,26 +1793,39 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { returnValue: 0.0, ) as double); @override - List<_i7.TouchLineBarSpot>? handleTouch( + _i5.LineTouchResponse handleTouch( _i2.Offset? localPosition, _i2.Size? size, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => - (super.noSuchMethod(Invocation.method( - #handleTouch, - [ - localPosition, - size, - holder, - ], - )) as List<_i7.TouchLineBarSpot>?); + (super.noSuchMethod( + Invocation.method( + #handleTouch, + [ + localPosition, + size, + holder, + ], + ), + returnValue: _FakeLineTouchResponse_10( + this, + Invocation.method( + #handleTouch, + [ + localPosition, + size, + holder, + ], + ), + ), + ) as _i5.LineTouchResponse); @override - _i7.TouchLineBarSpot? getNearestTouchedSpot( + _i5.TouchLineBarSpot? getNearestTouchedSpot( _i2.Size? viewSize, _i2.Offset? touchedPoint, - _i7.LineChartBarData? barData, + _i5.LineChartBarData? barData, int? barDataPosition, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => (super.noSuchMethod(Invocation.method( #getNearestTouchedSpot, @@ -1802,11 +1836,11 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { barDataPosition, holder, ], - )) as _i7.TouchLineBarSpot?); + )) as _i5.TouchLineBarSpot?); @override void drawGrid( - _i6.CanvasWrapper? canvasWrapper, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1820,8 +1854,8 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ); @override void drawBackground( - _i6.CanvasWrapper? canvasWrapper, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1835,8 +1869,8 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ); @override void drawRangeAnnotation( - _i6.CanvasWrapper? canvasWrapper, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1851,8 +1885,8 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { @override void drawExtraLines( _i3.BuildContext? context, - _i6.CanvasWrapper? canvasWrapper, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1868,8 +1902,8 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { @override void drawHorizontalLines( _i3.BuildContext? context, - _i6.CanvasWrapper? canvasWrapper, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i10.PaintHolder<_i5.LineChartData>? holder, _i2.Size? viewSize, ) => super.noSuchMethod( @@ -1887,8 +1921,8 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { @override void drawVerticalLines( _i3.BuildContext? context, - _i6.CanvasWrapper? canvasWrapper, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i10.PaintHolder<_i5.LineChartData>? holder, _i2.Size? viewSize, ) => super.noSuchMethod( @@ -1907,7 +1941,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { double getPixelX( double? spotX, _i2.Size? viewSize, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -1924,7 +1958,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { double getPixelY( double? spotY, _i2.Size? viewSize, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -1938,10 +1972,40 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { returnValue: 0.0, ) as double); @override + _i5.FlSpot getTouchedCoordinates( + double? pixelX, + double? pixelY, + _i2.Size? viewSize, + _i10.PaintHolder<_i5.LineChartData>? holder, + ) => + (super.noSuchMethod( + Invocation.method( + #getTouchedCoordinates, + [ + pixelX, + pixelY, + viewSize, + holder, + ], + ), + returnValue: _FakeFlSpot_11( + this, + Invocation.method( + #getTouchedCoordinates, + [ + pixelX, + pixelY, + viewSize, + holder, + ], + ), + ), + ) as _i5.FlSpot); + @override double getTooltipLeft( double? dx, double? tooltipWidth, - _i7.FLHorizontalAlignment? tooltipHorizontalAlignment, + _i5.FLHorizontalAlignment? tooltipHorizontalAlignment, double? tooltipHorizontalOffset, ) => (super.noSuchMethod( diff --git a/test/chart/line_chart/line_chart_renderer_test.dart b/test/chart/line_chart/line_chart_renderer_test.dart index 10463b558..2322af395 100644 --- a/test/chart/line_chart/line_chart_renderer_test.dart +++ b/test/chart/line_chart/line_chart_renderer_test.dart @@ -97,7 +97,7 @@ void main() { 'size': inv.positionalArguments[1] as Size, 'paint_holder': inv.positionalArguments[2] as PaintHolder, }); - return MockData.lineTouchResponse1.lineBarSpots; + return MockData.lineTouchResponse1; }); final touchResponse = renderLineChart.getResponseAtLocation(MockData.offset1); diff --git a/test/chart/line_chart/line_chart_renderer_test.mocks.dart b/test/chart/line_chart/line_chart_renderer_test.mocks.dart index 97a29906e..8a177381f 100644 --- a/test/chart/line_chart/line_chart_renderer_test.mocks.dart +++ b/test/chart/line_chart/line_chart_renderer_test.mocks.dart @@ -1,22 +1,22 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/chart/line_chart/line_chart_renderer_test.dart. // Do not manually edit this file. // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:typed_data' as _i7; +import 'dart:typed_data' as _i8; import 'dart:ui' as _i2; -import 'package:fl_chart/fl_chart.dart' as _i13; +import 'package:fl_chart/fl_chart.dart' as _i7; import 'package:fl_chart/src/chart/base/base_chart/base_chart_painter.dart' - as _i12; -import 'package:fl_chart/src/chart/line_chart/line_chart_painter.dart' as _i10; -import 'package:fl_chart/src/utils/canvas_wrapper.dart' as _i11; + as _i13; +import 'package:fl_chart/src/chart/line_chart/line_chart_painter.dart' as _i11; +import 'package:fl_chart/src/utils/canvas_wrapper.dart' as _i12; import 'package:flutter/foundation.dart' as _i5; -import 'package:flutter/gestures.dart' as _i8; +import 'package:flutter/gestures.dart' as _i9; import 'package:flutter/material.dart' as _i6; import 'package:flutter/rendering.dart' as _i3; import 'package:flutter/src/rendering/layer.dart' as _i4; -import 'package:flutter/src/widgets/notification_listener.dart' as _i9; +import 'package:flutter/src/widgets/notification_listener.dart' as _i10; import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: type=lint @@ -147,6 +147,27 @@ class _FakePath_8 extends _i1.SmartFake implements _i2.Path { ); } +class _FakeLineTouchResponse_9 extends _i1.SmartFake + implements _i7.LineTouchResponse { + _FakeLineTouchResponse_9( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeFlSpot_10 extends _i1.SmartFake implements _i7.FlSpot { + _FakeFlSpot_10( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + /// A class which mocks [Canvas]. /// /// See the documentation for Mockito's code generation for more information. @@ -256,7 +277,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { returnValueForMissingStub: null, ); @override - void transform(_i7.Float64List? matrix4) => super.noSuchMethod( + void transform(_i8.Float64List? matrix4) => super.noSuchMethod( Invocation.method( #transform, [matrix4], @@ -264,13 +285,13 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { returnValueForMissingStub: null, ); @override - _i7.Float64List getTransform() => (super.noSuchMethod( + _i8.Float64List getTransform() => (super.noSuchMethod( Invocation.method( #getTransform, [], ), - returnValue: _i7.Float64List(0), - ) as _i7.Float64List); + returnValue: _i8.Float64List(0), + ) as _i8.Float64List); @override void clipRect( _i2.Rect? rect, { @@ -595,7 +616,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { @override void drawRawPoints( _i2.PointMode? pointMode, - _i7.Float32List? points, + _i8.Float32List? points, _i2.Paint? paint, ) => super.noSuchMethod( @@ -654,9 +675,9 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { @override void drawRawAtlas( _i2.Image? atlas, - _i7.Float32List? rstTransforms, - _i7.Float32List? rects, - _i7.Int32List? colors, + _i8.Float32List? rstTransforms, + _i8.Float32List? rects, + _i8.Int32List? colors, _i2.BlendMode? blendMode, _i2.Rect? cullRect, _i2.Paint? paint, @@ -932,7 +953,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { _i4.TransformLayer? pushTransform( bool? needsCompositing, _i2.Offset? offset, - _i8.Matrix4? transform, + _i9.Matrix4? transform, _i3.PaintingContextCallback? painter, { _i4.TransformLayer? oldLayer, }) => @@ -1099,7 +1120,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { returnValueForMissingStub: null, ); @override - void dispatchNotification(_i9.Notification? notification) => + void dispatchNotification(_i10.Notification? notification) => super.noSuchMethod( Invocation.method( #dispatchNotification, @@ -1178,7 +1199,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { /// A class which mocks [LineChartPainter]. /// /// See the documentation for Mockito's code generation for more information. -class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { +class MockLineChartPainter extends _i1.Mock implements _i11.LineChartPainter { MockLineChartPainter() { _i1.throwOnMissingStub(this); } @@ -1186,8 +1207,8 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void paint( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1202,8 +1223,8 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ); @override void clipToBorder( - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1217,9 +1238,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ); @override void drawBarLine( - _i11.CanvasWrapper? canvasWrapper, - _i13.LineChartBarData? barData, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i7.LineChartBarData? barData, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1234,10 +1255,10 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ); @override void drawBetweenBarsArea( - _i11.CanvasWrapper? canvasWrapper, - _i13.LineChartData? data, - _i13.BetweenBarsData? betweenBarsData, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i7.LineChartData? data, + _i7.BetweenBarsData? betweenBarsData, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1253,9 +1274,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ); @override void drawDots( - _i11.CanvasWrapper? canvasWrapper, - _i13.LineChartBarData? barData, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i7.LineChartBarData? barData, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1270,9 +1291,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ); @override void drawTouchedSpotsIndicator( - _i11.CanvasWrapper? canvasWrapper, - List<_i10.LineIndexDrawingInfo>? lineIndexDrawingInfo, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + List<_i11.LineIndexDrawingInfo>? lineIndexDrawingInfo, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1288,9 +1309,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override _i2.Path generateBarPath( _i2.Size? viewSize, - _i13.LineChartBarData? barData, - List<_i13.FlSpot>? barSpots, - _i12.PaintHolder<_i13.LineChartData>? holder, { + _i7.LineChartBarData? barData, + List<_i7.FlSpot>? barSpots, + _i13.PaintHolder<_i7.LineChartData>? holder, { _i2.Path? appendToPath, }) => (super.noSuchMethod( @@ -1321,9 +1342,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override _i2.Path generateNormalBarPath( _i2.Size? viewSize, - _i13.LineChartBarData? barData, - List<_i13.FlSpot>? barSpots, - _i12.PaintHolder<_i13.LineChartData>? holder, { + _i7.LineChartBarData? barData, + List<_i7.FlSpot>? barSpots, + _i13.PaintHolder<_i7.LineChartData>? holder, { _i2.Path? appendToPath, }) => (super.noSuchMethod( @@ -1354,9 +1375,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override _i2.Path generateStepBarPath( _i2.Size? viewSize, - _i13.LineChartBarData? barData, - List<_i13.FlSpot>? barSpots, - _i12.PaintHolder<_i13.LineChartData>? holder, { + _i7.LineChartBarData? barData, + List<_i7.FlSpot>? barSpots, + _i13.PaintHolder<_i7.LineChartData>? holder, { _i2.Path? appendToPath, }) => (super.noSuchMethod( @@ -1387,10 +1408,10 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override _i2.Path generateBelowBarPath( _i2.Size? viewSize, - _i13.LineChartBarData? barData, + _i7.LineChartBarData? barData, _i2.Path? barPath, - List<_i13.FlSpot>? barSpots, - _i12.PaintHolder<_i13.LineChartData>? holder, { + List<_i7.FlSpot>? barSpots, + _i13.PaintHolder<_i7.LineChartData>? holder, { bool? fillCompletely = false, }) => (super.noSuchMethod( @@ -1423,10 +1444,10 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override _i2.Path generateAboveBarPath( _i2.Size? viewSize, - _i13.LineChartBarData? barData, + _i7.LineChartBarData? barData, _i2.Path? barPath, - List<_i13.FlSpot>? barSpots, - _i12.PaintHolder<_i13.LineChartData>? holder, { + List<_i7.FlSpot>? barSpots, + _i13.PaintHolder<_i7.LineChartData>? holder, { bool? fillCompletely = false, }) => (super.noSuchMethod( @@ -1458,11 +1479,11 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ) as _i2.Path); @override void drawBelowBar( - _i11.CanvasWrapper? canvasWrapper, + _i12.CanvasWrapper? canvasWrapper, _i2.Path? belowBarPath, _i2.Path? filledAboveBarPath, - _i12.PaintHolder<_i13.LineChartData>? holder, - _i13.LineChartBarData? barData, + _i13.PaintHolder<_i7.LineChartData>? holder, + _i7.LineChartBarData? barData, ) => super.noSuchMethod( Invocation.method( @@ -1479,11 +1500,11 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ); @override void drawAboveBar( - _i11.CanvasWrapper? canvasWrapper, + _i12.CanvasWrapper? canvasWrapper, _i2.Path? aboveBarPath, _i2.Path? filledBelowBarPath, - _i12.PaintHolder<_i13.LineChartData>? holder, - _i13.LineChartBarData? barData, + _i13.PaintHolder<_i7.LineChartData>? holder, + _i7.LineChartBarData? barData, ) => super.noSuchMethod( Invocation.method( @@ -1500,11 +1521,11 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ); @override void drawBetweenBar( - _i11.CanvasWrapper? canvasWrapper, + _i12.CanvasWrapper? canvasWrapper, _i2.Path? barPath, - _i13.BetweenBarsData? betweenBarsData, + _i7.BetweenBarsData? betweenBarsData, _i2.Rect? aroundRect, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1521,9 +1542,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ); @override void drawBarShadow( - _i11.CanvasWrapper? canvasWrapper, + _i12.CanvasWrapper? canvasWrapper, _i2.Path? barPath, - _i13.LineChartBarData? barData, + _i7.LineChartBarData? barData, ) => super.noSuchMethod( Invocation.method( @@ -1538,10 +1559,10 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ); @override void drawBar( - _i11.CanvasWrapper? canvasWrapper, + _i12.CanvasWrapper? canvasWrapper, _i2.Path? barPath, - _i13.LineChartBarData? barData, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i7.LineChartBarData? barData, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1558,11 +1579,11 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawTouchTooltip( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i13.LineTouchTooltipData? tooltipData, - _i13.FlSpot? showOnSpot, - _i13.ShowingTooltipIndicators? showingTooltipSpots, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i7.LineTouchTooltipData? tooltipData, + _i7.FlSpot? showOnSpot, + _i7.ShowingTooltipIndicators? showingTooltipSpots, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1580,9 +1601,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ); @override double getBarLineXLength( - _i13.LineChartBarData? barData, + _i7.LineChartBarData? barData, _i2.Size? chartUsableSize, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -1596,26 +1617,39 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { returnValue: 0.0, ) as double); @override - List<_i13.TouchLineBarSpot>? handleTouch( + _i7.LineTouchResponse handleTouch( _i2.Offset? localPosition, _i2.Size? size, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => - (super.noSuchMethod(Invocation.method( - #handleTouch, - [ - localPosition, - size, - holder, - ], - )) as List<_i13.TouchLineBarSpot>?); + (super.noSuchMethod( + Invocation.method( + #handleTouch, + [ + localPosition, + size, + holder, + ], + ), + returnValue: _FakeLineTouchResponse_9( + this, + Invocation.method( + #handleTouch, + [ + localPosition, + size, + holder, + ], + ), + ), + ) as _i7.LineTouchResponse); @override - _i13.TouchLineBarSpot? getNearestTouchedSpot( + _i7.TouchLineBarSpot? getNearestTouchedSpot( _i2.Size? viewSize, _i2.Offset? touchedPoint, - _i13.LineChartBarData? barData, + _i7.LineChartBarData? barData, int? barDataPosition, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => (super.noSuchMethod(Invocation.method( #getNearestTouchedSpot, @@ -1626,11 +1660,11 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { barDataPosition, holder, ], - )) as _i13.TouchLineBarSpot?); + )) as _i7.TouchLineBarSpot?); @override void drawGrid( - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1644,8 +1678,8 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ); @override void drawBackground( - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1659,8 +1693,8 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ); @override void drawRangeAnnotation( - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1675,8 +1709,8 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawExtraLines( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1692,8 +1726,8 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawHorizontalLines( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.LineChartData>? holder, _i2.Size? viewSize, ) => super.noSuchMethod( @@ -1711,8 +1745,8 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawVerticalLines( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.LineChartData>? holder, _i2.Size? viewSize, ) => super.noSuchMethod( @@ -1731,7 +1765,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { double getPixelX( double? spotX, _i2.Size? viewSize, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -1748,7 +1782,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { double getPixelY( double? spotY, _i2.Size? viewSize, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -1762,10 +1796,40 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { returnValue: 0.0, ) as double); @override + _i7.FlSpot getTouchedCoordinates( + double? pixelX, + double? pixelY, + _i2.Size? viewSize, + _i13.PaintHolder<_i7.LineChartData>? holder, + ) => + (super.noSuchMethod( + Invocation.method( + #getTouchedCoordinates, + [ + pixelX, + pixelY, + viewSize, + holder, + ], + ), + returnValue: _FakeFlSpot_10( + this, + Invocation.method( + #getTouchedCoordinates, + [ + pixelX, + pixelY, + viewSize, + holder, + ], + ), + ), + ) as _i7.FlSpot); + @override double getTooltipLeft( double? dx, double? tooltipWidth, - _i13.FLHorizontalAlignment? tooltipHorizontalAlignment, + _i7.FLHorizontalAlignment? tooltipHorizontalAlignment, double? tooltipHorizontalOffset, ) => (super.noSuchMethod( diff --git a/test/chart/pie_chart/pie_chart_painter_test.mocks.dart b/test/chart/pie_chart/pie_chart_painter_test.mocks.dart index a1d0683e1..ec4a3623e 100644 --- a/test/chart/pie_chart/pie_chart_painter_test.mocks.dart +++ b/test/chart/pie_chart/pie_chart_painter_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/chart/pie_chart/pie_chart_painter_test.dart. // Do not manually edit this file. diff --git a/test/chart/pie_chart/pie_chart_renderer_test.mocks.dart b/test/chart/pie_chart/pie_chart_renderer_test.mocks.dart index 8e58b42b5..240627c32 100644 --- a/test/chart/pie_chart/pie_chart_renderer_test.mocks.dart +++ b/test/chart/pie_chart/pie_chart_renderer_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/chart/pie_chart/pie_chart_renderer_test.dart. // Do not manually edit this file. diff --git a/test/chart/radar_chart/radar_chart_painter_test.mocks.dart b/test/chart/radar_chart/radar_chart_painter_test.mocks.dart index 84b2cd6ef..29a27a859 100644 --- a/test/chart/radar_chart/radar_chart_painter_test.mocks.dart +++ b/test/chart/radar_chart/radar_chart_painter_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/chart/radar_chart/radar_chart_painter_test.dart. // Do not manually edit this file. diff --git a/test/chart/radar_chart/radar_chart_renderer_test.mocks.dart b/test/chart/radar_chart/radar_chart_renderer_test.mocks.dart index 13ac05859..582bb7f19 100644 --- a/test/chart/radar_chart/radar_chart_renderer_test.mocks.dart +++ b/test/chart/radar_chart/radar_chart_renderer_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/chart/radar_chart/radar_chart_renderer_test.dart. // Do not manually edit this file. diff --git a/test/chart/scatter_chart/scatter_chart_painter_test.mocks.dart b/test/chart/scatter_chart/scatter_chart_painter_test.mocks.dart index 3305195d0..03c2ebecc 100644 --- a/test/chart/scatter_chart/scatter_chart_painter_test.mocks.dart +++ b/test/chart/scatter_chart/scatter_chart_painter_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/chart/scatter_chart/scatter_chart_painter_test.dart. // Do not manually edit this file. diff --git a/test/chart/scatter_chart/scatter_chart_renderer_test.mocks.dart b/test/chart/scatter_chart/scatter_chart_renderer_test.mocks.dart index 890e683be..27c49793b 100644 --- a/test/chart/scatter_chart/scatter_chart_renderer_test.mocks.dart +++ b/test/chart/scatter_chart/scatter_chart_renderer_test.mocks.dart @@ -1,23 +1,23 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/chart/scatter_chart/scatter_chart_renderer_test.dart. // Do not manually edit this file. // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:typed_data' as _i7; +import 'dart:typed_data' as _i8; import 'dart:ui' as _i2; -import 'package:fl_chart/fl_chart.dart' as _i13; +import 'package:fl_chart/fl_chart.dart' as _i7; import 'package:fl_chart/src/chart/base/base_chart/base_chart_painter.dart' - as _i12; + as _i13; import 'package:fl_chart/src/chart/scatter_chart/scatter_chart_painter.dart' - as _i10; -import 'package:fl_chart/src/utils/canvas_wrapper.dart' as _i11; + as _i11; +import 'package:fl_chart/src/utils/canvas_wrapper.dart' as _i12; import 'package:flutter/foundation.dart' as _i5; -import 'package:flutter/gestures.dart' as _i8; +import 'package:flutter/gestures.dart' as _i9; import 'package:flutter/material.dart' as _i6; import 'package:flutter/rendering.dart' as _i3; import 'package:flutter/src/rendering/layer.dart' as _i4; -import 'package:flutter/src/widgets/notification_listener.dart' as _i9; +import 'package:flutter/src/widgets/notification_listener.dart' as _i10; import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: type=lint @@ -138,6 +138,16 @@ class _FakeDiagnosticsNode_7 extends _i1.SmartFake super.toString(); } +class _FakeFlSpot_8 extends _i1.SmartFake implements _i7.FlSpot { + _FakeFlSpot_8( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + /// A class which mocks [Canvas]. /// /// See the documentation for Mockito's code generation for more information. @@ -247,7 +257,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { returnValueForMissingStub: null, ); @override - void transform(_i7.Float64List? matrix4) => super.noSuchMethod( + void transform(_i8.Float64List? matrix4) => super.noSuchMethod( Invocation.method( #transform, [matrix4], @@ -255,13 +265,13 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { returnValueForMissingStub: null, ); @override - _i7.Float64List getTransform() => (super.noSuchMethod( + _i8.Float64List getTransform() => (super.noSuchMethod( Invocation.method( #getTransform, [], ), - returnValue: _i7.Float64List(0), - ) as _i7.Float64List); + returnValue: _i8.Float64List(0), + ) as _i8.Float64List); @override void clipRect( _i2.Rect? rect, { @@ -586,7 +596,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { @override void drawRawPoints( _i2.PointMode? pointMode, - _i7.Float32List? points, + _i8.Float32List? points, _i2.Paint? paint, ) => super.noSuchMethod( @@ -645,9 +655,9 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { @override void drawRawAtlas( _i2.Image? atlas, - _i7.Float32List? rstTransforms, - _i7.Float32List? rects, - _i7.Int32List? colors, + _i8.Float32List? rstTransforms, + _i8.Float32List? rects, + _i8.Int32List? colors, _i2.BlendMode? blendMode, _i2.Rect? cullRect, _i2.Paint? paint, @@ -923,7 +933,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { _i4.TransformLayer? pushTransform( bool? needsCompositing, _i2.Offset? offset, - _i8.Matrix4? transform, + _i9.Matrix4? transform, _i3.PaintingContextCallback? painter, { _i4.TransformLayer? oldLayer, }) => @@ -1090,7 +1100,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { returnValueForMissingStub: null, ); @override - void dispatchNotification(_i9.Notification? notification) => + void dispatchNotification(_i10.Notification? notification) => super.noSuchMethod( Invocation.method( #dispatchNotification, @@ -1170,7 +1180,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { /// /// See the documentation for Mockito's code generation for more information. class MockScatterChartPainter extends _i1.Mock - implements _i10.ScatterChartPainter { + implements _i11.ScatterChartPainter { MockScatterChartPainter() { _i1.throwOnMissingStub(this); } @@ -1178,8 +1188,8 @@ class MockScatterChartPainter extends _i1.Mock @override void paint( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1195,8 +1205,8 @@ class MockScatterChartPainter extends _i1.Mock @override void drawSpots( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1212,8 +1222,8 @@ class MockScatterChartPainter extends _i1.Mock @override void drawTouchTooltips( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1229,10 +1239,10 @@ class MockScatterChartPainter extends _i1.Mock @override void drawTouchTooltip( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i13.ScatterTouchTooltipData? tooltipData, - _i13.ScatterSpot? showOnSpot, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i7.ScatterTouchTooltipData? tooltipData, + _i7.ScatterSpot? showOnSpot, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1248,10 +1258,10 @@ class MockScatterChartPainter extends _i1.Mock returnValueForMissingStub: null, ); @override - _i13.ScatterTouchedSpot? handleTouch( + _i7.ScatterTouchedSpot? handleTouch( _i2.Offset? localPosition, _i2.Size? viewSize, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => (super.noSuchMethod(Invocation.method( #handleTouch, @@ -1260,11 +1270,11 @@ class MockScatterChartPainter extends _i1.Mock viewSize, holder, ], - )) as _i13.ScatterTouchedSpot?); + )) as _i7.ScatterTouchedSpot?); @override void drawGrid( - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1278,8 +1288,8 @@ class MockScatterChartPainter extends _i1.Mock ); @override void drawBackground( - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1293,8 +1303,8 @@ class MockScatterChartPainter extends _i1.Mock ); @override void drawRangeAnnotation( - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1309,8 +1319,8 @@ class MockScatterChartPainter extends _i1.Mock @override void drawExtraLines( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1326,8 +1336,8 @@ class MockScatterChartPainter extends _i1.Mock @override void drawHorizontalLines( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.ScatterChartData>? holder, _i2.Size? viewSize, ) => super.noSuchMethod( @@ -1345,8 +1355,8 @@ class MockScatterChartPainter extends _i1.Mock @override void drawVerticalLines( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.ScatterChartData>? holder, _i2.Size? viewSize, ) => super.noSuchMethod( @@ -1365,7 +1375,7 @@ class MockScatterChartPainter extends _i1.Mock double getPixelX( double? spotX, _i2.Size? viewSize, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -1382,7 +1392,7 @@ class MockScatterChartPainter extends _i1.Mock double getPixelY( double? spotY, _i2.Size? viewSize, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -1396,10 +1406,40 @@ class MockScatterChartPainter extends _i1.Mock returnValue: 0.0, ) as double); @override + _i7.FlSpot getTouchedCoordinates( + double? pixelX, + double? pixelY, + _i2.Size? viewSize, + _i13.PaintHolder<_i7.ScatterChartData>? holder, + ) => + (super.noSuchMethod( + Invocation.method( + #getTouchedCoordinates, + [ + pixelX, + pixelY, + viewSize, + holder, + ], + ), + returnValue: _FakeFlSpot_8( + this, + Invocation.method( + #getTouchedCoordinates, + [ + pixelX, + pixelY, + viewSize, + holder, + ], + ), + ), + ) as _i7.FlSpot); + @override double getTooltipLeft( double? dx, double? tooltipWidth, - _i13.FLHorizontalAlignment? tooltipHorizontalAlignment, + _i7.FLHorizontalAlignment? tooltipHorizontalAlignment, double? tooltipHorizontalOffset, ) => (super.noSuchMethod( diff --git a/test/utils/canvas_wrapper_test.mocks.dart b/test/utils/canvas_wrapper_test.mocks.dart index cccfd2559..6eba7105a 100644 --- a/test/utils/canvas_wrapper_test.mocks.dart +++ b/test/utils/canvas_wrapper_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/utils/canvas_wrapper_test.dart. // Do not manually edit this file. diff --git a/test/utils/utils_test.mocks.dart b/test/utils/utils_test.mocks.dart index fe4c97927..3aa8f0cad 100644 --- a/test/utils/utils_test.mocks.dart +++ b/test/utils/utils_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/utils/utils_test.dart. // Do not manually edit this file. From 773cabfaf3ab9772da8ade905ef28a008b6da8d9 Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sat, 26 Aug 2023 21:06:58 +0200 Subject: [PATCH 003/149] Add dragSpotUpdatedCallback functionality --- lib/src/chart/line_chart/line_chart.dart | 14 +++++++- lib/src/chart/line_chart/line_chart_data.dart | 34 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index 82a601469..8de97dab2 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -40,6 +40,8 @@ class _LineChartState extends AnimatedWidgetBaseState { /// but we need to keep the provided callback to notify it too. BaseTouchCallback? _providedTouchCallback; + DragSpotUpdatedCallback? _dragSpotUpdatedCallback; + final List _showingTouchedTooltips = []; final Map> _showingTouchedIndicators = {}; @@ -101,6 +103,7 @@ class _LineChartState extends AnimatedWidgetBaseState { final lineTouchData = widget.data.lineTouchData; if (lineTouchData.enabled && lineTouchData.handleBuiltInTouches) { _providedTouchCallback = lineTouchData.touchCallback; + _dragSpotUpdatedCallback = lineTouchData.dragSpotUpdatedCallback; return widget.data.copyWith( lineBarsData: _lineBarsData, lineTouchData: widget.data.lineTouchData.copyWith( @@ -121,18 +124,25 @@ class _LineChartState extends AnimatedWidgetBaseState { return; } + // Cancel dragging if (event is FlPanEndEvent || event is FlLongPressEnd) { setState(() { _draggingSpotIndexes = null; }); } + // if indexes of dragging spot exist, changes it's position if (_draggingSpotIndexes != null) { + final (barIndex, spotIndex) = _draggingSpotIndexes!; setState(() { - final (barIndex, spotIndex) = _draggingSpotIndexes!; _lineBarsData[barIndex].spots[spotIndex] = touchResponse!.touchedAxesPoint!; }); + _dragSpotUpdatedCallback?.call(UpdatedDragSpotsData( + barIndex, + spotIndex, + _lineBarsData[barIndex].spots, + )); } _providedTouchCallback?.call(event, touchResponse); @@ -162,6 +172,8 @@ class _LineChartState extends AnimatedWidgetBaseState { ..add(ShowingTooltipIndicators(sortedLineSpots)); }); + // If there is needed event and any lineBar with .isDraggable flag exists, + // sets indexes of needed spot and starts dragging process. if (event is FlPanStartEvent || event is FlLongPressStart) { final barIndex = touchResponse.lineBarSpots?.first.barIndex; final spotIndex = touchResponse.lineBarSpots?.first.spotIndex; diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index f4c9ce1ec..388b09683 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -1076,6 +1076,7 @@ class LineTouchData extends FlTouchData with EquatableMixin { BaseTouchCallback? touchCallback, MouseCursorResolver? mouseCursorResolver, Duration? longPressDuration, + this.dragSpotUpdatedCallback, this.touchTooltipData = const LineTouchTooltipData(), this.getTouchedSpotIndicator = defaultTouchedIndicators, this.touchSpotThreshold = 10, @@ -1096,6 +1097,8 @@ class LineTouchData extends FlTouchData with EquatableMixin { /// Configs of how touch indicator looks like. final GetTouchedSpotIndicator getTouchedSpotIndicator; + final DragSpotUpdatedCallback? dragSpotUpdatedCallback; + /// Distance threshold to handle the touch event. final double touchSpotThreshold; @@ -1120,6 +1123,7 @@ class LineTouchData extends FlTouchData with EquatableMixin { bool? enabled, BaseTouchCallback? touchCallback, MouseCursorResolver? mouseCursorResolver, + DragSpotUpdatedCallback? dragSpotUpdatedCallback, Duration? longPressDuration, LineTouchTooltipData? touchTooltipData, GetTouchedSpotIndicator? getTouchedSpotIndicator, @@ -1133,6 +1137,8 @@ class LineTouchData extends FlTouchData with EquatableMixin { enabled: enabled ?? this.enabled, touchCallback: touchCallback ?? this.touchCallback, mouseCursorResolver: mouseCursorResolver ?? this.mouseCursorResolver, + dragSpotUpdatedCallback: + dragSpotUpdatedCallback ?? this.dragSpotUpdatedCallback, longPressDuration: longPressDuration ?? this.longPressDuration, touchTooltipData: touchTooltipData ?? this.touchTooltipData, getTouchedSpotIndicator: @@ -1159,6 +1165,7 @@ class LineTouchData extends FlTouchData with EquatableMixin { handleBuiltInTouches, getTouchLineStart, getTouchLineEnd, + dragSpotUpdatedCallback, ]; } @@ -1185,6 +1192,8 @@ typedef CalculateTouchDistance = double Function( Offset spotPixelCoordinates, ); +typedef DragSpotUpdatedCallback = void Function(UpdatedDragSpotsData); + /// Default distanceCalculator only considers distance on x axis double _xDistance(Offset touchPoint, Offset spotPixelCoordinates) { return (touchPoint.dx - spotPixelCoordinates.dx).abs(); @@ -1387,6 +1396,31 @@ class LineBarSpot extends FlSpot with EquatableMixin { ]; } +/// Contains information about spots that have been updated using dragging feature. +class UpdatedDragSpotsData with EquatableMixin { + const UpdatedDragSpotsData( + this.updatedBarIndex, + this.updatedSpotIndex, + this.newSpots, + ); + + /// Index of updated bar + final int updatedBarIndex; + + /// Index of updated spot + final int updatedSpotIndex; + + /// New list of spots in updated line bar + final List newSpots; + + @override + List get props => [ + updatedBarIndex, + updatedSpotIndex, + newSpots, + ]; +} + /// A [LineBarSpot] that holds information about the event that selected it class TouchLineBarSpot extends LineBarSpot { TouchLineBarSpot( From 8430ec3e3fbd9a79c92901cfe0462f21e7a7eece Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sat, 26 Aug 2023 21:16:48 +0200 Subject: [PATCH 004/149] Update changelog --- CHANGELOG.md | 1 + lib/src/chart/line_chart/line_chart.dart | 12 +++++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 99114db56..2ef4cbfd4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ * **BUGFIX** (by @Anas35) Fix Tooltip not displaying when value from BackgroundBarChartRodData is less than zero. #1345. * **BUGFIX** (by @imaNNeo) Fix Negative BarChartRodStackItem are not drawn correctly bug, #1347 * **BUGFIX** (by @imaNNeo) Fix bar_chart_helper minY calculation bug, #1388 +* **FEATURE** (by @G33kFreak) Add drag spots feature for LineChart, [#1420](https://github.com/imaNNeo/fl_chart/issues/1420) ## 0.63.0 * **BUGFIX** (by @imaNNeo) Fix PieChart crash on web-renderer html by ignoring `sectionsSpace` when `Path.combine()` does not work (it's flutter engine [issue](https://github.com/flutter/flutter/issues/44572)), #955 diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index 8de97dab2..95cd3a3a2 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -138,11 +138,13 @@ class _LineChartState extends AnimatedWidgetBaseState { _lineBarsData[barIndex].spots[spotIndex] = touchResponse!.touchedAxesPoint!; }); - _dragSpotUpdatedCallback?.call(UpdatedDragSpotsData( - barIndex, - spotIndex, - _lineBarsData[barIndex].spots, - )); + _dragSpotUpdatedCallback?.call( + UpdatedDragSpotsData( + barIndex, + spotIndex, + _lineBarsData[barIndex].spots, + ), + ); } _providedTouchCallback?.call(event, touchResponse); From 99d24842859dd80f9415fd204d19a79e1289fbbc Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sat, 26 Aug 2023 21:46:12 +0200 Subject: [PATCH 005/149] Add sample of draggable line chart --- .../presentation/samples/chart_samples.dart | 2 + .../samples/line/line_chart_sample12.dart | 132 ++++++++++++++++++ lib/src/chart/line_chart/line_chart.dart | 24 ++-- lib/src/chart/line_chart/line_chart_data.dart | 14 +- 4 files changed, 155 insertions(+), 17 deletions(-) create mode 100644 example/lib/presentation/samples/line/line_chart_sample12.dart diff --git a/example/lib/presentation/samples/chart_samples.dart b/example/lib/presentation/samples/chart_samples.dart index 4114cd5f6..f5c789554 100644 --- a/example/lib/presentation/samples/chart_samples.dart +++ b/example/lib/presentation/samples/chart_samples.dart @@ -11,6 +11,7 @@ import 'chart_sample.dart'; import 'line/line_chart_sample1.dart'; import 'line/line_chart_sample10.dart'; import 'line/line_chart_sample11.dart'; +import 'line/line_chart_sample12.dart'; import 'line/line_chart_sample2.dart'; import 'line/line_chart_sample3.dart'; import 'line/line_chart_sample4.dart'; @@ -40,6 +41,7 @@ class ChartSamples { LineChartSample(9, (context) => LineChartSample9()), LineChartSample(10, (context) => const LineChartSample10()), LineChartSample(11, (context) => const LineChartSample11()), + LineChartSample(11, (context) => const LineChartSample12()), ], ChartType.bar: [ BarChartSample(1, (context) => BarChartSample1()), diff --git a/example/lib/presentation/samples/line/line_chart_sample12.dart b/example/lib/presentation/samples/line/line_chart_sample12.dart new file mode 100644 index 000000000..102f644a4 --- /dev/null +++ b/example/lib/presentation/samples/line/line_chart_sample12.dart @@ -0,0 +1,132 @@ +import 'package:fl_chart/fl_chart.dart'; +import 'package:fl_chart_app/presentation/resources/app_colors.dart'; +import 'package:flutter/material.dart'; + +class LineChartSample12 extends StatefulWidget { + const LineChartSample12({super.key}); + + @override + State createState() => _LineChartSample12State(); +} + +class _LineChartSample12State extends State { + List get spots1 => [ + const FlSpot(1, 3), + const FlSpot(2, 2), + const FlSpot(4, 5), + const FlSpot(6, 4), + ]; + List get spots2 => [ + const FlSpot(1, 1), + const FlSpot(2, 4), + const FlSpot(3, 6), + const FlSpot(5, 3), + ]; + + UpdatedDragSpotsData? _lastUpdate; + + void _onUpdated(UpdatedDragSpotsData newUpdate) { + setState(() { + _lastUpdate = newUpdate; + }); + } + + String get _formattedLastSpotValue { + if (_lastUpdate == null) { + return 'Updated spot: None'; + } + + final flSpot = _lastUpdate!.newSpots[_lastUpdate!.updatedSpotIndex]; + + return 'new X: ${flSpot.x.toStringAsFixed(2)}, new Y: ${flSpot.y.toStringAsFixed(2)}'; + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + const SizedBox(height: 12), + Text( + 'Last updated bar index: ${_lastUpdate?.updatedBarIndex ?? 'none'}', + style: const TextStyle( + color: AppColors.mainTextColor2, + fontSize: 12, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 12), + Text( + 'Last updated spot index: ${_lastUpdate?.updatedSpotIndex ?? 'none'}', + style: const TextStyle( + color: AppColors.mainTextColor2, + fontSize: 12, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 12), + Text( + _formattedLastSpotValue, + style: const TextStyle( + color: AppColors.mainTextColor2, + fontSize: 12, + fontWeight: FontWeight.bold, + ), + ), + AspectRatio( + aspectRatio: 1, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 24.0, + vertical: 10, + ), + child: LayoutBuilder(builder: (context, constraints) { + return LineChart( + LineChartData( + minY: 0, + minX: 0, + maxX: 8, + maxY: 8, + lineTouchData: LineTouchData( + enabled: true, + handleBuiltInTouches: true, + dragSpotUpdateFinishedCallback: _onUpdated, + getTouchedSpotIndicator: + (LineChartBarData barData, List spotIndexes) { + return spotIndexes.map((index) {}).toList(); + }, + touchTooltipData: LineTouchTooltipData( + tooltipBgColor: Colors.transparent, + getTooltipItems: (List lineBarsSpot) { + return lineBarsSpot.map((lineBarSpot) {}).toList(); + }, + ), + ), + lineBarsData: [ + LineChartBarData( + spots: spots1, + isCurved: true, + isDraggable: true, + ), + LineChartBarData( + spots: spots2, + isCurved: true, + isDraggable: false, + color: Colors.red, + ), + ], + gridData: const FlGridData(show: false), + borderData: FlBorderData( + show: true, + border: Border.all( + color: AppColors.borderColor, + ), + ), + ), + ); + }), + ), + ), + ], + ); + } +} diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index 95cd3a3a2..c8dd325b7 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -2,6 +2,7 @@ import 'package:fl_chart/fl_chart.dart'; import 'package:fl_chart/src/chart/base/axis_chart/axis_chart_scaffold_widget.dart'; import 'package:fl_chart/src/chart/line_chart/line_chart_renderer.dart'; import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; /// Renders a line chart as a widget, using provided [LineChartData]. @@ -40,7 +41,7 @@ class _LineChartState extends AnimatedWidgetBaseState { /// but we need to keep the provided callback to notify it too. BaseTouchCallback? _providedTouchCallback; - DragSpotUpdatedCallback? _dragSpotUpdatedCallback; + DragSpotUpdateFinishedCallback? _dragSpotUpdatedCallback; final List _showingTouchedTooltips = []; @@ -62,7 +63,7 @@ class _LineChartState extends AnimatedWidgetBaseState { @override void didUpdateWidget(covariant LineChart oldWidget) { - if (widget.data.lineBarsData != _lineBarsData) { + if (!listEquals(oldWidget.data.lineBarsData, widget.data.lineBarsData)) { _lineBarsData = List.from(widget.data.lineBarsData); } super.didUpdateWidget(oldWidget); @@ -103,7 +104,7 @@ class _LineChartState extends AnimatedWidgetBaseState { final lineTouchData = widget.data.lineTouchData; if (lineTouchData.enabled && lineTouchData.handleBuiltInTouches) { _providedTouchCallback = lineTouchData.touchCallback; - _dragSpotUpdatedCallback = lineTouchData.dragSpotUpdatedCallback; + _dragSpotUpdatedCallback = lineTouchData.dragSpotUpdateFinishedCallback; return widget.data.copyWith( lineBarsData: _lineBarsData, lineTouchData: widget.data.lineTouchData.copyWith( @@ -126,6 +127,16 @@ class _LineChartState extends AnimatedWidgetBaseState { // Cancel dragging if (event is FlPanEndEvent || event is FlLongPressEnd) { + if (_draggingSpotIndexes != null) { + final (barIndex, spotIndex) = _draggingSpotIndexes!; + _dragSpotUpdatedCallback?.call( + UpdatedDragSpotsData( + barIndex, + spotIndex, + _lineBarsData[barIndex].spots, + ), + ); + } setState(() { _draggingSpotIndexes = null; }); @@ -138,13 +149,6 @@ class _LineChartState extends AnimatedWidgetBaseState { _lineBarsData[barIndex].spots[spotIndex] = touchResponse!.touchedAxesPoint!; }); - _dragSpotUpdatedCallback?.call( - UpdatedDragSpotsData( - barIndex, - spotIndex, - _lineBarsData[barIndex].spots, - ), - ); } _providedTouchCallback?.call(event, touchResponse); diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index 388b09683..268c8cb6d 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -1076,7 +1076,7 @@ class LineTouchData extends FlTouchData with EquatableMixin { BaseTouchCallback? touchCallback, MouseCursorResolver? mouseCursorResolver, Duration? longPressDuration, - this.dragSpotUpdatedCallback, + this.dragSpotUpdateFinishedCallback, this.touchTooltipData = const LineTouchTooltipData(), this.getTouchedSpotIndicator = defaultTouchedIndicators, this.touchSpotThreshold = 10, @@ -1097,7 +1097,7 @@ class LineTouchData extends FlTouchData with EquatableMixin { /// Configs of how touch indicator looks like. final GetTouchedSpotIndicator getTouchedSpotIndicator; - final DragSpotUpdatedCallback? dragSpotUpdatedCallback; + final DragSpotUpdateFinishedCallback? dragSpotUpdateFinishedCallback; /// Distance threshold to handle the touch event. final double touchSpotThreshold; @@ -1123,7 +1123,7 @@ class LineTouchData extends FlTouchData with EquatableMixin { bool? enabled, BaseTouchCallback? touchCallback, MouseCursorResolver? mouseCursorResolver, - DragSpotUpdatedCallback? dragSpotUpdatedCallback, + DragSpotUpdateFinishedCallback? dragSpotUpdateFinishedCallback, Duration? longPressDuration, LineTouchTooltipData? touchTooltipData, GetTouchedSpotIndicator? getTouchedSpotIndicator, @@ -1137,8 +1137,8 @@ class LineTouchData extends FlTouchData with EquatableMixin { enabled: enabled ?? this.enabled, touchCallback: touchCallback ?? this.touchCallback, mouseCursorResolver: mouseCursorResolver ?? this.mouseCursorResolver, - dragSpotUpdatedCallback: - dragSpotUpdatedCallback ?? this.dragSpotUpdatedCallback, + dragSpotUpdateFinishedCallback: + dragSpotUpdateFinishedCallback ?? this.dragSpotUpdateFinishedCallback, longPressDuration: longPressDuration ?? this.longPressDuration, touchTooltipData: touchTooltipData ?? this.touchTooltipData, getTouchedSpotIndicator: @@ -1165,7 +1165,7 @@ class LineTouchData extends FlTouchData with EquatableMixin { handleBuiltInTouches, getTouchLineStart, getTouchLineEnd, - dragSpotUpdatedCallback, + dragSpotUpdateFinishedCallback, ]; } @@ -1192,7 +1192,7 @@ typedef CalculateTouchDistance = double Function( Offset spotPixelCoordinates, ); -typedef DragSpotUpdatedCallback = void Function(UpdatedDragSpotsData); +typedef DragSpotUpdateFinishedCallback = void Function(UpdatedDragSpotsData); /// Default distanceCalculator only considers distance on x axis double _xDistance(Offset touchPoint, Offset spotPixelCoordinates) { From c96551aa6d6e52e7583348e57553a424a647ccde Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sat, 26 Aug 2023 22:32:35 +0200 Subject: [PATCH 006/149] minor fixes --- example/lib/presentation/samples/chart_samples.dart | 2 +- lib/src/chart/line_chart/line_chart.dart | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/example/lib/presentation/samples/chart_samples.dart b/example/lib/presentation/samples/chart_samples.dart index f5c789554..9bcde69e3 100644 --- a/example/lib/presentation/samples/chart_samples.dart +++ b/example/lib/presentation/samples/chart_samples.dart @@ -41,7 +41,7 @@ class ChartSamples { LineChartSample(9, (context) => LineChartSample9()), LineChartSample(10, (context) => const LineChartSample10()), LineChartSample(11, (context) => const LineChartSample11()), - LineChartSample(11, (context) => const LineChartSample12()), + LineChartSample(12, (context) => const LineChartSample12()), ], ChartType.bar: [ BarChartSample(1, (context) => BarChartSample1()), diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index c8dd325b7..039956b37 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -63,7 +63,18 @@ class _LineChartState extends AnimatedWidgetBaseState { @override void didUpdateWidget(covariant LineChart oldWidget) { - if (!listEquals(oldWidget.data.lineBarsData, widget.data.lineBarsData)) { + final oldSpots = oldWidget.data.lineBarsData + .map((e) => e.spots) + .toList() + .expand((list) => list) + .toList(); + final currentSpots = oldWidget.data.lineBarsData + .map((e) => e.spots) + .toList() + .expand((list) => list) + .toList(); + + if (!listEquals(oldSpots, currentSpots)) { _lineBarsData = List.from(widget.data.lineBarsData); } super.didUpdateWidget(oldWidget); From 4eeeb77fd70229a6582d4b691e14d70c41017786 Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sat, 26 Aug 2023 23:31:00 +0200 Subject: [PATCH 007/149] Change the comparing logic in didUpdateWidget --- lib/src/chart/line_chart/line_chart.dart | 14 +++++++++++++- lib/src/chart/line_chart/line_chart_data.dart | 1 + 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index 039956b37..9d03b1e5f 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -57,12 +57,24 @@ class _LineChartState extends AnimatedWidgetBaseState { @override void initState() { - _lineBarsData = List.from(widget.data.lineBarsData); + _lineBarsData = List.from( + widget.data.lineBarsData + .map((lineBarData) => lineBarData.copyWith()) + .toList(), + ); super.initState(); } @override void didUpdateWidget(covariant LineChart oldWidget) { + if (!listEquals(oldWidget.data.lineBarsData, widget.data.lineBarsData)) { + _lineBarsData = List.from( + widget.data.lineBarsData + .map((lineBarData) => lineBarData.copyWith()) + .toList(), + ); + } + final oldSpots = oldWidget.data.lineBarsData .map((e) => e.spots) .toList() diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index 268c8cb6d..453f79848 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -479,6 +479,7 @@ class LineChartBarData with EquatableMixin { shadow, isStepLineChart, lineChartStepData, + isDraggable, ]; } From ffe2237377986b8f456df78b9a04ba25e3d39cfc Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sun, 27 Aug 2023 00:06:49 +0200 Subject: [PATCH 008/149] Removed unnecessary logic --- lib/src/chart/line_chart/line_chart.dart | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index 9d03b1e5f..d46ddf25d 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -74,21 +74,6 @@ class _LineChartState extends AnimatedWidgetBaseState { .toList(), ); } - - final oldSpots = oldWidget.data.lineBarsData - .map((e) => e.spots) - .toList() - .expand((list) => list) - .toList(); - final currentSpots = oldWidget.data.lineBarsData - .map((e) => e.spots) - .toList() - .expand((list) => list) - .toList(); - - if (!listEquals(oldSpots, currentSpots)) { - _lineBarsData = List.from(widget.data.lineBarsData); - } super.didUpdateWidget(oldWidget); } From 4c6d2b34c37ab31b3368a9ff71ad9a361a82e218 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 21:21:36 +0000 Subject: [PATCH 009/149] chore: bump actions/checkout from 2 to 4 Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v2...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/codecov.yml | 2 +- .github/workflows/gh-pages.yml | 2 +- .github/workflows/publish.yml | 2 +- .github/workflows/verification.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml index f13703bc7..7a07f1f62 100644 --- a/.github/workflows/codecov.yml +++ b/.github/workflows/codecov.yml @@ -6,7 +6,7 @@ jobs: upload: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup Flutter uses: subosito/flutter-action@v2 with: diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index a2a877792..e059d988e 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 # Only works with v2 + - uses: actions/checkout@v4 # Only works with v2 - uses: subosito/flutter-action@v2 - uses: bluefireteam/flutter-gh-pages@v8 with: diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index e851938f7..6abe16ea1 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -11,7 +11,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Publish uses: k-paxian/dart-package-publisher@master with: diff --git a/.github/workflows/verification.yml b/.github/workflows/verification.yml index 1ab4bffef..d625afed6 100644 --- a/.github/workflows/verification.yml +++ b/.github/workflows/verification.yml @@ -6,7 +6,7 @@ jobs: verify: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup Flutter uses: subosito/flutter-action@v2 with: From ce49b92e1a649bb6c5a24ed930e2b2ae8122d90f Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Sun, 1 Oct 2023 11:10:28 +0200 Subject: [PATCH 010/149] Fix donation link in README.md file --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2cbee33fe..a19ccbe3d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ 📊 FL Chart is a highly customizable Flutter chart library that supports **[Line Chart](https://app.flchart.dev/#/line)**, **[Bar Chart](https://app.flchart.dev/#/bar)**, **[Pie Chart](https://app.flchart.dev/#/pie)**, **[Scatter Chart](https://app.flchart.dev/#/scatter)**, and **[Radar Chart](https://app.flchart.dev/#/radar)**. -✅ Do you want to **motivate me to work more on fl_chart?** You can **[donate me](https://github.com/imaNNeo/fl_chart/edit/master/README.md#donation)** ;) +✅ Do you want to **motivate me to work more on fl_chart?** You can **[donate me](https://github.com/imaNNeo/fl_chart#donation)** ;) ![FL Chart Logo](https://github.com/imaNNeo/fl_chart/raw/master/repo_files/images/landing_logo.jpg) From e074877a81a4f379780e0c8c0b44a84091f75062 Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sun, 1 Oct 2023 14:13:21 +0200 Subject: [PATCH 011/149] Add draggable callbacks --- lib/src/chart/line_chart/line_chart.dart | 23 ++++++++++++++++--- lib/src/chart/line_chart/line_chart_data.dart | 23 ++++++++++++++++--- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index d46ddf25d..123c64711 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -41,7 +41,9 @@ class _LineChartState extends AnimatedWidgetBaseState { /// but we need to keep the provided callback to notify it too. BaseTouchCallback? _providedTouchCallback; - DragSpotUpdateFinishedCallback? _dragSpotUpdatedCallback; + DragSpotUpdateCallback? _dragSpotUpdateFinishedCallback; + DragSpotUpdateCallback? _dragSpotUpdateCallback; + DragSpotUpdateCallback? _dragSpotUpdateStartedCallback; final List _showingTouchedTooltips = []; @@ -112,7 +114,8 @@ class _LineChartState extends AnimatedWidgetBaseState { final lineTouchData = widget.data.lineTouchData; if (lineTouchData.enabled && lineTouchData.handleBuiltInTouches) { _providedTouchCallback = lineTouchData.touchCallback; - _dragSpotUpdatedCallback = lineTouchData.dragSpotUpdateFinishedCallback; + _dragSpotUpdateFinishedCallback = + lineTouchData.dragSpotUpdateFinishedCallback; return widget.data.copyWith( lineBarsData: _lineBarsData, lineTouchData: widget.data.lineTouchData.copyWith( @@ -137,7 +140,7 @@ class _LineChartState extends AnimatedWidgetBaseState { if (event is FlPanEndEvent || event is FlLongPressEnd) { if (_draggingSpotIndexes != null) { final (barIndex, spotIndex) = _draggingSpotIndexes!; - _dragSpotUpdatedCallback?.call( + _dragSpotUpdateFinishedCallback?.call( UpdatedDragSpotsData( barIndex, spotIndex, @@ -157,6 +160,13 @@ class _LineChartState extends AnimatedWidgetBaseState { _lineBarsData[barIndex].spots[spotIndex] = touchResponse!.touchedAxesPoint!; }); + _dragSpotUpdateCallback?.call( + UpdatedDragSpotsData( + barIndex, + spotIndex, + _lineBarsData[barIndex].spots, + ), + ); } _providedTouchCallback?.call(event, touchResponse); @@ -200,6 +210,13 @@ class _LineChartState extends AnimatedWidgetBaseState { _draggingSpotIndexes = (barIndex, spotIndex); }); } + _dragSpotUpdateStartedCallback?.call( + UpdatedDragSpotsData( + barIndex, + spotIndex, + _lineBarsData[barIndex].spots, + ), + ); } } } diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index 453f79848..5230eb441 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -1078,6 +1078,8 @@ class LineTouchData extends FlTouchData with EquatableMixin { MouseCursorResolver? mouseCursorResolver, Duration? longPressDuration, this.dragSpotUpdateFinishedCallback, + this.dragSpotUpdateCallback, + this.dragSpotUpdateStartedCallback, this.touchTooltipData = const LineTouchTooltipData(), this.getTouchedSpotIndicator = defaultTouchedIndicators, this.touchSpotThreshold = 10, @@ -1098,7 +1100,14 @@ class LineTouchData extends FlTouchData with EquatableMixin { /// Configs of how touch indicator looks like. final GetTouchedSpotIndicator getTouchedSpotIndicator; - final DragSpotUpdateFinishedCallback? dragSpotUpdateFinishedCallback; + /// Action when dragging of draggable spot is finished. + final DragSpotUpdateCallback? dragSpotUpdateFinishedCallback; + + /// Action when draggable spot has been updated. + final DragSpotUpdateCallback? dragSpotUpdateCallback; + + /// Action when dragging of draggable spot has been started + final DragSpotUpdateCallback? dragSpotUpdateStartedCallback; /// Distance threshold to handle the touch event. final double touchSpotThreshold; @@ -1124,7 +1133,9 @@ class LineTouchData extends FlTouchData with EquatableMixin { bool? enabled, BaseTouchCallback? touchCallback, MouseCursorResolver? mouseCursorResolver, - DragSpotUpdateFinishedCallback? dragSpotUpdateFinishedCallback, + DragSpotUpdateCallback? dragSpotUpdateFinishedCallback, + DragSpotUpdateCallback? dragSpotUpdateCallback, + DragSpotUpdateCallback? dragSpotUpdateStartedCallback, Duration? longPressDuration, LineTouchTooltipData? touchTooltipData, GetTouchedSpotIndicator? getTouchedSpotIndicator, @@ -1140,6 +1151,10 @@ class LineTouchData extends FlTouchData with EquatableMixin { mouseCursorResolver: mouseCursorResolver ?? this.mouseCursorResolver, dragSpotUpdateFinishedCallback: dragSpotUpdateFinishedCallback ?? this.dragSpotUpdateFinishedCallback, + dragSpotUpdateCallback: + dragSpotUpdateCallback ?? this.dragSpotUpdateCallback, + dragSpotUpdateStartedCallback: + dragSpotUpdateStartedCallback ?? this.dragSpotUpdateStartedCallback, longPressDuration: longPressDuration ?? this.longPressDuration, touchTooltipData: touchTooltipData ?? this.touchTooltipData, getTouchedSpotIndicator: @@ -1167,6 +1182,8 @@ class LineTouchData extends FlTouchData with EquatableMixin { getTouchLineStart, getTouchLineEnd, dragSpotUpdateFinishedCallback, + dragSpotUpdateCallback, + dragSpotUpdateStartedCallback, ]; } @@ -1193,7 +1210,7 @@ typedef CalculateTouchDistance = double Function( Offset spotPixelCoordinates, ); -typedef DragSpotUpdateFinishedCallback = void Function(UpdatedDragSpotsData); +typedef DragSpotUpdateCallback = void Function(UpdatedDragSpotsData); /// Default distanceCalculator only considers distance on x axis double _xDistance(Offset touchPoint, Offset spotPixelCoordinates) { From f883446d00ba5ca122e06de67cd73e65ea67e5d9 Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sat, 26 Aug 2023 18:09:34 +0200 Subject: [PATCH 012/149] Add draggable logic for LineChart --- .../base/axis_chart/axis_chart_painter.dart | 19 ++++++++++ lib/src/chart/line_chart/line_chart.dart | 38 ++++++++++++++++++- lib/src/chart/line_chart/line_chart_data.dart | 8 ++++ .../chart/line_chart/line_chart_painter.dart | 8 ++++ 4 files changed, 71 insertions(+), 2 deletions(-) diff --git a/lib/src/chart/base/axis_chart/axis_chart_painter.dart b/lib/src/chart/base/axis_chart/axis_chart_painter.dart index 610e0dac5..46967ccf8 100644 --- a/lib/src/chart/base/axis_chart/axis_chart_painter.dart +++ b/lib/src/chart/base/axis_chart/axis_chart_painter.dart @@ -410,6 +410,25 @@ abstract class AxisChartPainter return viewSize.height - (((spotY - data.minY) / deltaY) * viewSize.height); } + /// Function converts pixelX and pixelY to the [FlSpot], + /// reversed logic of [getPixelY] and [getPixelX] + FlSpot getTouchedCoordinates( + double pixelX, + double pixelY, + Size viewSize, + PaintHolder holder, + ) { + final data = holder.data; + final deltaY = data.maxY - data.minY; + final deltaX = data.maxX - data.minX; + + final x = ((pixelX * deltaX) / viewSize.width) + data.minX; + final y = + ((viewSize.height - pixelY) * deltaY) / viewSize.height + data.minY; + + return FlSpot(x, y); + } + /// With this function we can get horizontal /// position for the tooltip. double getTooltipLeft( diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index cee6c9d60..3c6c3bdcb 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -44,6 +44,22 @@ class _LineChartState extends AnimatedWidgetBaseState { final Map> _showingTouchedIndicators = {}; + List _lineBarsData = []; + + @override + void initState() { + _lineBarsData = widget.data.lineBarsData; + super.initState(); + } + + @override + void didUpdateWidget(covariant LineChart oldWidget) { + if (widget.data.lineBarsData != _lineBarsData) { + _lineBarsData = widget.data.lineBarsData; + } + super.didUpdateWidget(oldWidget); + } + @override Widget build(BuildContext context) { final showingData = _getData(); @@ -80,11 +96,13 @@ class _LineChartState extends AnimatedWidgetBaseState { if (lineTouchData.enabled && lineTouchData.handleBuiltInTouches) { _providedTouchCallback = lineTouchData.touchCallback; return widget.data.copyWith( + lineBarsData: _lineBarsData, lineTouchData: widget.data.lineTouchData .copyWith(touchCallback: _handleBuiltInTouch), ); } - return widget.data; + + return widget.data.copyWith(lineBarsData: _lineBarsData); } void _handleBuiltInTouch( @@ -94,8 +112,8 @@ class _LineChartState extends AnimatedWidgetBaseState { if (!mounted) { return; } - _providedTouchCallback?.call(event, touchResponse); + _providedTouchCallback?.call(event, touchResponse); if (!event.isInterestedForInteractions || touchResponse?.lineBarSpots == null || touchResponse!.lineBarSpots!.isEmpty) { @@ -121,6 +139,22 @@ class _LineChartState extends AnimatedWidgetBaseState { ..clear() ..add(ShowingTooltipIndicators(sortedLineSpots)); }); + + if (event is FlPanStartEvent || event is FlPanUpdateEvent) { + final barIndex = touchResponse.lineBarSpots?.first.barIndex; + final spotIndex = touchResponse.lineBarSpots?.first.spotIndex; + final newDataSpot = touchResponse.lineBarSpots?.first.touchedAxesPoint; + + if (spotIndex != null && newDataSpot != null && barIndex != null) { + final isDraggable = widget.data.lineBarsData[barIndex].isDraggable; + + if (isDraggable) { + setState(() { + _lineBarsData[barIndex].spots[spotIndex] = newDataSpot; + }); + } + } + } } @override diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index 6c2b7d18f..2b0a4a7fa 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -246,6 +246,7 @@ class LineChartBarData with EquatableMixin { this.shadow = const Shadow(color: Colors.transparent), this.isStepLineChart = false, this.lineChartStepData = const LineChartStepData(), + this.isDraggable = false, }) : color = color ?? ((color == null && gradient == null) ? Colors.cyan : null), belowBarData = belowBarData ?? BarAreaData(), @@ -311,6 +312,9 @@ class LineChartBarData with EquatableMixin { /// Determines to show or hide the line. final bool show; + /// Determines if spots are draggable + final bool isDraggable; + /// If provided, this [LineChartBarData] draws with this [color] /// Otherwise we use [gradient] to draw the background. /// It throws an exception if you provide both [color] and [gradient] @@ -1376,10 +1380,14 @@ class TouchLineBarSpot extends LineBarSpot { super.barIndex, super.spot, this.distance, + this.touchedAxesPoint, ); /// Distance in pixels from where the user taped final double distance; + + /// Position in spots' values converted from local position + final FlSpot touchedAxesPoint; } /// Holds data of showing each row item in the tooltip popup. diff --git a/lib/src/chart/line_chart/line_chart_painter.dart b/lib/src/chart/line_chart/line_chart_painter.dart index 3cc5a6060..c6acdaf07 100644 --- a/lib/src/chart/line_chart/line_chart_painter.dart +++ b/lib/src/chart/line_chart/line_chart_painter.dart @@ -1233,6 +1233,13 @@ class LineChartPainter extends AxisChartPainter { return null; } + final axesPoint = getTouchedCoordinates( + touchedPoint.dx, + touchedPoint.dy, + viewSize, + holder, + ); + /// Find the nearest spot (based on distanceCalculator) final sortedSpots = []; double? smallestDistance; @@ -1264,6 +1271,7 @@ class LineChartPainter extends AxisChartPainter { barDataPosition, sortedSpots.first, smallestDistance!, + axesPoint, ); } else { return null; From 0bfef57a312f62be8285ca62fd11cd40d0755dff Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sat, 26 Aug 2023 20:41:27 +0200 Subject: [PATCH 013/149] Remake logic of updating spot's position and adjust tests --- lib/src/chart/line_chart/line_chart.dart | 39 ++- lib/src/chart/line_chart/line_chart_data.dart | 29 +- .../chart/line_chart/line_chart_painter.dart | 23 +- .../chart/line_chart/line_chart_renderer.dart | 4 +- .../bar_chart_painter_test.mocks.dart | 2 +- .../bar_chart_renderer_test.mocks.dart | 150 ++++++---- test/chart/data_pool.dart | 20 +- .../line_chart/line_chart_painter_test.dart | 32 ++- .../line_chart_painter_test.mocks.dart | 258 ++++++++++------- .../line_chart/line_chart_renderer_test.dart | 2 +- .../line_chart_renderer_test.mocks.dart | 266 +++++++++++------- .../pie_chart_painter_test.mocks.dart | 2 +- .../pie_chart_renderer_test.mocks.dart | 2 +- .../radar_chart_painter_test.mocks.dart | 2 +- .../radar_chart_renderer_test.mocks.dart | 2 +- .../scatter_chart_painter_test.mocks.dart | 2 +- .../scatter_chart_renderer_test.mocks.dart | 134 +++++---- test/utils/canvas_wrapper_test.mocks.dart | 2 +- test/utils/utils_test.mocks.dart | 2 +- 19 files changed, 616 insertions(+), 357 deletions(-) diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index 3c6c3bdcb..82a601469 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -46,16 +46,22 @@ class _LineChartState extends AnimatedWidgetBaseState { List _lineBarsData = []; + /// Keeps index of bar and spot that currently is being dragging + (int barIndex, int spotIndex)? _draggingSpotIndexes; + + bool get _isAnyDraggable => + _lineBarsData.indexWhere((lineBarData) => lineBarData.isDraggable) != -1; + @override void initState() { - _lineBarsData = widget.data.lineBarsData; + _lineBarsData = List.from(widget.data.lineBarsData); super.initState(); } @override void didUpdateWidget(covariant LineChart oldWidget) { if (widget.data.lineBarsData != _lineBarsData) { - _lineBarsData = widget.data.lineBarsData; + _lineBarsData = List.from(widget.data.lineBarsData); } super.didUpdateWidget(oldWidget); } @@ -97,12 +103,14 @@ class _LineChartState extends AnimatedWidgetBaseState { _providedTouchCallback = lineTouchData.touchCallback; return widget.data.copyWith( lineBarsData: _lineBarsData, - lineTouchData: widget.data.lineTouchData - .copyWith(touchCallback: _handleBuiltInTouch), + lineTouchData: widget.data.lineTouchData.copyWith( + touchCallback: _handleBuiltInTouch, + distanceCalculator: _isAnyDraggable ? vectorDistanceCalculator : null, + ), ); } - return widget.data.copyWith(lineBarsData: _lineBarsData); + return widget.data; } void _handleBuiltInTouch( @@ -113,6 +121,20 @@ class _LineChartState extends AnimatedWidgetBaseState { return; } + if (event is FlPanEndEvent || event is FlLongPressEnd) { + setState(() { + _draggingSpotIndexes = null; + }); + } + + if (_draggingSpotIndexes != null) { + setState(() { + final (barIndex, spotIndex) = _draggingSpotIndexes!; + _lineBarsData[barIndex].spots[spotIndex] = + touchResponse!.touchedAxesPoint!; + }); + } + _providedTouchCallback?.call(event, touchResponse); if (!event.isInterestedForInteractions || touchResponse?.lineBarSpots == null || @@ -140,17 +162,16 @@ class _LineChartState extends AnimatedWidgetBaseState { ..add(ShowingTooltipIndicators(sortedLineSpots)); }); - if (event is FlPanStartEvent || event is FlPanUpdateEvent) { + if (event is FlPanStartEvent || event is FlLongPressStart) { final barIndex = touchResponse.lineBarSpots?.first.barIndex; final spotIndex = touchResponse.lineBarSpots?.first.spotIndex; - final newDataSpot = touchResponse.lineBarSpots?.first.touchedAxesPoint; - if (spotIndex != null && newDataSpot != null && barIndex != null) { + if (spotIndex != null && barIndex != null) { final isDraggable = widget.data.lineBarsData[barIndex].isDraggable; if (isDraggable) { setState(() { - _lineBarsData[barIndex].spots[spotIndex] = newDataSpot; + _draggingSpotIndexes = (barIndex, spotIndex); }); } } diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index 2b0a4a7fa..f4c9ce1ec 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -1,4 +1,5 @@ // coverage:ignore-file +import 'dart:math'; import 'dart:ui'; import 'package:equatable/equatable.dart'; @@ -227,7 +228,7 @@ class LineChartBarData with EquatableMixin { /// If you want to have a Step Line Chart style, just set [isStepLineChart] true, /// also you can tweak the [LineChartBarData.lineChartStepData]. LineChartBarData({ - this.spots = const [], + List spots = const [], this.show = true, Color? color, this.gradient, @@ -257,6 +258,7 @@ class LineChartBarData with EquatableMixin { FlSpot? mostBottom; FlSpot? firstValidSpot; + this.spots = List.from(spots); try { firstValidSpot = spots.firstWhere((element) => element != FlSpot.nullSpot); @@ -295,7 +297,7 @@ class LineChartBarData with EquatableMixin { /// /// You can have multiple lines by splitting them, /// put a [FlSpot.nullSpot] between each section. - final List spots; + late final List spots; /// We keep the most left spot to prevent redundant calculations late final FlSpot mostLeftSpot; @@ -385,6 +387,7 @@ class LineChartBarData with EquatableMixin { aboveBarData: BarAreaData.lerp(a.aboveBarData, b.aboveBarData, t), curveSmoothness: b.curveSmoothness, isCurved: b.isCurved, + isDraggable: b.isDraggable, isStrokeCapRound: b.isStrokeCapRound, isStrokeJoinRound: b.isStrokeJoinRound, preventCurveOverShooting: b.preventCurveOverShooting, @@ -1187,6 +1190,17 @@ double _xDistance(Offset touchPoint, Offset spotPixelCoordinates) { return (touchPoint.dx - spotPixelCoordinates.dx).abs(); } +/// distance calculator that calculates distance using vectors' math +double vectorDistanceCalculator( + Offset touchPoint, + Offset spotPixelCoordinates, +) { + return sqrt( + pow(touchPoint.dx - spotPixelCoordinates.dx, 2) + + pow(touchPoint.dy - spotPixelCoordinates.dy, 2), + ); +} + /// Default presentation of touched indicators. List defaultTouchedIndicators( LineChartBarData barData, @@ -1380,14 +1394,10 @@ class TouchLineBarSpot extends LineBarSpot { super.barIndex, super.spot, this.distance, - this.touchedAxesPoint, ); /// Distance in pixels from where the user taped final double distance; - - /// Position in spots' values converted from local position - final FlSpot touchedAxesPoint; } /// Holds data of showing each row item in the tooltip popup. @@ -1478,19 +1488,24 @@ class LineTouchResponse extends BaseTouchResponse { /// If touch happens, [LineChart] processes it internally and /// passes out a list of [lineBarSpots] it gives you information about the touched spot. /// They are sorted based on their distance to the touch event - const LineTouchResponse(this.lineBarSpots); + const LineTouchResponse(this.lineBarSpots, this.touchedAxesPoint); /// touch happened on these spots /// (if a single line provided on the chart, [lineBarSpots]'s length will be 1 always) final List? lineBarSpots; + /// Position in spots' values converted from local position + final FlSpot? touchedAxesPoint; + /// Copies current [LineTouchResponse] to a new [LineTouchResponse], /// and replaces provided values. LineTouchResponse copyWith({ List? lineBarSpots, + FlSpot? touchedAxesPoint, }) { return LineTouchResponse( lineBarSpots ?? this.lineBarSpots, + touchedAxesPoint ?? this.touchedAxesPoint, ); } } diff --git a/lib/src/chart/line_chart/line_chart_painter.dart b/lib/src/chart/line_chart/line_chart_painter.dart index c6acdaf07..e0a31a265 100644 --- a/lib/src/chart/line_chart/line_chart_painter.dart +++ b/lib/src/chart/line_chart/line_chart_painter.dart @@ -1191,7 +1191,7 @@ class LineChartPainter extends AxisChartPainter { /// Processes [localPosition] and checks /// the elements of the chart that are near the offset, /// then makes a [LineTouchResponse] from the elements that has been touched. - List? handleTouch( + LineTouchResponse handleTouch( Offset localPosition, Size size, PaintHolder holder, @@ -1214,9 +1214,20 @@ class LineChartPainter extends AxisChartPainter { } } + final axesPoint = getTouchedCoordinates( + localPosition.dx, + localPosition.dy, + size, + holder, + ); + touchedSpots.sort((a, b) => a.distance.compareTo(b.distance)); + final response = LineTouchResponse( + touchedSpots.isEmpty ? null : touchedSpots, + axesPoint, + ); - return touchedSpots.isEmpty ? null : touchedSpots; + return response; } /// find the nearest spot base on the touched offset @@ -1233,13 +1244,6 @@ class LineChartPainter extends AxisChartPainter { return null; } - final axesPoint = getTouchedCoordinates( - touchedPoint.dx, - touchedPoint.dy, - viewSize, - holder, - ); - /// Find the nearest spot (based on distanceCalculator) final sortedSpots = []; double? smallestDistance; @@ -1271,7 +1275,6 @@ class LineChartPainter extends AxisChartPainter { barDataPosition, sortedSpots.first, smallestDistance!, - axesPoint, ); } else { return null; diff --git a/lib/src/chart/line_chart/line_chart_renderer.dart b/lib/src/chart/line_chart/line_chart_renderer.dart index dfae057dd..59165d1fd 100644 --- a/lib/src/chart/line_chart/line_chart_renderer.dart +++ b/lib/src/chart/line_chart/line_chart_renderer.dart @@ -104,11 +104,11 @@ class RenderLineChart extends RenderBaseChart { @override LineTouchResponse getResponseAtLocation(Offset localPosition) { - final touchedSpots = painter.handleTouch( + final touchedSpotsResponse = painter.handleTouch( localPosition, mockTestSize ?? size, paintHolder, ); - return LineTouchResponse(touchedSpots); + return touchedSpotsResponse; } } diff --git a/test/chart/bar_chart/bar_chart_painter_test.mocks.dart b/test/chart/bar_chart/bar_chart_painter_test.mocks.dart index 7e4833f7e..6efe33bca 100644 --- a/test/chart/bar_chart/bar_chart_painter_test.mocks.dart +++ b/test/chart/bar_chart/bar_chart_painter_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/chart/bar_chart/bar_chart_painter_test.dart. // Do not manually edit this file. diff --git a/test/chart/bar_chart/bar_chart_renderer_test.mocks.dart b/test/chart/bar_chart/bar_chart_renderer_test.mocks.dart index 48490ff23..9c980a59d 100644 --- a/test/chart/bar_chart/bar_chart_renderer_test.mocks.dart +++ b/test/chart/bar_chart/bar_chart_renderer_test.mocks.dart @@ -1,22 +1,22 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/chart/bar_chart/bar_chart_renderer_test.dart. // Do not manually edit this file. // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:typed_data' as _i7; +import 'dart:typed_data' as _i8; import 'dart:ui' as _i2; -import 'package:fl_chart/fl_chart.dart' as _i13; -import 'package:fl_chart/src/chart/bar_chart/bar_chart_painter.dart' as _i10; +import 'package:fl_chart/fl_chart.dart' as _i7; +import 'package:fl_chart/src/chart/bar_chart/bar_chart_painter.dart' as _i11; import 'package:fl_chart/src/chart/base/base_chart/base_chart_painter.dart' - as _i12; -import 'package:fl_chart/src/utils/canvas_wrapper.dart' as _i11; + as _i13; +import 'package:fl_chart/src/utils/canvas_wrapper.dart' as _i12; import 'package:flutter/foundation.dart' as _i5; -import 'package:flutter/gestures.dart' as _i8; +import 'package:flutter/gestures.dart' as _i9; import 'package:flutter/material.dart' as _i6; import 'package:flutter/rendering.dart' as _i3; import 'package:flutter/src/rendering/layer.dart' as _i4; -import 'package:flutter/src/widgets/notification_listener.dart' as _i9; +import 'package:flutter/src/widgets/notification_listener.dart' as _i10; import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: type=lint @@ -137,6 +137,16 @@ class _FakeDiagnosticsNode_7 extends _i1.SmartFake super.toString(); } +class _FakeFlSpot_8 extends _i1.SmartFake implements _i7.FlSpot { + _FakeFlSpot_8( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + /// A class which mocks [Canvas]. /// /// See the documentation for Mockito's code generation for more information. @@ -246,7 +256,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { returnValueForMissingStub: null, ); @override - void transform(_i7.Float64List? matrix4) => super.noSuchMethod( + void transform(_i8.Float64List? matrix4) => super.noSuchMethod( Invocation.method( #transform, [matrix4], @@ -254,13 +264,13 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { returnValueForMissingStub: null, ); @override - _i7.Float64List getTransform() => (super.noSuchMethod( + _i8.Float64List getTransform() => (super.noSuchMethod( Invocation.method( #getTransform, [], ), - returnValue: _i7.Float64List(0), - ) as _i7.Float64List); + returnValue: _i8.Float64List(0), + ) as _i8.Float64List); @override void clipRect( _i2.Rect? rect, { @@ -585,7 +595,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { @override void drawRawPoints( _i2.PointMode? pointMode, - _i7.Float32List? points, + _i8.Float32List? points, _i2.Paint? paint, ) => super.noSuchMethod( @@ -644,9 +654,9 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { @override void drawRawAtlas( _i2.Image? atlas, - _i7.Float32List? rstTransforms, - _i7.Float32List? rects, - _i7.Int32List? colors, + _i8.Float32List? rstTransforms, + _i8.Float32List? rects, + _i8.Int32List? colors, _i2.BlendMode? blendMode, _i2.Rect? cullRect, _i2.Paint? paint, @@ -922,7 +932,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { _i4.TransformLayer? pushTransform( bool? needsCompositing, _i2.Offset? offset, - _i8.Matrix4? transform, + _i9.Matrix4? transform, _i3.PaintingContextCallback? painter, { _i4.TransformLayer? oldLayer, }) => @@ -1089,7 +1099,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { returnValueForMissingStub: null, ); @override - void dispatchNotification(_i9.Notification? notification) => + void dispatchNotification(_i10.Notification? notification) => super.noSuchMethod( Invocation.method( #dispatchNotification, @@ -1168,7 +1178,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { /// A class which mocks [BarChartPainter]. /// /// See the documentation for Mockito's code generation for more information. -class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { +class MockBarChartPainter extends _i1.Mock implements _i11.BarChartPainter { MockBarChartPainter() { _i1.throwOnMissingStub(this); } @@ -1176,8 +1186,8 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { @override void paint( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1191,10 +1201,10 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { returnValueForMissingStub: null, ); @override - List<_i10.GroupBarsPosition> calculateGroupAndBarsPosition( + List<_i11.GroupBarsPosition> calculateGroupAndBarsPosition( _i2.Size? viewSize, List? groupsX, - List<_i13.BarChartGroupData>? barGroups, + List<_i7.BarChartGroupData>? barGroups, ) => (super.noSuchMethod( Invocation.method( @@ -1205,13 +1215,13 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { barGroups, ], ), - returnValue: <_i10.GroupBarsPosition>[], - ) as List<_i10.GroupBarsPosition>); + returnValue: <_i11.GroupBarsPosition>[], + ) as List<_i11.GroupBarsPosition>); @override void drawBars( - _i11.CanvasWrapper? canvasWrapper, - List<_i10.GroupBarsPosition>? groupBarsPosition, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + List<_i11.GroupBarsPosition>? groupBarsPosition, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1227,14 +1237,14 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { @override void drawTouchTooltip( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - List<_i10.GroupBarsPosition>? groupPositions, - _i13.BarTouchTooltipData? tooltipData, - _i13.BarChartGroupData? showOnBarGroup, + _i12.CanvasWrapper? canvasWrapper, + List<_i11.GroupBarsPosition>? groupPositions, + _i7.BarTouchTooltipData? tooltipData, + _i7.BarChartGroupData? showOnBarGroup, int? barGroupIndex, - _i13.BarChartRodData? showOnRodData, + _i7.BarChartRodData? showOnRodData, int? barRodIndex, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1255,14 +1265,14 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { ); @override void drawStackItemBorderStroke( - _i11.CanvasWrapper? canvasWrapper, - _i13.BarChartRodStackItem? stackItem, + _i12.CanvasWrapper? canvasWrapper, + _i7.BarChartRodStackItem? stackItem, int? index, int? rodStacksSize, double? barThickSize, _i2.RRect? barRRect, _i2.Size? drawSize, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1281,10 +1291,10 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { returnValueForMissingStub: null, ); @override - _i13.BarTouchedSpot? handleTouch( + _i7.BarTouchedSpot? handleTouch( _i2.Offset? localPosition, _i2.Size? viewSize, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => (super.noSuchMethod(Invocation.method( #handleTouch, @@ -1293,11 +1303,11 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { viewSize, holder, ], - )) as _i13.BarTouchedSpot?); + )) as _i7.BarTouchedSpot?); @override void drawGrid( - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1311,8 +1321,8 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { ); @override void drawBackground( - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1326,8 +1336,8 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { ); @override void drawRangeAnnotation( - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1342,8 +1352,8 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { @override void drawExtraLines( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1359,8 +1369,8 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { @override void drawHorizontalLines( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.BarChartData>? holder, _i2.Size? viewSize, ) => super.noSuchMethod( @@ -1378,8 +1388,8 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { @override void drawVerticalLines( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.BarChartData>? holder, _i2.Size? viewSize, ) => super.noSuchMethod( @@ -1398,7 +1408,7 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { double getPixelX( double? spotX, _i2.Size? viewSize, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -1415,7 +1425,7 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { double getPixelY( double? spotY, _i2.Size? viewSize, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -1429,10 +1439,40 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { returnValue: 0.0, ) as double); @override + _i7.FlSpot getTouchedCoordinates( + double? pixelX, + double? pixelY, + _i2.Size? viewSize, + _i13.PaintHolder<_i7.BarChartData>? holder, + ) => + (super.noSuchMethod( + Invocation.method( + #getTouchedCoordinates, + [ + pixelX, + pixelY, + viewSize, + holder, + ], + ), + returnValue: _FakeFlSpot_8( + this, + Invocation.method( + #getTouchedCoordinates, + [ + pixelX, + pixelY, + viewSize, + holder, + ], + ), + ), + ) as _i7.FlSpot); + @override double getTooltipLeft( double? dx, double? tooltipWidth, - _i13.FLHorizontalAlignment? tooltipHorizontalAlignment, + _i7.FLHorizontalAlignment? tooltipHorizontalAlignment, double? tooltipHorizontalOffset, ) => (super.noSuchMethod( diff --git a/test/chart/data_pool.dart b/test/chart/data_pool.dart index 2bb1f1315..f046668ff 100644 --- a/test/chart/data_pool.dart +++ b/test/chart/data_pool.dart @@ -305,7 +305,7 @@ class MockData { ); static final lineTouchResponse1 = - LineTouchResponse([lineBarSpot1, lineBarSpot2]); + LineTouchResponse([lineBarSpot1, lineBarSpot2], const FlSpot(1, 1)); static final barChartRodData1 = BarChartRodData(toY: 11); static final barChartRodData2 = BarChartRodData(toY: 22); @@ -1020,8 +1020,12 @@ final TouchLineBarSpot lineBarSpot1Clone = TouchLineBarSpot( 0, ); -final TouchLineBarSpot lineBarSpot2 = - TouchLineBarSpot(lineChartBarData1, 2, flSpot1, 2); +final TouchLineBarSpot lineBarSpot2 = TouchLineBarSpot( + lineChartBarData1, + 2, + flSpot1, + 2, +); final TouchLineBarSpot lineBarSpot3 = TouchLineBarSpot( lineChartBarData1, @@ -1035,12 +1039,14 @@ final LineTouchResponse lineTouchResponse1 = LineTouchResponse( lineBarSpot1, lineBarSpot2, ], + const FlSpot(1, 1), ); final LineTouchResponse lineTouchResponse1Clone = LineTouchResponse( [ lineBarSpot1Clone, lineBarSpot2, ], + const FlSpot(1, 1), ); final LineTouchResponse lineTouchResponse2 = LineTouchResponse( @@ -1048,17 +1054,18 @@ final LineTouchResponse lineTouchResponse2 = LineTouchResponse( lineBarSpot2, lineBarSpot1, ], + const FlSpot(1, 1), ); -const LineTouchResponse lineTouchResponse3 = LineTouchResponse( - [], -); +const LineTouchResponse lineTouchResponse3 = + LineTouchResponse([], FlSpot(1, 1)); final LineTouchResponse lineTouchResponse4 = LineTouchResponse( [ lineBarSpot1, lineBarSpot2, ], + const FlSpot(1, 1), ); final LineTouchResponse lineTouchResponse5 = LineTouchResponse( @@ -1066,6 +1073,7 @@ final LineTouchResponse lineTouchResponse5 = LineTouchResponse( lineBarSpot1, lineBarSpot2, ], + const FlSpot(1, 1), ); const TouchedSpotIndicatorData touchedSpotIndicatorData1 = diff --git a/test/chart/line_chart/line_chart_painter_test.dart b/test/chart/line_chart/line_chart_painter_test.dart index c702c6431..510a8a955 100644 --- a/test/chart/line_chart/line_chart_painter_test.dart +++ b/test/chart/line_chart/line_chart_painter_test.dart @@ -2663,7 +2663,7 @@ void main() { final holder = PaintHolder(data, data, 1); final touchResponse = lineChartPainter.handleTouch(const Offset(35, 0), viewSize, holder); - expect(touchResponse, null); + expect(touchResponse.lineBarSpots, null); }); test('test 2', () { @@ -2720,21 +2720,25 @@ void main() { final holder = PaintHolder(data, data, 1); expect( lineChartPainter - .handleTouch(const Offset(30, 0), viewSize, holder)! + .handleTouch(const Offset(30, 0), viewSize, holder) + .lineBarSpots! .length, 1, ); expect( - lineChartPainter.handleTouch( - const Offset(29.99, 0), - viewSize, - holder, - ), + lineChartPainter + .handleTouch( + const Offset(29.99, 0), + viewSize, + holder, + ) + .lineBarSpots, null, ); expect( lineChartPainter - .handleTouch(const Offset(10, 0), viewSize, holder)! + .handleTouch(const Offset(10, 0), viewSize, holder) + .lineBarSpots! .length, 2, ); @@ -2794,14 +2798,14 @@ void main() { final holder = PaintHolder(data, data, 1); final result1 = - lineChartPainter.handleTouch(const Offset(11, 0), viewSize, holder)!; - expect(result1[0].barIndex, 0); - expect(result1[1].barIndex, 1); + lineChartPainter.handleTouch(const Offset(11, 0), viewSize, holder); + expect(result1.lineBarSpots![0].barIndex, 0); + expect(result1.lineBarSpots![1].barIndex, 1); final result2 = - lineChartPainter.handleTouch(const Offset(12, 0), viewSize, holder)!; - expect(result2[0].barIndex, 1); - expect(result2[1].barIndex, 0); + lineChartPainter.handleTouch(const Offset(12, 0), viewSize, holder); + expect(result2.lineBarSpots![0].barIndex, 1); + expect(result2.lineBarSpots![1].barIndex, 0); }); }); diff --git a/test/chart/line_chart/line_chart_painter_test.mocks.dart b/test/chart/line_chart/line_chart_painter_test.mocks.dart index 36127099e..be5479b46 100644 --- a/test/chart/line_chart/line_chart_painter_test.mocks.dart +++ b/test/chart/line_chart/line_chart_painter_test.mocks.dart @@ -1,16 +1,16 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/chart/line_chart/line_chart_painter_test.dart. // Do not manually edit this file. // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:typed_data' as _i5; +import 'dart:typed_data' as _i6; import 'dart:ui' as _i2; -import 'package:fl_chart/fl_chart.dart' as _i7; +import 'package:fl_chart/fl_chart.dart' as _i5; import 'package:fl_chart/src/chart/base/base_chart/base_chart_painter.dart' as _i10; import 'package:fl_chart/src/chart/line_chart/line_chart_painter.dart' as _i9; -import 'package:fl_chart/src/utils/canvas_wrapper.dart' as _i6; +import 'package:fl_chart/src/utils/canvas_wrapper.dart' as _i7; import 'package:fl_chart/src/utils/utils.dart' as _i8; import 'package:flutter/cupertino.dart' as _i3; import 'package:flutter/foundation.dart' as _i4; @@ -152,6 +152,27 @@ class _FakePath_9 extends _i1.SmartFake implements _i2.Path { ); } +class _FakeLineTouchResponse_10 extends _i1.SmartFake + implements _i5.LineTouchResponse { + _FakeLineTouchResponse_10( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeFlSpot_11 extends _i1.SmartFake implements _i5.FlSpot { + _FakeFlSpot_11( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + /// A class which mocks [Canvas]. /// /// See the documentation for Mockito's code generation for more information. @@ -261,7 +282,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { returnValueForMissingStub: null, ); @override - void transform(_i5.Float64List? matrix4) => super.noSuchMethod( + void transform(_i6.Float64List? matrix4) => super.noSuchMethod( Invocation.method( #transform, [matrix4], @@ -269,13 +290,13 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { returnValueForMissingStub: null, ); @override - _i5.Float64List getTransform() => (super.noSuchMethod( + _i6.Float64List getTransform() => (super.noSuchMethod( Invocation.method( #getTransform, [], ), - returnValue: _i5.Float64List(0), - ) as _i5.Float64List); + returnValue: _i6.Float64List(0), + ) as _i6.Float64List); @override void clipRect( _i2.Rect? rect, { @@ -600,7 +621,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { @override void drawRawPoints( _i2.PointMode? pointMode, - _i5.Float32List? points, + _i6.Float32List? points, _i2.Paint? paint, ) => super.noSuchMethod( @@ -659,9 +680,9 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { @override void drawRawAtlas( _i2.Image? atlas, - _i5.Float32List? rstTransforms, - _i5.Float32List? rects, - _i5.Int32List? colors, + _i6.Float32List? rstTransforms, + _i6.Float32List? rects, + _i6.Int32List? colors, _i2.BlendMode? blendMode, _i2.Rect? cullRect, _i2.Paint? paint, @@ -705,7 +726,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { /// A class which mocks [CanvasWrapper]. /// /// See the documentation for Mockito's code generation for more information. -class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { +class MockCanvasWrapper extends _i1.Mock implements _i7.CanvasWrapper { MockCanvasWrapper() { _i1.throwOnMissingStub(this); } @@ -954,8 +975,8 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ); @override void drawDot( - _i7.FlDotPainter? painter, - _i7.FlSpot? spot, + _i5.FlDotPainter? painter, + _i5.FlSpot? spot, _i2.Offset? offset, ) => super.noSuchMethod( @@ -975,7 +996,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { _i2.Offset? rotationOffset = _i2.Offset.zero, _i2.Offset? drawOffset = _i2.Offset.zero, required double? angle, - required _i6.DrawCallback? drawCallback, + required _i7.DrawCallback? drawCallback, }) => super.noSuchMethod( Invocation.method( @@ -1362,8 +1383,8 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { @override void paint( _i3.BuildContext? context, - _i6.CanvasWrapper? canvasWrapper, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1378,8 +1399,8 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ); @override void clipToBorder( - _i6.CanvasWrapper? canvasWrapper, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1393,9 +1414,9 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ); @override void drawBarLine( - _i6.CanvasWrapper? canvasWrapper, - _i7.LineChartBarData? barData, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i5.LineChartBarData? barData, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1410,10 +1431,10 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ); @override void drawBetweenBarsArea( - _i6.CanvasWrapper? canvasWrapper, - _i7.LineChartData? data, - _i7.BetweenBarsData? betweenBarsData, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i5.LineChartData? data, + _i5.BetweenBarsData? betweenBarsData, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1429,9 +1450,9 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ); @override void drawDots( - _i6.CanvasWrapper? canvasWrapper, - _i7.LineChartBarData? barData, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i5.LineChartBarData? barData, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1446,9 +1467,9 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ); @override void drawTouchedSpotsIndicator( - _i6.CanvasWrapper? canvasWrapper, + _i7.CanvasWrapper? canvasWrapper, List<_i9.LineIndexDrawingInfo>? lineIndexDrawingInfo, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1464,9 +1485,9 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { @override _i2.Path generateBarPath( _i2.Size? viewSize, - _i7.LineChartBarData? barData, - List<_i7.FlSpot>? barSpots, - _i10.PaintHolder<_i7.LineChartData>? holder, { + _i5.LineChartBarData? barData, + List<_i5.FlSpot>? barSpots, + _i10.PaintHolder<_i5.LineChartData>? holder, { _i2.Path? appendToPath, }) => (super.noSuchMethod( @@ -1497,9 +1518,9 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { @override _i2.Path generateNormalBarPath( _i2.Size? viewSize, - _i7.LineChartBarData? barData, - List<_i7.FlSpot>? barSpots, - _i10.PaintHolder<_i7.LineChartData>? holder, { + _i5.LineChartBarData? barData, + List<_i5.FlSpot>? barSpots, + _i10.PaintHolder<_i5.LineChartData>? holder, { _i2.Path? appendToPath, }) => (super.noSuchMethod( @@ -1530,9 +1551,9 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { @override _i2.Path generateStepBarPath( _i2.Size? viewSize, - _i7.LineChartBarData? barData, - List<_i7.FlSpot>? barSpots, - _i10.PaintHolder<_i7.LineChartData>? holder, { + _i5.LineChartBarData? barData, + List<_i5.FlSpot>? barSpots, + _i10.PaintHolder<_i5.LineChartData>? holder, { _i2.Path? appendToPath, }) => (super.noSuchMethod( @@ -1563,10 +1584,10 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { @override _i2.Path generateBelowBarPath( _i2.Size? viewSize, - _i7.LineChartBarData? barData, + _i5.LineChartBarData? barData, _i2.Path? barPath, - List<_i7.FlSpot>? barSpots, - _i10.PaintHolder<_i7.LineChartData>? holder, { + List<_i5.FlSpot>? barSpots, + _i10.PaintHolder<_i5.LineChartData>? holder, { bool? fillCompletely = false, }) => (super.noSuchMethod( @@ -1599,10 +1620,10 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { @override _i2.Path generateAboveBarPath( _i2.Size? viewSize, - _i7.LineChartBarData? barData, + _i5.LineChartBarData? barData, _i2.Path? barPath, - List<_i7.FlSpot>? barSpots, - _i10.PaintHolder<_i7.LineChartData>? holder, { + List<_i5.FlSpot>? barSpots, + _i10.PaintHolder<_i5.LineChartData>? holder, { bool? fillCompletely = false, }) => (super.noSuchMethod( @@ -1634,11 +1655,11 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ) as _i2.Path); @override void drawBelowBar( - _i6.CanvasWrapper? canvasWrapper, + _i7.CanvasWrapper? canvasWrapper, _i2.Path? belowBarPath, _i2.Path? filledAboveBarPath, - _i10.PaintHolder<_i7.LineChartData>? holder, - _i7.LineChartBarData? barData, + _i10.PaintHolder<_i5.LineChartData>? holder, + _i5.LineChartBarData? barData, ) => super.noSuchMethod( Invocation.method( @@ -1655,11 +1676,11 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ); @override void drawAboveBar( - _i6.CanvasWrapper? canvasWrapper, + _i7.CanvasWrapper? canvasWrapper, _i2.Path? aboveBarPath, _i2.Path? filledBelowBarPath, - _i10.PaintHolder<_i7.LineChartData>? holder, - _i7.LineChartBarData? barData, + _i10.PaintHolder<_i5.LineChartData>? holder, + _i5.LineChartBarData? barData, ) => super.noSuchMethod( Invocation.method( @@ -1676,11 +1697,11 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ); @override void drawBetweenBar( - _i6.CanvasWrapper? canvasWrapper, + _i7.CanvasWrapper? canvasWrapper, _i2.Path? barPath, - _i7.BetweenBarsData? betweenBarsData, + _i5.BetweenBarsData? betweenBarsData, _i2.Rect? aroundRect, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1697,9 +1718,9 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ); @override void drawBarShadow( - _i6.CanvasWrapper? canvasWrapper, + _i7.CanvasWrapper? canvasWrapper, _i2.Path? barPath, - _i7.LineChartBarData? barData, + _i5.LineChartBarData? barData, ) => super.noSuchMethod( Invocation.method( @@ -1714,10 +1735,10 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ); @override void drawBar( - _i6.CanvasWrapper? canvasWrapper, + _i7.CanvasWrapper? canvasWrapper, _i2.Path? barPath, - _i7.LineChartBarData? barData, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i5.LineChartBarData? barData, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1734,11 +1755,11 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { @override void drawTouchTooltip( _i3.BuildContext? context, - _i6.CanvasWrapper? canvasWrapper, - _i7.LineTouchTooltipData? tooltipData, - _i7.FlSpot? showOnSpot, - _i7.ShowingTooltipIndicators? showingTooltipSpots, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i5.LineTouchTooltipData? tooltipData, + _i5.FlSpot? showOnSpot, + _i5.ShowingTooltipIndicators? showingTooltipSpots, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1756,9 +1777,9 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ); @override double getBarLineXLength( - _i7.LineChartBarData? barData, + _i5.LineChartBarData? barData, _i2.Size? chartUsableSize, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -1772,26 +1793,39 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { returnValue: 0.0, ) as double); @override - List<_i7.TouchLineBarSpot>? handleTouch( + _i5.LineTouchResponse handleTouch( _i2.Offset? localPosition, _i2.Size? size, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => - (super.noSuchMethod(Invocation.method( - #handleTouch, - [ - localPosition, - size, - holder, - ], - )) as List<_i7.TouchLineBarSpot>?); + (super.noSuchMethod( + Invocation.method( + #handleTouch, + [ + localPosition, + size, + holder, + ], + ), + returnValue: _FakeLineTouchResponse_10( + this, + Invocation.method( + #handleTouch, + [ + localPosition, + size, + holder, + ], + ), + ), + ) as _i5.LineTouchResponse); @override - _i7.TouchLineBarSpot? getNearestTouchedSpot( + _i5.TouchLineBarSpot? getNearestTouchedSpot( _i2.Size? viewSize, _i2.Offset? touchedPoint, - _i7.LineChartBarData? barData, + _i5.LineChartBarData? barData, int? barDataPosition, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => (super.noSuchMethod(Invocation.method( #getNearestTouchedSpot, @@ -1802,11 +1836,11 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { barDataPosition, holder, ], - )) as _i7.TouchLineBarSpot?); + )) as _i5.TouchLineBarSpot?); @override void drawGrid( - _i6.CanvasWrapper? canvasWrapper, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1820,8 +1854,8 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ); @override void drawBackground( - _i6.CanvasWrapper? canvasWrapper, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1835,8 +1869,8 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ); @override void drawRangeAnnotation( - _i6.CanvasWrapper? canvasWrapper, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1851,8 +1885,8 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { @override void drawExtraLines( _i3.BuildContext? context, - _i6.CanvasWrapper? canvasWrapper, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1868,8 +1902,8 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { @override void drawHorizontalLines( _i3.BuildContext? context, - _i6.CanvasWrapper? canvasWrapper, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i10.PaintHolder<_i5.LineChartData>? holder, _i2.Size? viewSize, ) => super.noSuchMethod( @@ -1887,8 +1921,8 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { @override void drawVerticalLines( _i3.BuildContext? context, - _i6.CanvasWrapper? canvasWrapper, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i10.PaintHolder<_i5.LineChartData>? holder, _i2.Size? viewSize, ) => super.noSuchMethod( @@ -1907,7 +1941,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { double getPixelX( double? spotX, _i2.Size? viewSize, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -1924,7 +1958,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { double getPixelY( double? spotY, _i2.Size? viewSize, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i10.PaintHolder<_i5.LineChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -1938,10 +1972,40 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { returnValue: 0.0, ) as double); @override + _i5.FlSpot getTouchedCoordinates( + double? pixelX, + double? pixelY, + _i2.Size? viewSize, + _i10.PaintHolder<_i5.LineChartData>? holder, + ) => + (super.noSuchMethod( + Invocation.method( + #getTouchedCoordinates, + [ + pixelX, + pixelY, + viewSize, + holder, + ], + ), + returnValue: _FakeFlSpot_11( + this, + Invocation.method( + #getTouchedCoordinates, + [ + pixelX, + pixelY, + viewSize, + holder, + ], + ), + ), + ) as _i5.FlSpot); + @override double getTooltipLeft( double? dx, double? tooltipWidth, - _i7.FLHorizontalAlignment? tooltipHorizontalAlignment, + _i5.FLHorizontalAlignment? tooltipHorizontalAlignment, double? tooltipHorizontalOffset, ) => (super.noSuchMethod( diff --git a/test/chart/line_chart/line_chart_renderer_test.dart b/test/chart/line_chart/line_chart_renderer_test.dart index 10463b558..2322af395 100644 --- a/test/chart/line_chart/line_chart_renderer_test.dart +++ b/test/chart/line_chart/line_chart_renderer_test.dart @@ -97,7 +97,7 @@ void main() { 'size': inv.positionalArguments[1] as Size, 'paint_holder': inv.positionalArguments[2] as PaintHolder, }); - return MockData.lineTouchResponse1.lineBarSpots; + return MockData.lineTouchResponse1; }); final touchResponse = renderLineChart.getResponseAtLocation(MockData.offset1); diff --git a/test/chart/line_chart/line_chart_renderer_test.mocks.dart b/test/chart/line_chart/line_chart_renderer_test.mocks.dart index 97a29906e..8a177381f 100644 --- a/test/chart/line_chart/line_chart_renderer_test.mocks.dart +++ b/test/chart/line_chart/line_chart_renderer_test.mocks.dart @@ -1,22 +1,22 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/chart/line_chart/line_chart_renderer_test.dart. // Do not manually edit this file. // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:typed_data' as _i7; +import 'dart:typed_data' as _i8; import 'dart:ui' as _i2; -import 'package:fl_chart/fl_chart.dart' as _i13; +import 'package:fl_chart/fl_chart.dart' as _i7; import 'package:fl_chart/src/chart/base/base_chart/base_chart_painter.dart' - as _i12; -import 'package:fl_chart/src/chart/line_chart/line_chart_painter.dart' as _i10; -import 'package:fl_chart/src/utils/canvas_wrapper.dart' as _i11; + as _i13; +import 'package:fl_chart/src/chart/line_chart/line_chart_painter.dart' as _i11; +import 'package:fl_chart/src/utils/canvas_wrapper.dart' as _i12; import 'package:flutter/foundation.dart' as _i5; -import 'package:flutter/gestures.dart' as _i8; +import 'package:flutter/gestures.dart' as _i9; import 'package:flutter/material.dart' as _i6; import 'package:flutter/rendering.dart' as _i3; import 'package:flutter/src/rendering/layer.dart' as _i4; -import 'package:flutter/src/widgets/notification_listener.dart' as _i9; +import 'package:flutter/src/widgets/notification_listener.dart' as _i10; import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: type=lint @@ -147,6 +147,27 @@ class _FakePath_8 extends _i1.SmartFake implements _i2.Path { ); } +class _FakeLineTouchResponse_9 extends _i1.SmartFake + implements _i7.LineTouchResponse { + _FakeLineTouchResponse_9( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeFlSpot_10 extends _i1.SmartFake implements _i7.FlSpot { + _FakeFlSpot_10( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + /// A class which mocks [Canvas]. /// /// See the documentation for Mockito's code generation for more information. @@ -256,7 +277,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { returnValueForMissingStub: null, ); @override - void transform(_i7.Float64List? matrix4) => super.noSuchMethod( + void transform(_i8.Float64List? matrix4) => super.noSuchMethod( Invocation.method( #transform, [matrix4], @@ -264,13 +285,13 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { returnValueForMissingStub: null, ); @override - _i7.Float64List getTransform() => (super.noSuchMethod( + _i8.Float64List getTransform() => (super.noSuchMethod( Invocation.method( #getTransform, [], ), - returnValue: _i7.Float64List(0), - ) as _i7.Float64List); + returnValue: _i8.Float64List(0), + ) as _i8.Float64List); @override void clipRect( _i2.Rect? rect, { @@ -595,7 +616,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { @override void drawRawPoints( _i2.PointMode? pointMode, - _i7.Float32List? points, + _i8.Float32List? points, _i2.Paint? paint, ) => super.noSuchMethod( @@ -654,9 +675,9 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { @override void drawRawAtlas( _i2.Image? atlas, - _i7.Float32List? rstTransforms, - _i7.Float32List? rects, - _i7.Int32List? colors, + _i8.Float32List? rstTransforms, + _i8.Float32List? rects, + _i8.Int32List? colors, _i2.BlendMode? blendMode, _i2.Rect? cullRect, _i2.Paint? paint, @@ -932,7 +953,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { _i4.TransformLayer? pushTransform( bool? needsCompositing, _i2.Offset? offset, - _i8.Matrix4? transform, + _i9.Matrix4? transform, _i3.PaintingContextCallback? painter, { _i4.TransformLayer? oldLayer, }) => @@ -1099,7 +1120,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { returnValueForMissingStub: null, ); @override - void dispatchNotification(_i9.Notification? notification) => + void dispatchNotification(_i10.Notification? notification) => super.noSuchMethod( Invocation.method( #dispatchNotification, @@ -1178,7 +1199,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { /// A class which mocks [LineChartPainter]. /// /// See the documentation for Mockito's code generation for more information. -class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { +class MockLineChartPainter extends _i1.Mock implements _i11.LineChartPainter { MockLineChartPainter() { _i1.throwOnMissingStub(this); } @@ -1186,8 +1207,8 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void paint( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1202,8 +1223,8 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ); @override void clipToBorder( - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1217,9 +1238,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ); @override void drawBarLine( - _i11.CanvasWrapper? canvasWrapper, - _i13.LineChartBarData? barData, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i7.LineChartBarData? barData, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1234,10 +1255,10 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ); @override void drawBetweenBarsArea( - _i11.CanvasWrapper? canvasWrapper, - _i13.LineChartData? data, - _i13.BetweenBarsData? betweenBarsData, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i7.LineChartData? data, + _i7.BetweenBarsData? betweenBarsData, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1253,9 +1274,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ); @override void drawDots( - _i11.CanvasWrapper? canvasWrapper, - _i13.LineChartBarData? barData, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i7.LineChartBarData? barData, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1270,9 +1291,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ); @override void drawTouchedSpotsIndicator( - _i11.CanvasWrapper? canvasWrapper, - List<_i10.LineIndexDrawingInfo>? lineIndexDrawingInfo, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + List<_i11.LineIndexDrawingInfo>? lineIndexDrawingInfo, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1288,9 +1309,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override _i2.Path generateBarPath( _i2.Size? viewSize, - _i13.LineChartBarData? barData, - List<_i13.FlSpot>? barSpots, - _i12.PaintHolder<_i13.LineChartData>? holder, { + _i7.LineChartBarData? barData, + List<_i7.FlSpot>? barSpots, + _i13.PaintHolder<_i7.LineChartData>? holder, { _i2.Path? appendToPath, }) => (super.noSuchMethod( @@ -1321,9 +1342,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override _i2.Path generateNormalBarPath( _i2.Size? viewSize, - _i13.LineChartBarData? barData, - List<_i13.FlSpot>? barSpots, - _i12.PaintHolder<_i13.LineChartData>? holder, { + _i7.LineChartBarData? barData, + List<_i7.FlSpot>? barSpots, + _i13.PaintHolder<_i7.LineChartData>? holder, { _i2.Path? appendToPath, }) => (super.noSuchMethod( @@ -1354,9 +1375,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override _i2.Path generateStepBarPath( _i2.Size? viewSize, - _i13.LineChartBarData? barData, - List<_i13.FlSpot>? barSpots, - _i12.PaintHolder<_i13.LineChartData>? holder, { + _i7.LineChartBarData? barData, + List<_i7.FlSpot>? barSpots, + _i13.PaintHolder<_i7.LineChartData>? holder, { _i2.Path? appendToPath, }) => (super.noSuchMethod( @@ -1387,10 +1408,10 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override _i2.Path generateBelowBarPath( _i2.Size? viewSize, - _i13.LineChartBarData? barData, + _i7.LineChartBarData? barData, _i2.Path? barPath, - List<_i13.FlSpot>? barSpots, - _i12.PaintHolder<_i13.LineChartData>? holder, { + List<_i7.FlSpot>? barSpots, + _i13.PaintHolder<_i7.LineChartData>? holder, { bool? fillCompletely = false, }) => (super.noSuchMethod( @@ -1423,10 +1444,10 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override _i2.Path generateAboveBarPath( _i2.Size? viewSize, - _i13.LineChartBarData? barData, + _i7.LineChartBarData? barData, _i2.Path? barPath, - List<_i13.FlSpot>? barSpots, - _i12.PaintHolder<_i13.LineChartData>? holder, { + List<_i7.FlSpot>? barSpots, + _i13.PaintHolder<_i7.LineChartData>? holder, { bool? fillCompletely = false, }) => (super.noSuchMethod( @@ -1458,11 +1479,11 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ) as _i2.Path); @override void drawBelowBar( - _i11.CanvasWrapper? canvasWrapper, + _i12.CanvasWrapper? canvasWrapper, _i2.Path? belowBarPath, _i2.Path? filledAboveBarPath, - _i12.PaintHolder<_i13.LineChartData>? holder, - _i13.LineChartBarData? barData, + _i13.PaintHolder<_i7.LineChartData>? holder, + _i7.LineChartBarData? barData, ) => super.noSuchMethod( Invocation.method( @@ -1479,11 +1500,11 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ); @override void drawAboveBar( - _i11.CanvasWrapper? canvasWrapper, + _i12.CanvasWrapper? canvasWrapper, _i2.Path? aboveBarPath, _i2.Path? filledBelowBarPath, - _i12.PaintHolder<_i13.LineChartData>? holder, - _i13.LineChartBarData? barData, + _i13.PaintHolder<_i7.LineChartData>? holder, + _i7.LineChartBarData? barData, ) => super.noSuchMethod( Invocation.method( @@ -1500,11 +1521,11 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ); @override void drawBetweenBar( - _i11.CanvasWrapper? canvasWrapper, + _i12.CanvasWrapper? canvasWrapper, _i2.Path? barPath, - _i13.BetweenBarsData? betweenBarsData, + _i7.BetweenBarsData? betweenBarsData, _i2.Rect? aroundRect, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1521,9 +1542,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ); @override void drawBarShadow( - _i11.CanvasWrapper? canvasWrapper, + _i12.CanvasWrapper? canvasWrapper, _i2.Path? barPath, - _i13.LineChartBarData? barData, + _i7.LineChartBarData? barData, ) => super.noSuchMethod( Invocation.method( @@ -1538,10 +1559,10 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ); @override void drawBar( - _i11.CanvasWrapper? canvasWrapper, + _i12.CanvasWrapper? canvasWrapper, _i2.Path? barPath, - _i13.LineChartBarData? barData, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i7.LineChartBarData? barData, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1558,11 +1579,11 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawTouchTooltip( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i13.LineTouchTooltipData? tooltipData, - _i13.FlSpot? showOnSpot, - _i13.ShowingTooltipIndicators? showingTooltipSpots, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i7.LineTouchTooltipData? tooltipData, + _i7.FlSpot? showOnSpot, + _i7.ShowingTooltipIndicators? showingTooltipSpots, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1580,9 +1601,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ); @override double getBarLineXLength( - _i13.LineChartBarData? barData, + _i7.LineChartBarData? barData, _i2.Size? chartUsableSize, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -1596,26 +1617,39 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { returnValue: 0.0, ) as double); @override - List<_i13.TouchLineBarSpot>? handleTouch( + _i7.LineTouchResponse handleTouch( _i2.Offset? localPosition, _i2.Size? size, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => - (super.noSuchMethod(Invocation.method( - #handleTouch, - [ - localPosition, - size, - holder, - ], - )) as List<_i13.TouchLineBarSpot>?); + (super.noSuchMethod( + Invocation.method( + #handleTouch, + [ + localPosition, + size, + holder, + ], + ), + returnValue: _FakeLineTouchResponse_9( + this, + Invocation.method( + #handleTouch, + [ + localPosition, + size, + holder, + ], + ), + ), + ) as _i7.LineTouchResponse); @override - _i13.TouchLineBarSpot? getNearestTouchedSpot( + _i7.TouchLineBarSpot? getNearestTouchedSpot( _i2.Size? viewSize, _i2.Offset? touchedPoint, - _i13.LineChartBarData? barData, + _i7.LineChartBarData? barData, int? barDataPosition, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => (super.noSuchMethod(Invocation.method( #getNearestTouchedSpot, @@ -1626,11 +1660,11 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { barDataPosition, holder, ], - )) as _i13.TouchLineBarSpot?); + )) as _i7.TouchLineBarSpot?); @override void drawGrid( - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1644,8 +1678,8 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ); @override void drawBackground( - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1659,8 +1693,8 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ); @override void drawRangeAnnotation( - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1675,8 +1709,8 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawExtraLines( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1692,8 +1726,8 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawHorizontalLines( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.LineChartData>? holder, _i2.Size? viewSize, ) => super.noSuchMethod( @@ -1711,8 +1745,8 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawVerticalLines( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.LineChartData>? holder, _i2.Size? viewSize, ) => super.noSuchMethod( @@ -1731,7 +1765,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { double getPixelX( double? spotX, _i2.Size? viewSize, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -1748,7 +1782,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { double getPixelY( double? spotY, _i2.Size? viewSize, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -1762,10 +1796,40 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { returnValue: 0.0, ) as double); @override + _i7.FlSpot getTouchedCoordinates( + double? pixelX, + double? pixelY, + _i2.Size? viewSize, + _i13.PaintHolder<_i7.LineChartData>? holder, + ) => + (super.noSuchMethod( + Invocation.method( + #getTouchedCoordinates, + [ + pixelX, + pixelY, + viewSize, + holder, + ], + ), + returnValue: _FakeFlSpot_10( + this, + Invocation.method( + #getTouchedCoordinates, + [ + pixelX, + pixelY, + viewSize, + holder, + ], + ), + ), + ) as _i7.FlSpot); + @override double getTooltipLeft( double? dx, double? tooltipWidth, - _i13.FLHorizontalAlignment? tooltipHorizontalAlignment, + _i7.FLHorizontalAlignment? tooltipHorizontalAlignment, double? tooltipHorizontalOffset, ) => (super.noSuchMethod( diff --git a/test/chart/pie_chart/pie_chart_painter_test.mocks.dart b/test/chart/pie_chart/pie_chart_painter_test.mocks.dart index a1d0683e1..ec4a3623e 100644 --- a/test/chart/pie_chart/pie_chart_painter_test.mocks.dart +++ b/test/chart/pie_chart/pie_chart_painter_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/chart/pie_chart/pie_chart_painter_test.dart. // Do not manually edit this file. diff --git a/test/chart/pie_chart/pie_chart_renderer_test.mocks.dart b/test/chart/pie_chart/pie_chart_renderer_test.mocks.dart index 8e58b42b5..240627c32 100644 --- a/test/chart/pie_chart/pie_chart_renderer_test.mocks.dart +++ b/test/chart/pie_chart/pie_chart_renderer_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/chart/pie_chart/pie_chart_renderer_test.dart. // Do not manually edit this file. diff --git a/test/chart/radar_chart/radar_chart_painter_test.mocks.dart b/test/chart/radar_chart/radar_chart_painter_test.mocks.dart index 84b2cd6ef..29a27a859 100644 --- a/test/chart/radar_chart/radar_chart_painter_test.mocks.dart +++ b/test/chart/radar_chart/radar_chart_painter_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/chart/radar_chart/radar_chart_painter_test.dart. // Do not manually edit this file. diff --git a/test/chart/radar_chart/radar_chart_renderer_test.mocks.dart b/test/chart/radar_chart/radar_chart_renderer_test.mocks.dart index 13ac05859..582bb7f19 100644 --- a/test/chart/radar_chart/radar_chart_renderer_test.mocks.dart +++ b/test/chart/radar_chart/radar_chart_renderer_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/chart/radar_chart/radar_chart_renderer_test.dart. // Do not manually edit this file. diff --git a/test/chart/scatter_chart/scatter_chart_painter_test.mocks.dart b/test/chart/scatter_chart/scatter_chart_painter_test.mocks.dart index 3305195d0..03c2ebecc 100644 --- a/test/chart/scatter_chart/scatter_chart_painter_test.mocks.dart +++ b/test/chart/scatter_chart/scatter_chart_painter_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/chart/scatter_chart/scatter_chart_painter_test.dart. // Do not manually edit this file. diff --git a/test/chart/scatter_chart/scatter_chart_renderer_test.mocks.dart b/test/chart/scatter_chart/scatter_chart_renderer_test.mocks.dart index 890e683be..27c49793b 100644 --- a/test/chart/scatter_chart/scatter_chart_renderer_test.mocks.dart +++ b/test/chart/scatter_chart/scatter_chart_renderer_test.mocks.dart @@ -1,23 +1,23 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/chart/scatter_chart/scatter_chart_renderer_test.dart. // Do not manually edit this file. // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:typed_data' as _i7; +import 'dart:typed_data' as _i8; import 'dart:ui' as _i2; -import 'package:fl_chart/fl_chart.dart' as _i13; +import 'package:fl_chart/fl_chart.dart' as _i7; import 'package:fl_chart/src/chart/base/base_chart/base_chart_painter.dart' - as _i12; + as _i13; import 'package:fl_chart/src/chart/scatter_chart/scatter_chart_painter.dart' - as _i10; -import 'package:fl_chart/src/utils/canvas_wrapper.dart' as _i11; + as _i11; +import 'package:fl_chart/src/utils/canvas_wrapper.dart' as _i12; import 'package:flutter/foundation.dart' as _i5; -import 'package:flutter/gestures.dart' as _i8; +import 'package:flutter/gestures.dart' as _i9; import 'package:flutter/material.dart' as _i6; import 'package:flutter/rendering.dart' as _i3; import 'package:flutter/src/rendering/layer.dart' as _i4; -import 'package:flutter/src/widgets/notification_listener.dart' as _i9; +import 'package:flutter/src/widgets/notification_listener.dart' as _i10; import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: type=lint @@ -138,6 +138,16 @@ class _FakeDiagnosticsNode_7 extends _i1.SmartFake super.toString(); } +class _FakeFlSpot_8 extends _i1.SmartFake implements _i7.FlSpot { + _FakeFlSpot_8( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + /// A class which mocks [Canvas]. /// /// See the documentation for Mockito's code generation for more information. @@ -247,7 +257,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { returnValueForMissingStub: null, ); @override - void transform(_i7.Float64List? matrix4) => super.noSuchMethod( + void transform(_i8.Float64List? matrix4) => super.noSuchMethod( Invocation.method( #transform, [matrix4], @@ -255,13 +265,13 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { returnValueForMissingStub: null, ); @override - _i7.Float64List getTransform() => (super.noSuchMethod( + _i8.Float64List getTransform() => (super.noSuchMethod( Invocation.method( #getTransform, [], ), - returnValue: _i7.Float64List(0), - ) as _i7.Float64List); + returnValue: _i8.Float64List(0), + ) as _i8.Float64List); @override void clipRect( _i2.Rect? rect, { @@ -586,7 +596,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { @override void drawRawPoints( _i2.PointMode? pointMode, - _i7.Float32List? points, + _i8.Float32List? points, _i2.Paint? paint, ) => super.noSuchMethod( @@ -645,9 +655,9 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { @override void drawRawAtlas( _i2.Image? atlas, - _i7.Float32List? rstTransforms, - _i7.Float32List? rects, - _i7.Int32List? colors, + _i8.Float32List? rstTransforms, + _i8.Float32List? rects, + _i8.Int32List? colors, _i2.BlendMode? blendMode, _i2.Rect? cullRect, _i2.Paint? paint, @@ -923,7 +933,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { _i4.TransformLayer? pushTransform( bool? needsCompositing, _i2.Offset? offset, - _i8.Matrix4? transform, + _i9.Matrix4? transform, _i3.PaintingContextCallback? painter, { _i4.TransformLayer? oldLayer, }) => @@ -1090,7 +1100,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { returnValueForMissingStub: null, ); @override - void dispatchNotification(_i9.Notification? notification) => + void dispatchNotification(_i10.Notification? notification) => super.noSuchMethod( Invocation.method( #dispatchNotification, @@ -1170,7 +1180,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { /// /// See the documentation for Mockito's code generation for more information. class MockScatterChartPainter extends _i1.Mock - implements _i10.ScatterChartPainter { + implements _i11.ScatterChartPainter { MockScatterChartPainter() { _i1.throwOnMissingStub(this); } @@ -1178,8 +1188,8 @@ class MockScatterChartPainter extends _i1.Mock @override void paint( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1195,8 +1205,8 @@ class MockScatterChartPainter extends _i1.Mock @override void drawSpots( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1212,8 +1222,8 @@ class MockScatterChartPainter extends _i1.Mock @override void drawTouchTooltips( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1229,10 +1239,10 @@ class MockScatterChartPainter extends _i1.Mock @override void drawTouchTooltip( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i13.ScatterTouchTooltipData? tooltipData, - _i13.ScatterSpot? showOnSpot, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i7.ScatterTouchTooltipData? tooltipData, + _i7.ScatterSpot? showOnSpot, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1248,10 +1258,10 @@ class MockScatterChartPainter extends _i1.Mock returnValueForMissingStub: null, ); @override - _i13.ScatterTouchedSpot? handleTouch( + _i7.ScatterTouchedSpot? handleTouch( _i2.Offset? localPosition, _i2.Size? viewSize, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => (super.noSuchMethod(Invocation.method( #handleTouch, @@ -1260,11 +1270,11 @@ class MockScatterChartPainter extends _i1.Mock viewSize, holder, ], - )) as _i13.ScatterTouchedSpot?); + )) as _i7.ScatterTouchedSpot?); @override void drawGrid( - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1278,8 +1288,8 @@ class MockScatterChartPainter extends _i1.Mock ); @override void drawBackground( - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1293,8 +1303,8 @@ class MockScatterChartPainter extends _i1.Mock ); @override void drawRangeAnnotation( - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1309,8 +1319,8 @@ class MockScatterChartPainter extends _i1.Mock @override void drawExtraLines( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1326,8 +1336,8 @@ class MockScatterChartPainter extends _i1.Mock @override void drawHorizontalLines( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.ScatterChartData>? holder, _i2.Size? viewSize, ) => super.noSuchMethod( @@ -1345,8 +1355,8 @@ class MockScatterChartPainter extends _i1.Mock @override void drawVerticalLines( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.ScatterChartData>? holder, _i2.Size? viewSize, ) => super.noSuchMethod( @@ -1365,7 +1375,7 @@ class MockScatterChartPainter extends _i1.Mock double getPixelX( double? spotX, _i2.Size? viewSize, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -1382,7 +1392,7 @@ class MockScatterChartPainter extends _i1.Mock double getPixelY( double? spotY, _i2.Size? viewSize, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -1396,10 +1406,40 @@ class MockScatterChartPainter extends _i1.Mock returnValue: 0.0, ) as double); @override + _i7.FlSpot getTouchedCoordinates( + double? pixelX, + double? pixelY, + _i2.Size? viewSize, + _i13.PaintHolder<_i7.ScatterChartData>? holder, + ) => + (super.noSuchMethod( + Invocation.method( + #getTouchedCoordinates, + [ + pixelX, + pixelY, + viewSize, + holder, + ], + ), + returnValue: _FakeFlSpot_8( + this, + Invocation.method( + #getTouchedCoordinates, + [ + pixelX, + pixelY, + viewSize, + holder, + ], + ), + ), + ) as _i7.FlSpot); + @override double getTooltipLeft( double? dx, double? tooltipWidth, - _i13.FLHorizontalAlignment? tooltipHorizontalAlignment, + _i7.FLHorizontalAlignment? tooltipHorizontalAlignment, double? tooltipHorizontalOffset, ) => (super.noSuchMethod( diff --git a/test/utils/canvas_wrapper_test.mocks.dart b/test/utils/canvas_wrapper_test.mocks.dart index cccfd2559..6eba7105a 100644 --- a/test/utils/canvas_wrapper_test.mocks.dart +++ b/test/utils/canvas_wrapper_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/utils/canvas_wrapper_test.dart. // Do not manually edit this file. diff --git a/test/utils/utils_test.mocks.dart b/test/utils/utils_test.mocks.dart index fe4c97927..3aa8f0cad 100644 --- a/test/utils/utils_test.mocks.dart +++ b/test/utils/utils_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/utils/utils_test.dart. // Do not manually edit this file. From 5e9a68ee36574683c752e5ac5b8bbeec2241649b Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sat, 26 Aug 2023 21:06:58 +0200 Subject: [PATCH 014/149] Add dragSpotUpdatedCallback functionality --- lib/src/chart/line_chart/line_chart.dart | 14 +++++++- lib/src/chart/line_chart/line_chart_data.dart | 34 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index 82a601469..8de97dab2 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -40,6 +40,8 @@ class _LineChartState extends AnimatedWidgetBaseState { /// but we need to keep the provided callback to notify it too. BaseTouchCallback? _providedTouchCallback; + DragSpotUpdatedCallback? _dragSpotUpdatedCallback; + final List _showingTouchedTooltips = []; final Map> _showingTouchedIndicators = {}; @@ -101,6 +103,7 @@ class _LineChartState extends AnimatedWidgetBaseState { final lineTouchData = widget.data.lineTouchData; if (lineTouchData.enabled && lineTouchData.handleBuiltInTouches) { _providedTouchCallback = lineTouchData.touchCallback; + _dragSpotUpdatedCallback = lineTouchData.dragSpotUpdatedCallback; return widget.data.copyWith( lineBarsData: _lineBarsData, lineTouchData: widget.data.lineTouchData.copyWith( @@ -121,18 +124,25 @@ class _LineChartState extends AnimatedWidgetBaseState { return; } + // Cancel dragging if (event is FlPanEndEvent || event is FlLongPressEnd) { setState(() { _draggingSpotIndexes = null; }); } + // if indexes of dragging spot exist, changes it's position if (_draggingSpotIndexes != null) { + final (barIndex, spotIndex) = _draggingSpotIndexes!; setState(() { - final (barIndex, spotIndex) = _draggingSpotIndexes!; _lineBarsData[barIndex].spots[spotIndex] = touchResponse!.touchedAxesPoint!; }); + _dragSpotUpdatedCallback?.call(UpdatedDragSpotsData( + barIndex, + spotIndex, + _lineBarsData[barIndex].spots, + )); } _providedTouchCallback?.call(event, touchResponse); @@ -162,6 +172,8 @@ class _LineChartState extends AnimatedWidgetBaseState { ..add(ShowingTooltipIndicators(sortedLineSpots)); }); + // If there is needed event and any lineBar with .isDraggable flag exists, + // sets indexes of needed spot and starts dragging process. if (event is FlPanStartEvent || event is FlLongPressStart) { final barIndex = touchResponse.lineBarSpots?.first.barIndex; final spotIndex = touchResponse.lineBarSpots?.first.spotIndex; diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index f4c9ce1ec..388b09683 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -1076,6 +1076,7 @@ class LineTouchData extends FlTouchData with EquatableMixin { BaseTouchCallback? touchCallback, MouseCursorResolver? mouseCursorResolver, Duration? longPressDuration, + this.dragSpotUpdatedCallback, this.touchTooltipData = const LineTouchTooltipData(), this.getTouchedSpotIndicator = defaultTouchedIndicators, this.touchSpotThreshold = 10, @@ -1096,6 +1097,8 @@ class LineTouchData extends FlTouchData with EquatableMixin { /// Configs of how touch indicator looks like. final GetTouchedSpotIndicator getTouchedSpotIndicator; + final DragSpotUpdatedCallback? dragSpotUpdatedCallback; + /// Distance threshold to handle the touch event. final double touchSpotThreshold; @@ -1120,6 +1123,7 @@ class LineTouchData extends FlTouchData with EquatableMixin { bool? enabled, BaseTouchCallback? touchCallback, MouseCursorResolver? mouseCursorResolver, + DragSpotUpdatedCallback? dragSpotUpdatedCallback, Duration? longPressDuration, LineTouchTooltipData? touchTooltipData, GetTouchedSpotIndicator? getTouchedSpotIndicator, @@ -1133,6 +1137,8 @@ class LineTouchData extends FlTouchData with EquatableMixin { enabled: enabled ?? this.enabled, touchCallback: touchCallback ?? this.touchCallback, mouseCursorResolver: mouseCursorResolver ?? this.mouseCursorResolver, + dragSpotUpdatedCallback: + dragSpotUpdatedCallback ?? this.dragSpotUpdatedCallback, longPressDuration: longPressDuration ?? this.longPressDuration, touchTooltipData: touchTooltipData ?? this.touchTooltipData, getTouchedSpotIndicator: @@ -1159,6 +1165,7 @@ class LineTouchData extends FlTouchData with EquatableMixin { handleBuiltInTouches, getTouchLineStart, getTouchLineEnd, + dragSpotUpdatedCallback, ]; } @@ -1185,6 +1192,8 @@ typedef CalculateTouchDistance = double Function( Offset spotPixelCoordinates, ); +typedef DragSpotUpdatedCallback = void Function(UpdatedDragSpotsData); + /// Default distanceCalculator only considers distance on x axis double _xDistance(Offset touchPoint, Offset spotPixelCoordinates) { return (touchPoint.dx - spotPixelCoordinates.dx).abs(); @@ -1387,6 +1396,31 @@ class LineBarSpot extends FlSpot with EquatableMixin { ]; } +/// Contains information about spots that have been updated using dragging feature. +class UpdatedDragSpotsData with EquatableMixin { + const UpdatedDragSpotsData( + this.updatedBarIndex, + this.updatedSpotIndex, + this.newSpots, + ); + + /// Index of updated bar + final int updatedBarIndex; + + /// Index of updated spot + final int updatedSpotIndex; + + /// New list of spots in updated line bar + final List newSpots; + + @override + List get props => [ + updatedBarIndex, + updatedSpotIndex, + newSpots, + ]; +} + /// A [LineBarSpot] that holds information about the event that selected it class TouchLineBarSpot extends LineBarSpot { TouchLineBarSpot( From 1e9a832fa74f47b5dedcd78877c05c3250a8e3a4 Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sat, 26 Aug 2023 21:16:48 +0200 Subject: [PATCH 015/149] Update changelog --- CHANGELOG.md | 1 + lib/src/chart/line_chart/line_chart.dart | 12 +++++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 99114db56..2ef4cbfd4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ * **BUGFIX** (by @Anas35) Fix Tooltip not displaying when value from BackgroundBarChartRodData is less than zero. #1345. * **BUGFIX** (by @imaNNeo) Fix Negative BarChartRodStackItem are not drawn correctly bug, #1347 * **BUGFIX** (by @imaNNeo) Fix bar_chart_helper minY calculation bug, #1388 +* **FEATURE** (by @G33kFreak) Add drag spots feature for LineChart, [#1420](https://github.com/imaNNeo/fl_chart/issues/1420) ## 0.63.0 * **BUGFIX** (by @imaNNeo) Fix PieChart crash on web-renderer html by ignoring `sectionsSpace` when `Path.combine()` does not work (it's flutter engine [issue](https://github.com/flutter/flutter/issues/44572)), #955 diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index 8de97dab2..95cd3a3a2 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -138,11 +138,13 @@ class _LineChartState extends AnimatedWidgetBaseState { _lineBarsData[barIndex].spots[spotIndex] = touchResponse!.touchedAxesPoint!; }); - _dragSpotUpdatedCallback?.call(UpdatedDragSpotsData( - barIndex, - spotIndex, - _lineBarsData[barIndex].spots, - )); + _dragSpotUpdatedCallback?.call( + UpdatedDragSpotsData( + barIndex, + spotIndex, + _lineBarsData[barIndex].spots, + ), + ); } _providedTouchCallback?.call(event, touchResponse); From 2a47fc4a45d8dd3b17cc10a31addd122ec88cff3 Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sat, 26 Aug 2023 21:46:12 +0200 Subject: [PATCH 016/149] Add sample of draggable line chart --- .../presentation/samples/chart_samples.dart | 2 + .../samples/line/line_chart_sample12.dart | 132 ++++++++++++++++++ lib/src/chart/line_chart/line_chart.dart | 24 ++-- lib/src/chart/line_chart/line_chart_data.dart | 14 +- 4 files changed, 155 insertions(+), 17 deletions(-) create mode 100644 example/lib/presentation/samples/line/line_chart_sample12.dart diff --git a/example/lib/presentation/samples/chart_samples.dart b/example/lib/presentation/samples/chart_samples.dart index 4114cd5f6..f5c789554 100644 --- a/example/lib/presentation/samples/chart_samples.dart +++ b/example/lib/presentation/samples/chart_samples.dart @@ -11,6 +11,7 @@ import 'chart_sample.dart'; import 'line/line_chart_sample1.dart'; import 'line/line_chart_sample10.dart'; import 'line/line_chart_sample11.dart'; +import 'line/line_chart_sample12.dart'; import 'line/line_chart_sample2.dart'; import 'line/line_chart_sample3.dart'; import 'line/line_chart_sample4.dart'; @@ -40,6 +41,7 @@ class ChartSamples { LineChartSample(9, (context) => LineChartSample9()), LineChartSample(10, (context) => const LineChartSample10()), LineChartSample(11, (context) => const LineChartSample11()), + LineChartSample(11, (context) => const LineChartSample12()), ], ChartType.bar: [ BarChartSample(1, (context) => BarChartSample1()), diff --git a/example/lib/presentation/samples/line/line_chart_sample12.dart b/example/lib/presentation/samples/line/line_chart_sample12.dart new file mode 100644 index 000000000..102f644a4 --- /dev/null +++ b/example/lib/presentation/samples/line/line_chart_sample12.dart @@ -0,0 +1,132 @@ +import 'package:fl_chart/fl_chart.dart'; +import 'package:fl_chart_app/presentation/resources/app_colors.dart'; +import 'package:flutter/material.dart'; + +class LineChartSample12 extends StatefulWidget { + const LineChartSample12({super.key}); + + @override + State createState() => _LineChartSample12State(); +} + +class _LineChartSample12State extends State { + List get spots1 => [ + const FlSpot(1, 3), + const FlSpot(2, 2), + const FlSpot(4, 5), + const FlSpot(6, 4), + ]; + List get spots2 => [ + const FlSpot(1, 1), + const FlSpot(2, 4), + const FlSpot(3, 6), + const FlSpot(5, 3), + ]; + + UpdatedDragSpotsData? _lastUpdate; + + void _onUpdated(UpdatedDragSpotsData newUpdate) { + setState(() { + _lastUpdate = newUpdate; + }); + } + + String get _formattedLastSpotValue { + if (_lastUpdate == null) { + return 'Updated spot: None'; + } + + final flSpot = _lastUpdate!.newSpots[_lastUpdate!.updatedSpotIndex]; + + return 'new X: ${flSpot.x.toStringAsFixed(2)}, new Y: ${flSpot.y.toStringAsFixed(2)}'; + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + const SizedBox(height: 12), + Text( + 'Last updated bar index: ${_lastUpdate?.updatedBarIndex ?? 'none'}', + style: const TextStyle( + color: AppColors.mainTextColor2, + fontSize: 12, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 12), + Text( + 'Last updated spot index: ${_lastUpdate?.updatedSpotIndex ?? 'none'}', + style: const TextStyle( + color: AppColors.mainTextColor2, + fontSize: 12, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 12), + Text( + _formattedLastSpotValue, + style: const TextStyle( + color: AppColors.mainTextColor2, + fontSize: 12, + fontWeight: FontWeight.bold, + ), + ), + AspectRatio( + aspectRatio: 1, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 24.0, + vertical: 10, + ), + child: LayoutBuilder(builder: (context, constraints) { + return LineChart( + LineChartData( + minY: 0, + minX: 0, + maxX: 8, + maxY: 8, + lineTouchData: LineTouchData( + enabled: true, + handleBuiltInTouches: true, + dragSpotUpdateFinishedCallback: _onUpdated, + getTouchedSpotIndicator: + (LineChartBarData barData, List spotIndexes) { + return spotIndexes.map((index) {}).toList(); + }, + touchTooltipData: LineTouchTooltipData( + tooltipBgColor: Colors.transparent, + getTooltipItems: (List lineBarsSpot) { + return lineBarsSpot.map((lineBarSpot) {}).toList(); + }, + ), + ), + lineBarsData: [ + LineChartBarData( + spots: spots1, + isCurved: true, + isDraggable: true, + ), + LineChartBarData( + spots: spots2, + isCurved: true, + isDraggable: false, + color: Colors.red, + ), + ], + gridData: const FlGridData(show: false), + borderData: FlBorderData( + show: true, + border: Border.all( + color: AppColors.borderColor, + ), + ), + ), + ); + }), + ), + ), + ], + ); + } +} diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index 95cd3a3a2..c8dd325b7 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -2,6 +2,7 @@ import 'package:fl_chart/fl_chart.dart'; import 'package:fl_chart/src/chart/base/axis_chart/axis_chart_scaffold_widget.dart'; import 'package:fl_chart/src/chart/line_chart/line_chart_renderer.dart'; import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; /// Renders a line chart as a widget, using provided [LineChartData]. @@ -40,7 +41,7 @@ class _LineChartState extends AnimatedWidgetBaseState { /// but we need to keep the provided callback to notify it too. BaseTouchCallback? _providedTouchCallback; - DragSpotUpdatedCallback? _dragSpotUpdatedCallback; + DragSpotUpdateFinishedCallback? _dragSpotUpdatedCallback; final List _showingTouchedTooltips = []; @@ -62,7 +63,7 @@ class _LineChartState extends AnimatedWidgetBaseState { @override void didUpdateWidget(covariant LineChart oldWidget) { - if (widget.data.lineBarsData != _lineBarsData) { + if (!listEquals(oldWidget.data.lineBarsData, widget.data.lineBarsData)) { _lineBarsData = List.from(widget.data.lineBarsData); } super.didUpdateWidget(oldWidget); @@ -103,7 +104,7 @@ class _LineChartState extends AnimatedWidgetBaseState { final lineTouchData = widget.data.lineTouchData; if (lineTouchData.enabled && lineTouchData.handleBuiltInTouches) { _providedTouchCallback = lineTouchData.touchCallback; - _dragSpotUpdatedCallback = lineTouchData.dragSpotUpdatedCallback; + _dragSpotUpdatedCallback = lineTouchData.dragSpotUpdateFinishedCallback; return widget.data.copyWith( lineBarsData: _lineBarsData, lineTouchData: widget.data.lineTouchData.copyWith( @@ -126,6 +127,16 @@ class _LineChartState extends AnimatedWidgetBaseState { // Cancel dragging if (event is FlPanEndEvent || event is FlLongPressEnd) { + if (_draggingSpotIndexes != null) { + final (barIndex, spotIndex) = _draggingSpotIndexes!; + _dragSpotUpdatedCallback?.call( + UpdatedDragSpotsData( + barIndex, + spotIndex, + _lineBarsData[barIndex].spots, + ), + ); + } setState(() { _draggingSpotIndexes = null; }); @@ -138,13 +149,6 @@ class _LineChartState extends AnimatedWidgetBaseState { _lineBarsData[barIndex].spots[spotIndex] = touchResponse!.touchedAxesPoint!; }); - _dragSpotUpdatedCallback?.call( - UpdatedDragSpotsData( - barIndex, - spotIndex, - _lineBarsData[barIndex].spots, - ), - ); } _providedTouchCallback?.call(event, touchResponse); diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index 388b09683..268c8cb6d 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -1076,7 +1076,7 @@ class LineTouchData extends FlTouchData with EquatableMixin { BaseTouchCallback? touchCallback, MouseCursorResolver? mouseCursorResolver, Duration? longPressDuration, - this.dragSpotUpdatedCallback, + this.dragSpotUpdateFinishedCallback, this.touchTooltipData = const LineTouchTooltipData(), this.getTouchedSpotIndicator = defaultTouchedIndicators, this.touchSpotThreshold = 10, @@ -1097,7 +1097,7 @@ class LineTouchData extends FlTouchData with EquatableMixin { /// Configs of how touch indicator looks like. final GetTouchedSpotIndicator getTouchedSpotIndicator; - final DragSpotUpdatedCallback? dragSpotUpdatedCallback; + final DragSpotUpdateFinishedCallback? dragSpotUpdateFinishedCallback; /// Distance threshold to handle the touch event. final double touchSpotThreshold; @@ -1123,7 +1123,7 @@ class LineTouchData extends FlTouchData with EquatableMixin { bool? enabled, BaseTouchCallback? touchCallback, MouseCursorResolver? mouseCursorResolver, - DragSpotUpdatedCallback? dragSpotUpdatedCallback, + DragSpotUpdateFinishedCallback? dragSpotUpdateFinishedCallback, Duration? longPressDuration, LineTouchTooltipData? touchTooltipData, GetTouchedSpotIndicator? getTouchedSpotIndicator, @@ -1137,8 +1137,8 @@ class LineTouchData extends FlTouchData with EquatableMixin { enabled: enabled ?? this.enabled, touchCallback: touchCallback ?? this.touchCallback, mouseCursorResolver: mouseCursorResolver ?? this.mouseCursorResolver, - dragSpotUpdatedCallback: - dragSpotUpdatedCallback ?? this.dragSpotUpdatedCallback, + dragSpotUpdateFinishedCallback: + dragSpotUpdateFinishedCallback ?? this.dragSpotUpdateFinishedCallback, longPressDuration: longPressDuration ?? this.longPressDuration, touchTooltipData: touchTooltipData ?? this.touchTooltipData, getTouchedSpotIndicator: @@ -1165,7 +1165,7 @@ class LineTouchData extends FlTouchData with EquatableMixin { handleBuiltInTouches, getTouchLineStart, getTouchLineEnd, - dragSpotUpdatedCallback, + dragSpotUpdateFinishedCallback, ]; } @@ -1192,7 +1192,7 @@ typedef CalculateTouchDistance = double Function( Offset spotPixelCoordinates, ); -typedef DragSpotUpdatedCallback = void Function(UpdatedDragSpotsData); +typedef DragSpotUpdateFinishedCallback = void Function(UpdatedDragSpotsData); /// Default distanceCalculator only considers distance on x axis double _xDistance(Offset touchPoint, Offset spotPixelCoordinates) { From b1703f7a2749e11007bac1f1a5306f4213fdfcdb Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sat, 26 Aug 2023 22:32:35 +0200 Subject: [PATCH 017/149] minor fixes --- example/lib/presentation/samples/chart_samples.dart | 2 +- lib/src/chart/line_chart/line_chart.dart | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/example/lib/presentation/samples/chart_samples.dart b/example/lib/presentation/samples/chart_samples.dart index f5c789554..9bcde69e3 100644 --- a/example/lib/presentation/samples/chart_samples.dart +++ b/example/lib/presentation/samples/chart_samples.dart @@ -41,7 +41,7 @@ class ChartSamples { LineChartSample(9, (context) => LineChartSample9()), LineChartSample(10, (context) => const LineChartSample10()), LineChartSample(11, (context) => const LineChartSample11()), - LineChartSample(11, (context) => const LineChartSample12()), + LineChartSample(12, (context) => const LineChartSample12()), ], ChartType.bar: [ BarChartSample(1, (context) => BarChartSample1()), diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index c8dd325b7..039956b37 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -63,7 +63,18 @@ class _LineChartState extends AnimatedWidgetBaseState { @override void didUpdateWidget(covariant LineChart oldWidget) { - if (!listEquals(oldWidget.data.lineBarsData, widget.data.lineBarsData)) { + final oldSpots = oldWidget.data.lineBarsData + .map((e) => e.spots) + .toList() + .expand((list) => list) + .toList(); + final currentSpots = oldWidget.data.lineBarsData + .map((e) => e.spots) + .toList() + .expand((list) => list) + .toList(); + + if (!listEquals(oldSpots, currentSpots)) { _lineBarsData = List.from(widget.data.lineBarsData); } super.didUpdateWidget(oldWidget); From 32b71628835416bb5632b9ad49938fe249a944a2 Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sat, 26 Aug 2023 23:31:00 +0200 Subject: [PATCH 018/149] Change the comparing logic in didUpdateWidget --- lib/src/chart/line_chart/line_chart.dart | 14 +++++++++++++- lib/src/chart/line_chart/line_chart_data.dart | 1 + 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index 039956b37..9d03b1e5f 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -57,12 +57,24 @@ class _LineChartState extends AnimatedWidgetBaseState { @override void initState() { - _lineBarsData = List.from(widget.data.lineBarsData); + _lineBarsData = List.from( + widget.data.lineBarsData + .map((lineBarData) => lineBarData.copyWith()) + .toList(), + ); super.initState(); } @override void didUpdateWidget(covariant LineChart oldWidget) { + if (!listEquals(oldWidget.data.lineBarsData, widget.data.lineBarsData)) { + _lineBarsData = List.from( + widget.data.lineBarsData + .map((lineBarData) => lineBarData.copyWith()) + .toList(), + ); + } + final oldSpots = oldWidget.data.lineBarsData .map((e) => e.spots) .toList() diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index 268c8cb6d..453f79848 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -479,6 +479,7 @@ class LineChartBarData with EquatableMixin { shadow, isStepLineChart, lineChartStepData, + isDraggable, ]; } From 60e9e4aca1c4454eded8033d115ea3c8e7956cd2 Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sun, 27 Aug 2023 00:06:49 +0200 Subject: [PATCH 019/149] Removed unnecessary logic --- lib/src/chart/line_chart/line_chart.dart | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index 9d03b1e5f..d46ddf25d 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -74,21 +74,6 @@ class _LineChartState extends AnimatedWidgetBaseState { .toList(), ); } - - final oldSpots = oldWidget.data.lineBarsData - .map((e) => e.spots) - .toList() - .expand((list) => list) - .toList(); - final currentSpots = oldWidget.data.lineBarsData - .map((e) => e.spots) - .toList() - .expand((list) => list) - .toList(); - - if (!listEquals(oldSpots, currentSpots)) { - _lineBarsData = List.from(widget.data.lineBarsData); - } super.didUpdateWidget(oldWidget); } From f42ba9986be9f2833c1ed9b93cea4ef43cb63cba Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sun, 1 Oct 2023 14:13:21 +0200 Subject: [PATCH 020/149] Add draggable callbacks --- lib/src/chart/line_chart/line_chart.dart | 23 ++++++++++++++++--- lib/src/chart/line_chart/line_chart_data.dart | 23 ++++++++++++++++--- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index d46ddf25d..123c64711 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -41,7 +41,9 @@ class _LineChartState extends AnimatedWidgetBaseState { /// but we need to keep the provided callback to notify it too. BaseTouchCallback? _providedTouchCallback; - DragSpotUpdateFinishedCallback? _dragSpotUpdatedCallback; + DragSpotUpdateCallback? _dragSpotUpdateFinishedCallback; + DragSpotUpdateCallback? _dragSpotUpdateCallback; + DragSpotUpdateCallback? _dragSpotUpdateStartedCallback; final List _showingTouchedTooltips = []; @@ -112,7 +114,8 @@ class _LineChartState extends AnimatedWidgetBaseState { final lineTouchData = widget.data.lineTouchData; if (lineTouchData.enabled && lineTouchData.handleBuiltInTouches) { _providedTouchCallback = lineTouchData.touchCallback; - _dragSpotUpdatedCallback = lineTouchData.dragSpotUpdateFinishedCallback; + _dragSpotUpdateFinishedCallback = + lineTouchData.dragSpotUpdateFinishedCallback; return widget.data.copyWith( lineBarsData: _lineBarsData, lineTouchData: widget.data.lineTouchData.copyWith( @@ -137,7 +140,7 @@ class _LineChartState extends AnimatedWidgetBaseState { if (event is FlPanEndEvent || event is FlLongPressEnd) { if (_draggingSpotIndexes != null) { final (barIndex, spotIndex) = _draggingSpotIndexes!; - _dragSpotUpdatedCallback?.call( + _dragSpotUpdateFinishedCallback?.call( UpdatedDragSpotsData( barIndex, spotIndex, @@ -157,6 +160,13 @@ class _LineChartState extends AnimatedWidgetBaseState { _lineBarsData[barIndex].spots[spotIndex] = touchResponse!.touchedAxesPoint!; }); + _dragSpotUpdateCallback?.call( + UpdatedDragSpotsData( + barIndex, + spotIndex, + _lineBarsData[barIndex].spots, + ), + ); } _providedTouchCallback?.call(event, touchResponse); @@ -200,6 +210,13 @@ class _LineChartState extends AnimatedWidgetBaseState { _draggingSpotIndexes = (barIndex, spotIndex); }); } + _dragSpotUpdateStartedCallback?.call( + UpdatedDragSpotsData( + barIndex, + spotIndex, + _lineBarsData[barIndex].spots, + ), + ); } } } diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index 453f79848..5230eb441 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -1078,6 +1078,8 @@ class LineTouchData extends FlTouchData with EquatableMixin { MouseCursorResolver? mouseCursorResolver, Duration? longPressDuration, this.dragSpotUpdateFinishedCallback, + this.dragSpotUpdateCallback, + this.dragSpotUpdateStartedCallback, this.touchTooltipData = const LineTouchTooltipData(), this.getTouchedSpotIndicator = defaultTouchedIndicators, this.touchSpotThreshold = 10, @@ -1098,7 +1100,14 @@ class LineTouchData extends FlTouchData with EquatableMixin { /// Configs of how touch indicator looks like. final GetTouchedSpotIndicator getTouchedSpotIndicator; - final DragSpotUpdateFinishedCallback? dragSpotUpdateFinishedCallback; + /// Action when dragging of draggable spot is finished. + final DragSpotUpdateCallback? dragSpotUpdateFinishedCallback; + + /// Action when draggable spot has been updated. + final DragSpotUpdateCallback? dragSpotUpdateCallback; + + /// Action when dragging of draggable spot has been started + final DragSpotUpdateCallback? dragSpotUpdateStartedCallback; /// Distance threshold to handle the touch event. final double touchSpotThreshold; @@ -1124,7 +1133,9 @@ class LineTouchData extends FlTouchData with EquatableMixin { bool? enabled, BaseTouchCallback? touchCallback, MouseCursorResolver? mouseCursorResolver, - DragSpotUpdateFinishedCallback? dragSpotUpdateFinishedCallback, + DragSpotUpdateCallback? dragSpotUpdateFinishedCallback, + DragSpotUpdateCallback? dragSpotUpdateCallback, + DragSpotUpdateCallback? dragSpotUpdateStartedCallback, Duration? longPressDuration, LineTouchTooltipData? touchTooltipData, GetTouchedSpotIndicator? getTouchedSpotIndicator, @@ -1140,6 +1151,10 @@ class LineTouchData extends FlTouchData with EquatableMixin { mouseCursorResolver: mouseCursorResolver ?? this.mouseCursorResolver, dragSpotUpdateFinishedCallback: dragSpotUpdateFinishedCallback ?? this.dragSpotUpdateFinishedCallback, + dragSpotUpdateCallback: + dragSpotUpdateCallback ?? this.dragSpotUpdateCallback, + dragSpotUpdateStartedCallback: + dragSpotUpdateStartedCallback ?? this.dragSpotUpdateStartedCallback, longPressDuration: longPressDuration ?? this.longPressDuration, touchTooltipData: touchTooltipData ?? this.touchTooltipData, getTouchedSpotIndicator: @@ -1167,6 +1182,8 @@ class LineTouchData extends FlTouchData with EquatableMixin { getTouchLineStart, getTouchLineEnd, dragSpotUpdateFinishedCallback, + dragSpotUpdateCallback, + dragSpotUpdateStartedCallback, ]; } @@ -1193,7 +1210,7 @@ typedef CalculateTouchDistance = double Function( Offset spotPixelCoordinates, ); -typedef DragSpotUpdateFinishedCallback = void Function(UpdatedDragSpotsData); +typedef DragSpotUpdateCallback = void Function(UpdatedDragSpotsData); /// Default distanceCalculator only considers distance on x axis double _xDistance(Offset touchPoint, Offset spotPixelCoordinates) { From 77646e4549a0d1328089f046fbcc3ecaa55409b5 Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sun, 1 Oct 2023 14:41:15 +0200 Subject: [PATCH 021/149] Add initializations for drag feature callbacks --- lib/src/chart/line_chart/line_chart.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index 123c64711..4081598a2 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -116,6 +116,9 @@ class _LineChartState extends AnimatedWidgetBaseState { _providedTouchCallback = lineTouchData.touchCallback; _dragSpotUpdateFinishedCallback = lineTouchData.dragSpotUpdateFinishedCallback; + _dragSpotUpdateCallback = lineTouchData.dragSpotUpdateCallback; + _dragSpotUpdateStartedCallback = + lineTouchData.dragSpotUpdateStartedCallback; return widget.data.copyWith( lineBarsData: _lineBarsData, lineTouchData: widget.data.lineTouchData.copyWith( From 8f8a85185bcb760f7a3a761c83a452c048d0132e Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sat, 26 Aug 2023 18:09:34 +0200 Subject: [PATCH 022/149] Add draggable logic for LineChart --- lib/src/chart/line_chart/line_chart_data.dart | 4 ++++ lib/src/chart/line_chart/line_chart_painter.dart | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index 5230eb441..054911e4e 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -1446,10 +1446,14 @@ class TouchLineBarSpot extends LineBarSpot { super.barIndex, super.spot, this.distance, + this.touchedAxesPoint, ); /// Distance in pixels from where the user taped final double distance; + + /// Position in spots' values converted from local position + final FlSpot touchedAxesPoint; } /// Holds data of showing each row item in the tooltip popup. diff --git a/lib/src/chart/line_chart/line_chart_painter.dart b/lib/src/chart/line_chart/line_chart_painter.dart index e0a31a265..56fdd6190 100644 --- a/lib/src/chart/line_chart/line_chart_painter.dart +++ b/lib/src/chart/line_chart/line_chart_painter.dart @@ -1244,6 +1244,13 @@ class LineChartPainter extends AxisChartPainter { return null; } + final axesPoint = getTouchedCoordinates( + touchedPoint.dx, + touchedPoint.dy, + viewSize, + holder, + ); + /// Find the nearest spot (based on distanceCalculator) final sortedSpots = []; double? smallestDistance; @@ -1275,6 +1282,7 @@ class LineChartPainter extends AxisChartPainter { barDataPosition, sortedSpots.first, smallestDistance!, + axesPoint, ); } else { return null; From 76348e3e076734a17652eefbd3b4bc5e36d0733d Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sat, 26 Aug 2023 20:41:27 +0200 Subject: [PATCH 023/149] Remake logic of updating spot's position and adjust tests --- lib/src/chart/line_chart/line_chart_data.dart | 4 ---- lib/src/chart/line_chart/line_chart_painter.dart | 8 -------- 2 files changed, 12 deletions(-) diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index 054911e4e..5230eb441 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -1446,14 +1446,10 @@ class TouchLineBarSpot extends LineBarSpot { super.barIndex, super.spot, this.distance, - this.touchedAxesPoint, ); /// Distance in pixels from where the user taped final double distance; - - /// Position in spots' values converted from local position - final FlSpot touchedAxesPoint; } /// Holds data of showing each row item in the tooltip popup. diff --git a/lib/src/chart/line_chart/line_chart_painter.dart b/lib/src/chart/line_chart/line_chart_painter.dart index 56fdd6190..e0a31a265 100644 --- a/lib/src/chart/line_chart/line_chart_painter.dart +++ b/lib/src/chart/line_chart/line_chart_painter.dart @@ -1244,13 +1244,6 @@ class LineChartPainter extends AxisChartPainter { return null; } - final axesPoint = getTouchedCoordinates( - touchedPoint.dx, - touchedPoint.dy, - viewSize, - holder, - ); - /// Find the nearest spot (based on distanceCalculator) final sortedSpots = []; double? smallestDistance; @@ -1282,7 +1275,6 @@ class LineChartPainter extends AxisChartPainter { barDataPosition, sortedSpots.first, smallestDistance!, - axesPoint, ); } else { return null; From 539cca8738cc66d3f1a5a72a1f3ae27514a2a3c6 Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sun, 1 Oct 2023 14:41:15 +0200 Subject: [PATCH 024/149] Add initializations for drag feature callbacks --- lib/src/chart/line_chart/line_chart.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index 123c64711..4081598a2 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -116,6 +116,9 @@ class _LineChartState extends AnimatedWidgetBaseState { _providedTouchCallback = lineTouchData.touchCallback; _dragSpotUpdateFinishedCallback = lineTouchData.dragSpotUpdateFinishedCallback; + _dragSpotUpdateCallback = lineTouchData.dragSpotUpdateCallback; + _dragSpotUpdateStartedCallback = + lineTouchData.dragSpotUpdateStartedCallback; return widget.data.copyWith( lineBarsData: _lineBarsData, lineTouchData: widget.data.lineTouchData.copyWith( From cb51189fc2883b90a36e12e32958fe46445c5cbb Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Sat, 7 Oct 2023 03:14:37 +0200 Subject: [PATCH 025/149] Consider fraction digits when formatting chart side titles, #1267 --- .../side_titles/side_titles_widget.dart | 6 +- lib/src/utils/utils.dart | 49 +++++-- pubspec.yaml | 6 +- .../bar_chart/bar_chart_painter_test.dart | 6 +- .../bar_chart_painter_test.mocks.dart | 102 +++++++++++++- .../bar_chart_renderer_test.mocks.dart | 81 ++++++++++- .../line_chart_painter_test.mocks.dart | 130 +++++++++++++++++- .../line_chart_renderer_test.mocks.dart | 95 ++++++++++++- .../pie_chart_painter_test.mocks.dart | 102 +++++++++++++- .../pie_chart_renderer_test.mocks.dart | 78 ++++++++++- .../radar_chart_painter_test.mocks.dart | 102 +++++++++++++- .../radar_chart_renderer_test.mocks.dart | 82 ++++++++++- .../scatter_chart_painter_test.mocks.dart | 102 +++++++++++++- .../scatter_chart_renderer_test.mocks.dart | 80 ++++++++++- test/utils/canvas_wrapper_test.mocks.dart | 74 +++++++++- test/utils/utils_test.dart | 73 ++++++---- test/utils/utils_test.mocks.dart | 46 ++++++- 17 files changed, 1144 insertions(+), 70 deletions(-) diff --git a/lib/src/chart/base/axis_chart/side_titles/side_titles_widget.dart b/lib/src/chart/base/axis_chart/side_titles/side_titles_widget.dart index 37be97326..aa3f58ea5 100644 --- a/lib/src/chart/base/axis_chart/side_titles/side_titles_widget.dart +++ b/lib/src/chart/base/axis_chart/side_titles/side_titles_widget.dart @@ -160,7 +160,11 @@ class SideTitlesWidget extends StatelessWidget { max: axisMax, appliedInterval: interval, sideTitles: sideTitles, - formattedValue: Utils().formatNumber(metaData.axisValue), + formattedValue: Utils().formatNumber( + axisMin, + axisMax, + metaData.axisValue, + ), axisSide: side, parentAxisSize: axisViewSize, axisPosition: metaData.axisPixelLocation, diff --git a/lib/src/utils/utils.dart b/lib/src/utils/utils.dart index a8f32ba90..21b8ffa12 100644 --- a/lib/src/utils/utils.dart +++ b/lib/src/utils/utils.dart @@ -211,6 +211,32 @@ class Utils { /// kilo (thousands) number static const double kilo = 1000; + /// Returns count of fraction digits of a value + int getFractionDigits(double value) { + if (value >= 1) { + return 1; + } else if (value >= 0.1) { + return 2; + } else if (value >= 0.01) { + return 3; + } else if (value >= 0.001) { + return 4; + } else if (value >= 0.0001) { + return 5; + } else if (value >= 0.00001) { + return 6; + } else if (value >= 0.000001) { + return 7; + } else if (value >= 0.0000001) { + return 8; + } else if (value >= 0.00000001) { + return 9; + } else if (value >= 0.000000001) { + return 10; + } + return 1; + } + /// Formats and add symbols (K, M, B) at the end of number. /// /// if number is larger than [billion], it returns a short number like 13.3B, @@ -218,26 +244,29 @@ class Utils { /// if number is larger than [kilo], it returns a short number like 4K, /// otherwise it returns number itself. /// also it removes .0, at the end of number for simplicity. - String formatNumber(double number) { - final isNegative = number < 0; + String formatNumber(double axisMin, double axisMax, double axisValue) { + final isNegative = axisValue < 0; if (isNegative) { - number = number.abs(); + axisValue = axisValue.abs(); } String resultNumber; String symbol; - if (number >= billion) { - resultNumber = (number / billion).toStringAsFixed(1); + if (axisValue >= billion) { + resultNumber = (axisValue / billion).toStringAsFixed(1); symbol = 'B'; - } else if (number >= million) { - resultNumber = (number / million).toStringAsFixed(1); + } else if (axisValue >= million) { + resultNumber = (axisValue / million).toStringAsFixed(1); symbol = 'M'; - } else if (number >= kilo) { - resultNumber = (number / kilo).toStringAsFixed(1); + } else if (axisValue >= kilo) { + resultNumber = (axisValue / kilo).toStringAsFixed(1); symbol = 'K'; } else { - resultNumber = number.toStringAsFixed(1); + final diff = (axisMin - axisMax).abs(); + resultNumber = axisValue.toStringAsFixed( + getFractionDigits(diff), + ); symbol = ''; } diff --git a/pubspec.yaml b/pubspec.yaml index f46c8a296..837e3011b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -19,12 +19,12 @@ dependencies: sdk: flutter dev_dependencies: - build_runner: ^2.4.2 + build_runner: ^2.4.6 flutter_test: sdk: flutter - mockito: ^5.4.0 + mockito: ^5.4.2 vector_math: ^2.1.4 #Added to use in some generated codes of mockito - very_good_analysis: ^5.0.0 + very_good_analysis: ^5.1.0 screenshots: - description: 'LineChartSample1 and LineChartSample2' diff --git a/test/chart/bar_chart/bar_chart_painter_test.dart b/test/chart/bar_chart/bar_chart_painter_test.dart index 106718ebf..f5750b372 100644 --- a/test/chart/bar_chart/bar_chart_painter_test.dart +++ b/test/chart/bar_chart/bar_chart_painter_test.dart @@ -795,7 +795,7 @@ void main() { when(mockUtils.normalizeBorderSide(any, any)).thenReturn(BorderSide.none); when(mockUtils.calculateRotationOffset(any, any)).thenReturn(Offset.zero); when(mockUtils.getBestInitialIntervalValue(any, any, any)).thenReturn(0); - when(mockUtils.formatNumber(captureAny)).thenAnswer((inv) { + when(mockUtils.formatNumber(any, any, captureAny)).thenAnswer((inv) { final value = inv.positionalArguments[0] as double; return '${value.toInt()}'; }); @@ -987,7 +987,7 @@ void main() { when(mockUtils.normalizeBorderSide(any, any)).thenReturn(BorderSide.none); when(mockUtils.calculateRotationOffset(any, any)).thenReturn(Offset.zero); when(mockUtils.getBestInitialIntervalValue(any, any, any)).thenReturn(0); - when(mockUtils.formatNumber(captureAny)).thenAnswer((inv) { + when(mockUtils.formatNumber(any, any, captureAny)).thenAnswer((inv) { final value = inv.positionalArguments[0] as double; return '${value.toInt()}'; }); @@ -1182,7 +1182,7 @@ void main() { when(mockUtils.normalizeBorderSide(any, any)).thenReturn(BorderSide.none); when(mockUtils.calculateRotationOffset(any, any)).thenReturn(Offset.zero); when(mockUtils.getBestInitialIntervalValue(any, any, any)).thenReturn(0); - when(mockUtils.formatNumber(captureAny)).thenAnswer((inv) { + when(mockUtils.formatNumber(any, any, captureAny)).thenAnswer((inv) { final value = inv.positionalArguments[0] as double; return '${value.toInt()}'; }); diff --git a/test/chart/bar_chart/bar_chart_painter_test.mocks.dart b/test/chart/bar_chart/bar_chart_painter_test.mocks.dart index 7e4833f7e..87f099ca9 100644 --- a/test/chart/bar_chart/bar_chart_painter_test.mocks.dart +++ b/test/chart/bar_chart/bar_chart_painter_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/chart/bar_chart/bar_chart_painter_test.dart. // Do not manually edit this file. @@ -155,6 +155,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void saveLayer( _i2.Rect? bounds, @@ -170,6 +171,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void restore() => super.noSuchMethod( Invocation.method( @@ -178,6 +180,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void restoreToCount(int? count) => super.noSuchMethod( Invocation.method( @@ -186,6 +189,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override int getSaveCount() => (super.noSuchMethod( Invocation.method( @@ -194,6 +198,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValue: 0, ) as int); + @override void translate( double? dx, @@ -209,6 +214,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void scale( double? sx, [ @@ -224,6 +230,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void rotate(double? radians) => super.noSuchMethod( Invocation.method( @@ -232,6 +239,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void skew( double? sx, @@ -247,6 +255,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void transform(_i5.Float64List? matrix4) => super.noSuchMethod( Invocation.method( @@ -255,6 +264,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override _i5.Float64List getTransform() => (super.noSuchMethod( Invocation.method( @@ -263,6 +273,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValue: _i5.Float64List(0), ) as _i5.Float64List); + @override void clipRect( _i2.Rect? rect, { @@ -280,6 +291,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void clipRRect( _i2.RRect? rrect, { @@ -293,6 +305,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void clipPath( _i2.Path? path, { @@ -306,6 +319,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override _i2.Rect getLocalClipBounds() => (super.noSuchMethod( Invocation.method( @@ -320,6 +334,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), ), ) as _i2.Rect); + @override _i2.Rect getDestinationClipBounds() => (super.noSuchMethod( Invocation.method( @@ -334,6 +349,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), ), ) as _i2.Rect); + @override void drawColor( _i2.Color? color, @@ -349,6 +365,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawLine( _i2.Offset? p1, @@ -366,6 +383,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPaint(_i2.Paint? paint) => super.noSuchMethod( Invocation.method( @@ -374,6 +392,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRect( _i2.Rect? rect, @@ -389,6 +408,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRRect( _i2.RRect? rrect, @@ -404,6 +424,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawDRRect( _i2.RRect? outer, @@ -421,6 +442,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawOval( _i2.Rect? rect, @@ -436,6 +458,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawCircle( _i2.Offset? c, @@ -453,6 +476,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawArc( _i2.Rect? rect, @@ -474,6 +498,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPath( _i2.Path? path, @@ -489,6 +514,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImage( _i2.Image? image, @@ -506,6 +532,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImageRect( _i2.Image? image, @@ -525,6 +552,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImageNine( _i2.Image? image, @@ -544,6 +572,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPicture(_i2.Picture? picture) => super.noSuchMethod( Invocation.method( @@ -552,6 +581,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawParagraph( _i2.Paragraph? paragraph, @@ -567,6 +597,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPoints( _i2.PointMode? pointMode, @@ -584,6 +615,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRawPoints( _i2.PointMode? pointMode, @@ -601,6 +633,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawVertices( _i2.Vertices? vertices, @@ -618,6 +651,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawAtlas( _i2.Image? atlas, @@ -643,6 +677,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRawAtlas( _i2.Image? atlas, @@ -668,6 +703,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawShadow( _i2.Path? path, @@ -705,6 +741,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { Invocation.getter(#canvas), ), ) as _i2.Canvas); + @override _i2.Size get size => (super.noSuchMethod( Invocation.getter(#size), @@ -713,6 +750,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { Invocation.getter(#size), ), ) as _i2.Size); + @override void drawRRect( _i2.RRect? rrect, @@ -728,6 +766,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void save() => super.noSuchMethod( Invocation.method( @@ -736,6 +775,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void restore() => super.noSuchMethod( Invocation.method( @@ -744,6 +784,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void clipRect( _i2.Rect? rect, { @@ -761,6 +802,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void translate( double? dx, @@ -776,6 +818,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void rotate(double? radius) => super.noSuchMethod( Invocation.method( @@ -784,6 +827,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawPath( _i2.Path? path, @@ -799,6 +843,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void saveLayer( _i2.Rect? bounds, @@ -814,6 +859,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawPicture(_i2.Picture? picture) => super.noSuchMethod( Invocation.method( @@ -822,6 +868,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawImage( _i2.Image? image, @@ -839,6 +886,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void clipPath( _i2.Path? path, { @@ -852,6 +900,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawRect( _i2.Rect? rect, @@ -867,6 +916,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawLine( _i2.Offset? p1, @@ -884,6 +934,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawCircle( _i2.Offset? center, @@ -901,6 +952,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawArc( _i2.Rect? rect, @@ -922,6 +974,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawText( _i3.TextPainter? tp, @@ -939,6 +992,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawDot( _i7.FlDotPainter? painter, @@ -956,6 +1010,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawRotated({ required _i2.Size? size, @@ -978,6 +1033,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawDashedLine( _i2.Offset? from, @@ -1015,16 +1071,19 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { Invocation.getter(#widget), ), ) as _i3.Widget); + @override bool get mounted => (super.noSuchMethod( Invocation.getter(#mounted), returnValue: false, ) as bool); + @override bool get debugDoingBuild => (super.noSuchMethod( Invocation.getter(#debugDoingBuild), returnValue: false, ) as bool); + @override _i3.InheritedWidget dependOnInheritedElement( _i3.InheritedElement? ancestor, { @@ -1045,6 +1104,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), ), ) as _i3.InheritedWidget); + @override void visitAncestorElements(_i3.ConditionalElementVisitor? visitor) => super.noSuchMethod( @@ -1054,6 +1114,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), returnValueForMissingStub: null, ); + @override void visitChildElements(_i3.ElementVisitor? visitor) => super.noSuchMethod( Invocation.method( @@ -1062,6 +1123,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), returnValueForMissingStub: null, ); + @override void dispatchNotification(_i3.Notification? notification) => super.noSuchMethod( @@ -1071,6 +1133,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), returnValueForMissingStub: null, ); + @override _i3.DiagnosticsNode describeElement( String? name, { @@ -1091,6 +1154,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), ), ) as _i3.DiagnosticsNode); + @override _i3.DiagnosticsNode describeWidget( String? name, { @@ -1111,6 +1175,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), ), ) as _i3.DiagnosticsNode); + @override List<_i3.DiagnosticsNode> describeMissingAncestor( {required Type? expectedAncestorType}) => @@ -1122,6 +1187,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), returnValue: <_i3.DiagnosticsNode>[], ) as List<_i3.DiagnosticsNode>); + @override _i3.DiagnosticsNode describeOwnershipChain(String? name) => (super.noSuchMethod( @@ -1155,6 +1221,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), returnValue: 0.0, ) as double); + @override double degrees(double? radians) => (super.noSuchMethod( Invocation.method( @@ -1163,6 +1230,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), returnValue: 0.0, ) as double); + @override _i2.Size getDefaultSize(_i2.Size? screenSize) => (super.noSuchMethod( Invocation.method( @@ -1177,6 +1245,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), ), ) as _i2.Size); + @override double translateRotatedPosition( double? size, @@ -1192,6 +1261,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), returnValue: 0.0, ) as double); + @override _i2.Offset calculateRotationOffset( _i2.Size? size, @@ -1216,6 +1286,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), ), ) as _i2.Offset); + @override _i3.BorderRadius? normalizeBorderRadius( _i3.BorderRadius? borderRadius, @@ -1228,6 +1299,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { width, ], )) as _i3.BorderRadius?); + @override _i3.BorderSide normalizeBorderSide( _i3.BorderSide? borderSide, @@ -1252,6 +1324,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), ), ) as _i3.BorderSide); + @override double getEfficientInterval( double? axisViewSize, @@ -1269,6 +1342,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), returnValue: 0.0, ) as double); + @override double roundInterval(double? input) => (super.noSuchMethod( Invocation.method( @@ -1277,14 +1351,34 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), returnValue: 0.0, ) as double); + + @override + int getFractionDigits(double? value) => (super.noSuchMethod( + Invocation.method( + #getFractionDigits, + [value], + ), + returnValue: 0, + ) as int); + @override - String formatNumber(double? number) => (super.noSuchMethod( + String formatNumber( + double? axisMin, + double? axisMax, + double? axisValue, + ) => + (super.noSuchMethod( Invocation.method( #formatNumber, - [number], + [ + axisMin, + axisMax, + axisValue, + ], ), returnValue: '', ) as String); + @override _i3.TextStyle getThemeAwareTextStyle( _i3.BuildContext? context, @@ -1309,6 +1403,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), ), ) as _i3.TextStyle); + @override double getBestInitialIntervalValue( double? min, @@ -1328,6 +1423,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), returnValue: 0.0, ) as double); + @override double convertRadiusToSigma(double? radius) => (super.noSuchMethod( Invocation.method( diff --git a/test/chart/bar_chart/bar_chart_renderer_test.mocks.dart b/test/chart/bar_chart/bar_chart_renderer_test.mocks.dart index 48490ff23..ba3fc058d 100644 --- a/test/chart/bar_chart/bar_chart_renderer_test.mocks.dart +++ b/test/chart/bar_chart/bar_chart_renderer_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/chart/bar_chart/bar_chart_renderer_test.dart. // Do not manually edit this file. @@ -153,6 +153,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void saveLayer( _i2.Rect? bounds, @@ -168,6 +169,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void restore() => super.noSuchMethod( Invocation.method( @@ -176,6 +178,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void restoreToCount(int? count) => super.noSuchMethod( Invocation.method( @@ -184,6 +187,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override int getSaveCount() => (super.noSuchMethod( Invocation.method( @@ -192,6 +196,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValue: 0, ) as int); + @override void translate( double? dx, @@ -207,6 +212,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void scale( double? sx, [ @@ -222,6 +228,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void rotate(double? radians) => super.noSuchMethod( Invocation.method( @@ -230,6 +237,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void skew( double? sx, @@ -245,6 +253,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void transform(_i7.Float64List? matrix4) => super.noSuchMethod( Invocation.method( @@ -253,6 +262,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override _i7.Float64List getTransform() => (super.noSuchMethod( Invocation.method( @@ -261,6 +271,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValue: _i7.Float64List(0), ) as _i7.Float64List); + @override void clipRect( _i2.Rect? rect, { @@ -278,6 +289,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void clipRRect( _i2.RRect? rrect, { @@ -291,6 +303,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void clipPath( _i2.Path? path, { @@ -304,6 +317,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override _i2.Rect getLocalClipBounds() => (super.noSuchMethod( Invocation.method( @@ -318,6 +332,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), ), ) as _i2.Rect); + @override _i2.Rect getDestinationClipBounds() => (super.noSuchMethod( Invocation.method( @@ -332,6 +347,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), ), ) as _i2.Rect); + @override void drawColor( _i2.Color? color, @@ -347,6 +363,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawLine( _i2.Offset? p1, @@ -364,6 +381,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPaint(_i2.Paint? paint) => super.noSuchMethod( Invocation.method( @@ -372,6 +390,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRect( _i2.Rect? rect, @@ -387,6 +406,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRRect( _i2.RRect? rrect, @@ -402,6 +422,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawDRRect( _i2.RRect? outer, @@ -419,6 +440,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawOval( _i2.Rect? rect, @@ -434,6 +456,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawCircle( _i2.Offset? c, @@ -451,6 +474,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawArc( _i2.Rect? rect, @@ -472,6 +496,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPath( _i2.Path? path, @@ -487,6 +512,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImage( _i2.Image? image, @@ -504,6 +530,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImageRect( _i2.Image? image, @@ -523,6 +550,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImageNine( _i2.Image? image, @@ -542,6 +570,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPicture(_i2.Picture? picture) => super.noSuchMethod( Invocation.method( @@ -550,6 +579,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawParagraph( _i2.Paragraph? paragraph, @@ -565,6 +595,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPoints( _i2.PointMode? pointMode, @@ -582,6 +613,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRawPoints( _i2.PointMode? pointMode, @@ -599,6 +631,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawVertices( _i2.Vertices? vertices, @@ -616,6 +649,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawAtlas( _i2.Image? atlas, @@ -641,6 +675,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRawAtlas( _i2.Image? atlas, @@ -666,6 +701,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawShadow( _i2.Path? path, @@ -703,6 +739,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { Invocation.getter(#estimatedBounds), ), ) as _i2.Rect); + @override _i2.Canvas get canvas => (super.noSuchMethod( Invocation.getter(#canvas), @@ -711,6 +748,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { Invocation.getter(#canvas), ), ) as _i2.Canvas); + @override void paintChild( _i3.RenderObject? child, @@ -726,6 +764,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void appendLayer(_i4.Layer? layer) => super.noSuchMethod( Invocation.method( @@ -734,6 +773,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override _i2.VoidCallback addCompositionCallback(_i4.CompositionCallback? callback) => (super.noSuchMethod( @@ -743,6 +783,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValue: () {}, ) as _i2.VoidCallback); + @override void stopRecordingIfNeeded() => super.noSuchMethod( Invocation.method( @@ -751,6 +792,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void setIsComplexHint() => super.noSuchMethod( Invocation.method( @@ -759,6 +801,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void setWillChangeHint() => super.noSuchMethod( Invocation.method( @@ -767,6 +810,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void addLayer(_i4.Layer? layer) => super.noSuchMethod( Invocation.method( @@ -775,6 +819,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void pushLayer( _i4.ContainerLayer? childLayer, @@ -794,6 +839,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override _i3.PaintingContext createChildContext( _i4.ContainerLayer? childLayer, @@ -818,6 +864,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), ), ) as _i3.PaintingContext); + @override _i4.ClipRectLayer? pushClipRect( bool? needsCompositing, @@ -840,6 +887,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { #oldLayer: oldLayer, }, )) as _i4.ClipRectLayer?); + @override _i4.ClipRRectLayer? pushClipRRect( bool? needsCompositing, @@ -864,6 +912,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { #oldLayer: oldLayer, }, )) as _i4.ClipRRectLayer?); + @override _i4.ClipPathLayer? pushClipPath( bool? needsCompositing, @@ -888,6 +937,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { #oldLayer: oldLayer, }, )) as _i4.ClipPathLayer?); + @override _i4.ColorFilterLayer pushColorFilter( _i2.Offset? offset, @@ -918,6 +968,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), ), ) as _i4.ColorFilterLayer); + @override _i4.TransformLayer? pushTransform( bool? needsCompositing, @@ -936,6 +987,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ], {#oldLayer: oldLayer}, )) as _i4.TransformLayer?); + @override _i4.OpacityLayer pushOpacity( _i2.Offset? offset, @@ -966,6 +1018,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), ), ) as _i4.OpacityLayer); + @override void clipPathAndPaint( _i2.Path? path, @@ -985,6 +1038,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void clipRRectAndPaint( _i2.RRect? rrect, @@ -1004,6 +1058,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void clipRectAndPaint( _i2.Rect? rect, @@ -1041,16 +1096,19 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { Invocation.getter(#widget), ), ) as _i6.Widget); + @override bool get mounted => (super.noSuchMethod( Invocation.getter(#mounted), returnValue: false, ) as bool); + @override bool get debugDoingBuild => (super.noSuchMethod( Invocation.getter(#debugDoingBuild), returnValue: false, ) as bool); + @override _i6.InheritedWidget dependOnInheritedElement( _i6.InheritedElement? ancestor, { @@ -1071,6 +1129,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), ), ) as _i6.InheritedWidget); + @override void visitAncestorElements(_i6.ConditionalElementVisitor? visitor) => super.noSuchMethod( @@ -1080,6 +1139,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), returnValueForMissingStub: null, ); + @override void visitChildElements(_i6.ElementVisitor? visitor) => super.noSuchMethod( Invocation.method( @@ -1088,6 +1148,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), returnValueForMissingStub: null, ); + @override void dispatchNotification(_i9.Notification? notification) => super.noSuchMethod( @@ -1097,6 +1158,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), returnValueForMissingStub: null, ); + @override _i5.DiagnosticsNode describeElement( String? name, { @@ -1117,6 +1179,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), ), ) as _i5.DiagnosticsNode); + @override _i5.DiagnosticsNode describeWidget( String? name, { @@ -1137,6 +1200,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), ), ) as _i5.DiagnosticsNode); + @override List<_i5.DiagnosticsNode> describeMissingAncestor( {required Type? expectedAncestorType}) => @@ -1148,6 +1212,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), returnValue: <_i5.DiagnosticsNode>[], ) as List<_i5.DiagnosticsNode>); + @override _i5.DiagnosticsNode describeOwnershipChain(String? name) => (super.noSuchMethod( @@ -1190,6 +1255,7 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { ), returnValueForMissingStub: null, ); + @override List<_i10.GroupBarsPosition> calculateGroupAndBarsPosition( _i2.Size? viewSize, @@ -1207,6 +1273,7 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { ), returnValue: <_i10.GroupBarsPosition>[], ) as List<_i10.GroupBarsPosition>); + @override void drawBars( _i11.CanvasWrapper? canvasWrapper, @@ -1224,6 +1291,7 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { ), returnValueForMissingStub: null, ); + @override void drawTouchTooltip( _i6.BuildContext? context, @@ -1253,6 +1321,7 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { ), returnValueForMissingStub: null, ); + @override void drawStackItemBorderStroke( _i11.CanvasWrapper? canvasWrapper, @@ -1280,6 +1349,7 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { ), returnValueForMissingStub: null, ); + @override _i13.BarTouchedSpot? handleTouch( _i2.Offset? localPosition, @@ -1294,6 +1364,7 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { holder, ], )) as _i13.BarTouchedSpot?); + @override void drawGrid( _i11.CanvasWrapper? canvasWrapper, @@ -1309,6 +1380,7 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { ), returnValueForMissingStub: null, ); + @override void drawBackground( _i11.CanvasWrapper? canvasWrapper, @@ -1324,6 +1396,7 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { ), returnValueForMissingStub: null, ); + @override void drawRangeAnnotation( _i11.CanvasWrapper? canvasWrapper, @@ -1339,6 +1412,7 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { ), returnValueForMissingStub: null, ); + @override void drawExtraLines( _i6.BuildContext? context, @@ -1356,6 +1430,7 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { ), returnValueForMissingStub: null, ); + @override void drawHorizontalLines( _i6.BuildContext? context, @@ -1375,6 +1450,7 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { ), returnValueForMissingStub: null, ); + @override void drawVerticalLines( _i6.BuildContext? context, @@ -1394,6 +1470,7 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { ), returnValueForMissingStub: null, ); + @override double getPixelX( double? spotX, @@ -1411,6 +1488,7 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { ), returnValue: 0.0, ) as double); + @override double getPixelY( double? spotY, @@ -1428,6 +1506,7 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { ), returnValue: 0.0, ) as double); + @override double getTooltipLeft( double? dx, diff --git a/test/chart/line_chart/line_chart_painter_test.mocks.dart b/test/chart/line_chart/line_chart_painter_test.mocks.dart index 36127099e..983ad17ee 100644 --- a/test/chart/line_chart/line_chart_painter_test.mocks.dart +++ b/test/chart/line_chart/line_chart_painter_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/chart/line_chart/line_chart_painter_test.dart. // Do not manually edit this file. @@ -168,6 +168,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void saveLayer( _i2.Rect? bounds, @@ -183,6 +184,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void restore() => super.noSuchMethod( Invocation.method( @@ -191,6 +193,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void restoreToCount(int? count) => super.noSuchMethod( Invocation.method( @@ -199,6 +202,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override int getSaveCount() => (super.noSuchMethod( Invocation.method( @@ -207,6 +211,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValue: 0, ) as int); + @override void translate( double? dx, @@ -222,6 +227,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void scale( double? sx, [ @@ -237,6 +243,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void rotate(double? radians) => super.noSuchMethod( Invocation.method( @@ -245,6 +252,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void skew( double? sx, @@ -260,6 +268,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void transform(_i5.Float64List? matrix4) => super.noSuchMethod( Invocation.method( @@ -268,6 +277,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override _i5.Float64List getTransform() => (super.noSuchMethod( Invocation.method( @@ -276,6 +286,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValue: _i5.Float64List(0), ) as _i5.Float64List); + @override void clipRect( _i2.Rect? rect, { @@ -293,6 +304,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void clipRRect( _i2.RRect? rrect, { @@ -306,6 +318,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void clipPath( _i2.Path? path, { @@ -319,6 +332,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override _i2.Rect getLocalClipBounds() => (super.noSuchMethod( Invocation.method( @@ -333,6 +347,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), ), ) as _i2.Rect); + @override _i2.Rect getDestinationClipBounds() => (super.noSuchMethod( Invocation.method( @@ -347,6 +362,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), ), ) as _i2.Rect); + @override void drawColor( _i2.Color? color, @@ -362,6 +378,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawLine( _i2.Offset? p1, @@ -379,6 +396,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPaint(_i2.Paint? paint) => super.noSuchMethod( Invocation.method( @@ -387,6 +405,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRect( _i2.Rect? rect, @@ -402,6 +421,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRRect( _i2.RRect? rrect, @@ -417,6 +437,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawDRRect( _i2.RRect? outer, @@ -434,6 +455,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawOval( _i2.Rect? rect, @@ -449,6 +471,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawCircle( _i2.Offset? c, @@ -466,6 +489,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawArc( _i2.Rect? rect, @@ -487,6 +511,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPath( _i2.Path? path, @@ -502,6 +527,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImage( _i2.Image? image, @@ -519,6 +545,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImageRect( _i2.Image? image, @@ -538,6 +565,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImageNine( _i2.Image? image, @@ -557,6 +585,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPicture(_i2.Picture? picture) => super.noSuchMethod( Invocation.method( @@ -565,6 +594,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawParagraph( _i2.Paragraph? paragraph, @@ -580,6 +610,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPoints( _i2.PointMode? pointMode, @@ -597,6 +628,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRawPoints( _i2.PointMode? pointMode, @@ -614,6 +646,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawVertices( _i2.Vertices? vertices, @@ -631,6 +664,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawAtlas( _i2.Image? atlas, @@ -656,6 +690,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRawAtlas( _i2.Image? atlas, @@ -681,6 +716,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawShadow( _i2.Path? path, @@ -718,6 +754,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { Invocation.getter(#canvas), ), ) as _i2.Canvas); + @override _i2.Size get size => (super.noSuchMethod( Invocation.getter(#size), @@ -726,6 +763,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { Invocation.getter(#size), ), ) as _i2.Size); + @override void drawRRect( _i2.RRect? rrect, @@ -741,6 +779,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void save() => super.noSuchMethod( Invocation.method( @@ -749,6 +788,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void restore() => super.noSuchMethod( Invocation.method( @@ -757,6 +797,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void clipRect( _i2.Rect? rect, { @@ -774,6 +815,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void translate( double? dx, @@ -789,6 +831,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void rotate(double? radius) => super.noSuchMethod( Invocation.method( @@ -797,6 +840,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawPath( _i2.Path? path, @@ -812,6 +856,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void saveLayer( _i2.Rect? bounds, @@ -827,6 +872,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawPicture(_i2.Picture? picture) => super.noSuchMethod( Invocation.method( @@ -835,6 +881,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawImage( _i2.Image? image, @@ -852,6 +899,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void clipPath( _i2.Path? path, { @@ -865,6 +913,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawRect( _i2.Rect? rect, @@ -880,6 +929,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawLine( _i2.Offset? p1, @@ -897,6 +947,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawCircle( _i2.Offset? center, @@ -914,6 +965,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawArc( _i2.Rect? rect, @@ -935,6 +987,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawText( _i3.TextPainter? tp, @@ -952,6 +1005,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawDot( _i7.FlDotPainter? painter, @@ -969,6 +1023,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawRotated({ required _i2.Size? size, @@ -991,6 +1046,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawDashedLine( _i2.Offset? from, @@ -1028,16 +1084,19 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { Invocation.getter(#widget), ), ) as _i3.Widget); + @override bool get mounted => (super.noSuchMethod( Invocation.getter(#mounted), returnValue: false, ) as bool); + @override bool get debugDoingBuild => (super.noSuchMethod( Invocation.getter(#debugDoingBuild), returnValue: false, ) as bool); + @override _i3.InheritedWidget dependOnInheritedElement( _i3.InheritedElement? ancestor, { @@ -1058,6 +1117,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), ), ) as _i3.InheritedWidget); + @override void visitAncestorElements(_i3.ConditionalElementVisitor? visitor) => super.noSuchMethod( @@ -1067,6 +1127,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), returnValueForMissingStub: null, ); + @override void visitChildElements(_i3.ElementVisitor? visitor) => super.noSuchMethod( Invocation.method( @@ -1075,6 +1136,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), returnValueForMissingStub: null, ); + @override void dispatchNotification(_i3.Notification? notification) => super.noSuchMethod( @@ -1084,6 +1146,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), returnValueForMissingStub: null, ); + @override _i3.DiagnosticsNode describeElement( String? name, { @@ -1104,6 +1167,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), ), ) as _i3.DiagnosticsNode); + @override _i3.DiagnosticsNode describeWidget( String? name, { @@ -1124,6 +1188,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), ), ) as _i3.DiagnosticsNode); + @override List<_i3.DiagnosticsNode> describeMissingAncestor( {required Type? expectedAncestorType}) => @@ -1135,6 +1200,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), returnValue: <_i3.DiagnosticsNode>[], ) as List<_i3.DiagnosticsNode>); + @override _i3.DiagnosticsNode describeOwnershipChain(String? name) => (super.noSuchMethod( @@ -1168,6 +1234,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), returnValue: 0.0, ) as double); + @override double degrees(double? radians) => (super.noSuchMethod( Invocation.method( @@ -1176,6 +1243,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), returnValue: 0.0, ) as double); + @override _i2.Size getDefaultSize(_i2.Size? screenSize) => (super.noSuchMethod( Invocation.method( @@ -1190,6 +1258,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), ), ) as _i2.Size); + @override double translateRotatedPosition( double? size, @@ -1205,6 +1274,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), returnValue: 0.0, ) as double); + @override _i2.Offset calculateRotationOffset( _i2.Size? size, @@ -1229,6 +1299,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), ), ) as _i2.Offset); + @override _i3.BorderRadius? normalizeBorderRadius( _i3.BorderRadius? borderRadius, @@ -1241,6 +1312,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { width, ], )) as _i3.BorderRadius?); + @override _i3.BorderSide normalizeBorderSide( _i3.BorderSide? borderSide, @@ -1265,6 +1337,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), ), ) as _i3.BorderSide); + @override double getEfficientInterval( double? axisViewSize, @@ -1282,6 +1355,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), returnValue: 0.0, ) as double); + @override double roundInterval(double? input) => (super.noSuchMethod( Invocation.method( @@ -1290,14 +1364,34 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), returnValue: 0.0, ) as double); + + @override + int getFractionDigits(double? value) => (super.noSuchMethod( + Invocation.method( + #getFractionDigits, + [value], + ), + returnValue: 0, + ) as int); + @override - String formatNumber(double? number) => (super.noSuchMethod( + String formatNumber( + double? axisMin, + double? axisMax, + double? axisValue, + ) => + (super.noSuchMethod( Invocation.method( #formatNumber, - [number], + [ + axisMin, + axisMax, + axisValue, + ], ), returnValue: '', ) as String); + @override _i3.TextStyle getThemeAwareTextStyle( _i3.BuildContext? context, @@ -1322,6 +1416,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), ), ) as _i3.TextStyle); + @override double getBestInitialIntervalValue( double? min, @@ -1341,6 +1436,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), returnValue: 0.0, ) as double); + @override double convertRadiusToSigma(double? radius) => (super.noSuchMethod( Invocation.method( @@ -1376,6 +1472,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ), returnValueForMissingStub: null, ); + @override void clipToBorder( _i6.CanvasWrapper? canvasWrapper, @@ -1391,6 +1488,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ), returnValueForMissingStub: null, ); + @override void drawBarLine( _i6.CanvasWrapper? canvasWrapper, @@ -1408,6 +1506,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ), returnValueForMissingStub: null, ); + @override void drawBetweenBarsArea( _i6.CanvasWrapper? canvasWrapper, @@ -1427,6 +1526,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ), returnValueForMissingStub: null, ); + @override void drawDots( _i6.CanvasWrapper? canvasWrapper, @@ -1444,6 +1544,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ), returnValueForMissingStub: null, ); + @override void drawTouchedSpotsIndicator( _i6.CanvasWrapper? canvasWrapper, @@ -1461,6 +1562,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ), returnValueForMissingStub: null, ); + @override _i2.Path generateBarPath( _i2.Size? viewSize, @@ -1494,6 +1596,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ), ), ) as _i2.Path); + @override _i2.Path generateNormalBarPath( _i2.Size? viewSize, @@ -1527,6 +1630,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ), ), ) as _i2.Path); + @override _i2.Path generateStepBarPath( _i2.Size? viewSize, @@ -1560,6 +1664,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ), ), ) as _i2.Path); + @override _i2.Path generateBelowBarPath( _i2.Size? viewSize, @@ -1596,6 +1701,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ), ), ) as _i2.Path); + @override _i2.Path generateAboveBarPath( _i2.Size? viewSize, @@ -1632,6 +1738,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ), ), ) as _i2.Path); + @override void drawBelowBar( _i6.CanvasWrapper? canvasWrapper, @@ -1653,6 +1760,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ), returnValueForMissingStub: null, ); + @override void drawAboveBar( _i6.CanvasWrapper? canvasWrapper, @@ -1674,6 +1782,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ), returnValueForMissingStub: null, ); + @override void drawBetweenBar( _i6.CanvasWrapper? canvasWrapper, @@ -1695,6 +1804,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ), returnValueForMissingStub: null, ); + @override void drawBarShadow( _i6.CanvasWrapper? canvasWrapper, @@ -1712,6 +1822,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ), returnValueForMissingStub: null, ); + @override void drawBar( _i6.CanvasWrapper? canvasWrapper, @@ -1731,6 +1842,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ), returnValueForMissingStub: null, ); + @override void drawTouchTooltip( _i3.BuildContext? context, @@ -1754,6 +1866,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ), returnValueForMissingStub: null, ); + @override double getBarLineXLength( _i7.LineChartBarData? barData, @@ -1771,6 +1884,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ), returnValue: 0.0, ) as double); + @override List<_i7.TouchLineBarSpot>? handleTouch( _i2.Offset? localPosition, @@ -1785,6 +1899,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { holder, ], )) as List<_i7.TouchLineBarSpot>?); + @override _i7.TouchLineBarSpot? getNearestTouchedSpot( _i2.Size? viewSize, @@ -1803,6 +1918,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { holder, ], )) as _i7.TouchLineBarSpot?); + @override void drawGrid( _i6.CanvasWrapper? canvasWrapper, @@ -1818,6 +1934,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ), returnValueForMissingStub: null, ); + @override void drawBackground( _i6.CanvasWrapper? canvasWrapper, @@ -1833,6 +1950,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ), returnValueForMissingStub: null, ); + @override void drawRangeAnnotation( _i6.CanvasWrapper? canvasWrapper, @@ -1848,6 +1966,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ), returnValueForMissingStub: null, ); + @override void drawExtraLines( _i3.BuildContext? context, @@ -1865,6 +1984,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ), returnValueForMissingStub: null, ); + @override void drawHorizontalLines( _i3.BuildContext? context, @@ -1884,6 +2004,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ), returnValueForMissingStub: null, ); + @override void drawVerticalLines( _i3.BuildContext? context, @@ -1903,6 +2024,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ), returnValueForMissingStub: null, ); + @override double getPixelX( double? spotX, @@ -1920,6 +2042,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ), returnValue: 0.0, ) as double); + @override double getPixelY( double? spotY, @@ -1937,6 +2060,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { ), returnValue: 0.0, ) as double); + @override double getTooltipLeft( double? dx, diff --git a/test/chart/line_chart/line_chart_renderer_test.mocks.dart b/test/chart/line_chart/line_chart_renderer_test.mocks.dart index 97a29906e..ac69caab3 100644 --- a/test/chart/line_chart/line_chart_renderer_test.mocks.dart +++ b/test/chart/line_chart/line_chart_renderer_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/chart/line_chart/line_chart_renderer_test.dart. // Do not manually edit this file. @@ -163,6 +163,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void saveLayer( _i2.Rect? bounds, @@ -178,6 +179,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void restore() => super.noSuchMethod( Invocation.method( @@ -186,6 +188,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void restoreToCount(int? count) => super.noSuchMethod( Invocation.method( @@ -194,6 +197,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override int getSaveCount() => (super.noSuchMethod( Invocation.method( @@ -202,6 +206,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValue: 0, ) as int); + @override void translate( double? dx, @@ -217,6 +222,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void scale( double? sx, [ @@ -232,6 +238,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void rotate(double? radians) => super.noSuchMethod( Invocation.method( @@ -240,6 +247,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void skew( double? sx, @@ -255,6 +263,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void transform(_i7.Float64List? matrix4) => super.noSuchMethod( Invocation.method( @@ -263,6 +272,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override _i7.Float64List getTransform() => (super.noSuchMethod( Invocation.method( @@ -271,6 +281,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValue: _i7.Float64List(0), ) as _i7.Float64List); + @override void clipRect( _i2.Rect? rect, { @@ -288,6 +299,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void clipRRect( _i2.RRect? rrect, { @@ -301,6 +313,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void clipPath( _i2.Path? path, { @@ -314,6 +327,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override _i2.Rect getLocalClipBounds() => (super.noSuchMethod( Invocation.method( @@ -328,6 +342,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), ), ) as _i2.Rect); + @override _i2.Rect getDestinationClipBounds() => (super.noSuchMethod( Invocation.method( @@ -342,6 +357,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), ), ) as _i2.Rect); + @override void drawColor( _i2.Color? color, @@ -357,6 +373,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawLine( _i2.Offset? p1, @@ -374,6 +391,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPaint(_i2.Paint? paint) => super.noSuchMethod( Invocation.method( @@ -382,6 +400,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRect( _i2.Rect? rect, @@ -397,6 +416,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRRect( _i2.RRect? rrect, @@ -412,6 +432,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawDRRect( _i2.RRect? outer, @@ -429,6 +450,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawOval( _i2.Rect? rect, @@ -444,6 +466,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawCircle( _i2.Offset? c, @@ -461,6 +484,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawArc( _i2.Rect? rect, @@ -482,6 +506,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPath( _i2.Path? path, @@ -497,6 +522,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImage( _i2.Image? image, @@ -514,6 +540,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImageRect( _i2.Image? image, @@ -533,6 +560,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImageNine( _i2.Image? image, @@ -552,6 +580,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPicture(_i2.Picture? picture) => super.noSuchMethod( Invocation.method( @@ -560,6 +589,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawParagraph( _i2.Paragraph? paragraph, @@ -575,6 +605,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPoints( _i2.PointMode? pointMode, @@ -592,6 +623,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRawPoints( _i2.PointMode? pointMode, @@ -609,6 +641,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawVertices( _i2.Vertices? vertices, @@ -626,6 +659,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawAtlas( _i2.Image? atlas, @@ -651,6 +685,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRawAtlas( _i2.Image? atlas, @@ -676,6 +711,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawShadow( _i2.Path? path, @@ -713,6 +749,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { Invocation.getter(#estimatedBounds), ), ) as _i2.Rect); + @override _i2.Canvas get canvas => (super.noSuchMethod( Invocation.getter(#canvas), @@ -721,6 +758,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { Invocation.getter(#canvas), ), ) as _i2.Canvas); + @override void paintChild( _i3.RenderObject? child, @@ -736,6 +774,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void appendLayer(_i4.Layer? layer) => super.noSuchMethod( Invocation.method( @@ -744,6 +783,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override _i2.VoidCallback addCompositionCallback(_i4.CompositionCallback? callback) => (super.noSuchMethod( @@ -753,6 +793,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValue: () {}, ) as _i2.VoidCallback); + @override void stopRecordingIfNeeded() => super.noSuchMethod( Invocation.method( @@ -761,6 +802,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void setIsComplexHint() => super.noSuchMethod( Invocation.method( @@ -769,6 +811,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void setWillChangeHint() => super.noSuchMethod( Invocation.method( @@ -777,6 +820,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void addLayer(_i4.Layer? layer) => super.noSuchMethod( Invocation.method( @@ -785,6 +829,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void pushLayer( _i4.ContainerLayer? childLayer, @@ -804,6 +849,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override _i3.PaintingContext createChildContext( _i4.ContainerLayer? childLayer, @@ -828,6 +874,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), ), ) as _i3.PaintingContext); + @override _i4.ClipRectLayer? pushClipRect( bool? needsCompositing, @@ -850,6 +897,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { #oldLayer: oldLayer, }, )) as _i4.ClipRectLayer?); + @override _i4.ClipRRectLayer? pushClipRRect( bool? needsCompositing, @@ -874,6 +922,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { #oldLayer: oldLayer, }, )) as _i4.ClipRRectLayer?); + @override _i4.ClipPathLayer? pushClipPath( bool? needsCompositing, @@ -898,6 +947,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { #oldLayer: oldLayer, }, )) as _i4.ClipPathLayer?); + @override _i4.ColorFilterLayer pushColorFilter( _i2.Offset? offset, @@ -928,6 +978,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), ), ) as _i4.ColorFilterLayer); + @override _i4.TransformLayer? pushTransform( bool? needsCompositing, @@ -946,6 +997,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ], {#oldLayer: oldLayer}, )) as _i4.TransformLayer?); + @override _i4.OpacityLayer pushOpacity( _i2.Offset? offset, @@ -976,6 +1028,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), ), ) as _i4.OpacityLayer); + @override void clipPathAndPaint( _i2.Path? path, @@ -995,6 +1048,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void clipRRectAndPaint( _i2.RRect? rrect, @@ -1014,6 +1068,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void clipRectAndPaint( _i2.Rect? rect, @@ -1051,16 +1106,19 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { Invocation.getter(#widget), ), ) as _i6.Widget); + @override bool get mounted => (super.noSuchMethod( Invocation.getter(#mounted), returnValue: false, ) as bool); + @override bool get debugDoingBuild => (super.noSuchMethod( Invocation.getter(#debugDoingBuild), returnValue: false, ) as bool); + @override _i6.InheritedWidget dependOnInheritedElement( _i6.InheritedElement? ancestor, { @@ -1081,6 +1139,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), ), ) as _i6.InheritedWidget); + @override void visitAncestorElements(_i6.ConditionalElementVisitor? visitor) => super.noSuchMethod( @@ -1090,6 +1149,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), returnValueForMissingStub: null, ); + @override void visitChildElements(_i6.ElementVisitor? visitor) => super.noSuchMethod( Invocation.method( @@ -1098,6 +1158,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), returnValueForMissingStub: null, ); + @override void dispatchNotification(_i9.Notification? notification) => super.noSuchMethod( @@ -1107,6 +1168,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), returnValueForMissingStub: null, ); + @override _i5.DiagnosticsNode describeElement( String? name, { @@ -1127,6 +1189,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), ), ) as _i5.DiagnosticsNode); + @override _i5.DiagnosticsNode describeWidget( String? name, { @@ -1147,6 +1210,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), ), ) as _i5.DiagnosticsNode); + @override List<_i5.DiagnosticsNode> describeMissingAncestor( {required Type? expectedAncestorType}) => @@ -1158,6 +1222,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), returnValue: <_i5.DiagnosticsNode>[], ) as List<_i5.DiagnosticsNode>); + @override _i5.DiagnosticsNode describeOwnershipChain(String? name) => (super.noSuchMethod( @@ -1200,6 +1265,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ), returnValueForMissingStub: null, ); + @override void clipToBorder( _i11.CanvasWrapper? canvasWrapper, @@ -1215,6 +1281,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ), returnValueForMissingStub: null, ); + @override void drawBarLine( _i11.CanvasWrapper? canvasWrapper, @@ -1232,6 +1299,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ), returnValueForMissingStub: null, ); + @override void drawBetweenBarsArea( _i11.CanvasWrapper? canvasWrapper, @@ -1251,6 +1319,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ), returnValueForMissingStub: null, ); + @override void drawDots( _i11.CanvasWrapper? canvasWrapper, @@ -1268,6 +1337,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ), returnValueForMissingStub: null, ); + @override void drawTouchedSpotsIndicator( _i11.CanvasWrapper? canvasWrapper, @@ -1285,6 +1355,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ), returnValueForMissingStub: null, ); + @override _i2.Path generateBarPath( _i2.Size? viewSize, @@ -1318,6 +1389,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ), ), ) as _i2.Path); + @override _i2.Path generateNormalBarPath( _i2.Size? viewSize, @@ -1351,6 +1423,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ), ), ) as _i2.Path); + @override _i2.Path generateStepBarPath( _i2.Size? viewSize, @@ -1384,6 +1457,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ), ), ) as _i2.Path); + @override _i2.Path generateBelowBarPath( _i2.Size? viewSize, @@ -1420,6 +1494,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ), ), ) as _i2.Path); + @override _i2.Path generateAboveBarPath( _i2.Size? viewSize, @@ -1456,6 +1531,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ), ), ) as _i2.Path); + @override void drawBelowBar( _i11.CanvasWrapper? canvasWrapper, @@ -1477,6 +1553,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ), returnValueForMissingStub: null, ); + @override void drawAboveBar( _i11.CanvasWrapper? canvasWrapper, @@ -1498,6 +1575,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ), returnValueForMissingStub: null, ); + @override void drawBetweenBar( _i11.CanvasWrapper? canvasWrapper, @@ -1519,6 +1597,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ), returnValueForMissingStub: null, ); + @override void drawBarShadow( _i11.CanvasWrapper? canvasWrapper, @@ -1536,6 +1615,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ), returnValueForMissingStub: null, ); + @override void drawBar( _i11.CanvasWrapper? canvasWrapper, @@ -1555,6 +1635,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ), returnValueForMissingStub: null, ); + @override void drawTouchTooltip( _i6.BuildContext? context, @@ -1578,6 +1659,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ), returnValueForMissingStub: null, ); + @override double getBarLineXLength( _i13.LineChartBarData? barData, @@ -1595,6 +1677,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ), returnValue: 0.0, ) as double); + @override List<_i13.TouchLineBarSpot>? handleTouch( _i2.Offset? localPosition, @@ -1609,6 +1692,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { holder, ], )) as List<_i13.TouchLineBarSpot>?); + @override _i13.TouchLineBarSpot? getNearestTouchedSpot( _i2.Size? viewSize, @@ -1627,6 +1711,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { holder, ], )) as _i13.TouchLineBarSpot?); + @override void drawGrid( _i11.CanvasWrapper? canvasWrapper, @@ -1642,6 +1727,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ), returnValueForMissingStub: null, ); + @override void drawBackground( _i11.CanvasWrapper? canvasWrapper, @@ -1657,6 +1743,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ), returnValueForMissingStub: null, ); + @override void drawRangeAnnotation( _i11.CanvasWrapper? canvasWrapper, @@ -1672,6 +1759,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ), returnValueForMissingStub: null, ); + @override void drawExtraLines( _i6.BuildContext? context, @@ -1689,6 +1777,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ), returnValueForMissingStub: null, ); + @override void drawHorizontalLines( _i6.BuildContext? context, @@ -1708,6 +1797,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ), returnValueForMissingStub: null, ); + @override void drawVerticalLines( _i6.BuildContext? context, @@ -1727,6 +1817,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ), returnValueForMissingStub: null, ); + @override double getPixelX( double? spotX, @@ -1744,6 +1835,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ), returnValue: 0.0, ) as double); + @override double getPixelY( double? spotY, @@ -1761,6 +1853,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ), returnValue: 0.0, ) as double); + @override double getTooltipLeft( double? dx, diff --git a/test/chart/pie_chart/pie_chart_painter_test.mocks.dart b/test/chart/pie_chart/pie_chart_painter_test.mocks.dart index a1d0683e1..d469bbdca 100644 --- a/test/chart/pie_chart/pie_chart_painter_test.mocks.dart +++ b/test/chart/pie_chart/pie_chart_painter_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/chart/pie_chart/pie_chart_painter_test.dart. // Do not manually edit this file. @@ -155,6 +155,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void saveLayer( _i2.Rect? bounds, @@ -170,6 +171,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void restore() => super.noSuchMethod( Invocation.method( @@ -178,6 +180,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void restoreToCount(int? count) => super.noSuchMethod( Invocation.method( @@ -186,6 +189,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override int getSaveCount() => (super.noSuchMethod( Invocation.method( @@ -194,6 +198,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValue: 0, ) as int); + @override void translate( double? dx, @@ -209,6 +214,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void scale( double? sx, [ @@ -224,6 +230,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void rotate(double? radians) => super.noSuchMethod( Invocation.method( @@ -232,6 +239,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void skew( double? sx, @@ -247,6 +255,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void transform(_i5.Float64List? matrix4) => super.noSuchMethod( Invocation.method( @@ -255,6 +264,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override _i5.Float64List getTransform() => (super.noSuchMethod( Invocation.method( @@ -263,6 +273,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValue: _i5.Float64List(0), ) as _i5.Float64List); + @override void clipRect( _i2.Rect? rect, { @@ -280,6 +291,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void clipRRect( _i2.RRect? rrect, { @@ -293,6 +305,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void clipPath( _i2.Path? path, { @@ -306,6 +319,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override _i2.Rect getLocalClipBounds() => (super.noSuchMethod( Invocation.method( @@ -320,6 +334,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), ), ) as _i2.Rect); + @override _i2.Rect getDestinationClipBounds() => (super.noSuchMethod( Invocation.method( @@ -334,6 +349,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), ), ) as _i2.Rect); + @override void drawColor( _i2.Color? color, @@ -349,6 +365,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawLine( _i2.Offset? p1, @@ -366,6 +383,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPaint(_i2.Paint? paint) => super.noSuchMethod( Invocation.method( @@ -374,6 +392,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRect( _i2.Rect? rect, @@ -389,6 +408,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRRect( _i2.RRect? rrect, @@ -404,6 +424,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawDRRect( _i2.RRect? outer, @@ -421,6 +442,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawOval( _i2.Rect? rect, @@ -436,6 +458,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawCircle( _i2.Offset? c, @@ -453,6 +476,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawArc( _i2.Rect? rect, @@ -474,6 +498,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPath( _i2.Path? path, @@ -489,6 +514,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImage( _i2.Image? image, @@ -506,6 +532,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImageRect( _i2.Image? image, @@ -525,6 +552,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImageNine( _i2.Image? image, @@ -544,6 +572,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPicture(_i2.Picture? picture) => super.noSuchMethod( Invocation.method( @@ -552,6 +581,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawParagraph( _i2.Paragraph? paragraph, @@ -567,6 +597,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPoints( _i2.PointMode? pointMode, @@ -584,6 +615,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRawPoints( _i2.PointMode? pointMode, @@ -601,6 +633,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawVertices( _i2.Vertices? vertices, @@ -618,6 +651,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawAtlas( _i2.Image? atlas, @@ -643,6 +677,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRawAtlas( _i2.Image? atlas, @@ -668,6 +703,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawShadow( _i2.Path? path, @@ -705,6 +741,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { Invocation.getter(#canvas), ), ) as _i2.Canvas); + @override _i2.Size get size => (super.noSuchMethod( Invocation.getter(#size), @@ -713,6 +750,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { Invocation.getter(#size), ), ) as _i2.Size); + @override void drawRRect( _i2.RRect? rrect, @@ -728,6 +766,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void save() => super.noSuchMethod( Invocation.method( @@ -736,6 +775,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void restore() => super.noSuchMethod( Invocation.method( @@ -744,6 +784,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void clipRect( _i2.Rect? rect, { @@ -761,6 +802,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void translate( double? dx, @@ -776,6 +818,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void rotate(double? radius) => super.noSuchMethod( Invocation.method( @@ -784,6 +827,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawPath( _i2.Path? path, @@ -799,6 +843,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void saveLayer( _i2.Rect? bounds, @@ -814,6 +859,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawPicture(_i2.Picture? picture) => super.noSuchMethod( Invocation.method( @@ -822,6 +868,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawImage( _i2.Image? image, @@ -839,6 +886,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void clipPath( _i2.Path? path, { @@ -852,6 +900,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawRect( _i2.Rect? rect, @@ -867,6 +916,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawLine( _i2.Offset? p1, @@ -884,6 +934,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawCircle( _i2.Offset? center, @@ -901,6 +952,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawArc( _i2.Rect? rect, @@ -922,6 +974,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawText( _i3.TextPainter? tp, @@ -939,6 +992,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawDot( _i7.FlDotPainter? painter, @@ -956,6 +1010,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawRotated({ required _i2.Size? size, @@ -978,6 +1033,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawDashedLine( _i2.Offset? from, @@ -1015,16 +1071,19 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { Invocation.getter(#widget), ), ) as _i3.Widget); + @override bool get mounted => (super.noSuchMethod( Invocation.getter(#mounted), returnValue: false, ) as bool); + @override bool get debugDoingBuild => (super.noSuchMethod( Invocation.getter(#debugDoingBuild), returnValue: false, ) as bool); + @override _i3.InheritedWidget dependOnInheritedElement( _i3.InheritedElement? ancestor, { @@ -1045,6 +1104,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), ), ) as _i3.InheritedWidget); + @override void visitAncestorElements(_i3.ConditionalElementVisitor? visitor) => super.noSuchMethod( @@ -1054,6 +1114,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), returnValueForMissingStub: null, ); + @override void visitChildElements(_i3.ElementVisitor? visitor) => super.noSuchMethod( Invocation.method( @@ -1062,6 +1123,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), returnValueForMissingStub: null, ); + @override void dispatchNotification(_i3.Notification? notification) => super.noSuchMethod( @@ -1071,6 +1133,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), returnValueForMissingStub: null, ); + @override _i3.DiagnosticsNode describeElement( String? name, { @@ -1091,6 +1154,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), ), ) as _i3.DiagnosticsNode); + @override _i3.DiagnosticsNode describeWidget( String? name, { @@ -1111,6 +1175,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), ), ) as _i3.DiagnosticsNode); + @override List<_i3.DiagnosticsNode> describeMissingAncestor( {required Type? expectedAncestorType}) => @@ -1122,6 +1187,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), returnValue: <_i3.DiagnosticsNode>[], ) as List<_i3.DiagnosticsNode>); + @override _i3.DiagnosticsNode describeOwnershipChain(String? name) => (super.noSuchMethod( @@ -1155,6 +1221,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), returnValue: 0.0, ) as double); + @override double degrees(double? radians) => (super.noSuchMethod( Invocation.method( @@ -1163,6 +1230,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), returnValue: 0.0, ) as double); + @override _i2.Size getDefaultSize(_i2.Size? screenSize) => (super.noSuchMethod( Invocation.method( @@ -1177,6 +1245,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), ), ) as _i2.Size); + @override double translateRotatedPosition( double? size, @@ -1192,6 +1261,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), returnValue: 0.0, ) as double); + @override _i2.Offset calculateRotationOffset( _i2.Size? size, @@ -1216,6 +1286,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), ), ) as _i2.Offset); + @override _i3.BorderRadius? normalizeBorderRadius( _i3.BorderRadius? borderRadius, @@ -1228,6 +1299,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { width, ], )) as _i3.BorderRadius?); + @override _i3.BorderSide normalizeBorderSide( _i3.BorderSide? borderSide, @@ -1252,6 +1324,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), ), ) as _i3.BorderSide); + @override double getEfficientInterval( double? axisViewSize, @@ -1269,6 +1342,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), returnValue: 0.0, ) as double); + @override double roundInterval(double? input) => (super.noSuchMethod( Invocation.method( @@ -1277,14 +1351,34 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), returnValue: 0.0, ) as double); + + @override + int getFractionDigits(double? value) => (super.noSuchMethod( + Invocation.method( + #getFractionDigits, + [value], + ), + returnValue: 0, + ) as int); + @override - String formatNumber(double? number) => (super.noSuchMethod( + String formatNumber( + double? axisMin, + double? axisMax, + double? axisValue, + ) => + (super.noSuchMethod( Invocation.method( #formatNumber, - [number], + [ + axisMin, + axisMax, + axisValue, + ], ), returnValue: '', ) as String); + @override _i3.TextStyle getThemeAwareTextStyle( _i3.BuildContext? context, @@ -1309,6 +1403,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), ), ) as _i3.TextStyle); + @override double getBestInitialIntervalValue( double? min, @@ -1328,6 +1423,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), returnValue: 0.0, ) as double); + @override double convertRadiusToSigma(double? radius) => (super.noSuchMethod( Invocation.method( diff --git a/test/chart/pie_chart/pie_chart_renderer_test.mocks.dart b/test/chart/pie_chart/pie_chart_renderer_test.mocks.dart index 8e58b42b5..3cfce1762 100644 --- a/test/chart/pie_chart/pie_chart_renderer_test.mocks.dart +++ b/test/chart/pie_chart/pie_chart_renderer_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/chart/pie_chart/pie_chart_renderer_test.dart. // Do not manually edit this file. @@ -175,6 +175,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void saveLayer( _i2.Rect? bounds, @@ -190,6 +191,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void restore() => super.noSuchMethod( Invocation.method( @@ -198,6 +200,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void restoreToCount(int? count) => super.noSuchMethod( Invocation.method( @@ -206,6 +209,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override int getSaveCount() => (super.noSuchMethod( Invocation.method( @@ -214,6 +218,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValue: 0, ) as int); + @override void translate( double? dx, @@ -229,6 +234,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void scale( double? sx, [ @@ -244,6 +250,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void rotate(double? radians) => super.noSuchMethod( Invocation.method( @@ -252,6 +259,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void skew( double? sx, @@ -267,6 +275,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void transform(_i8.Float64List? matrix4) => super.noSuchMethod( Invocation.method( @@ -275,6 +284,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override _i8.Float64List getTransform() => (super.noSuchMethod( Invocation.method( @@ -283,6 +293,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValue: _i8.Float64List(0), ) as _i8.Float64List); + @override void clipRect( _i2.Rect? rect, { @@ -300,6 +311,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void clipRRect( _i2.RRect? rrect, { @@ -313,6 +325,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void clipPath( _i2.Path? path, { @@ -326,6 +339,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override _i2.Rect getLocalClipBounds() => (super.noSuchMethod( Invocation.method( @@ -340,6 +354,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), ), ) as _i2.Rect); + @override _i2.Rect getDestinationClipBounds() => (super.noSuchMethod( Invocation.method( @@ -354,6 +369,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), ), ) as _i2.Rect); + @override void drawColor( _i2.Color? color, @@ -369,6 +385,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawLine( _i2.Offset? p1, @@ -386,6 +403,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPaint(_i2.Paint? paint) => super.noSuchMethod( Invocation.method( @@ -394,6 +412,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRect( _i2.Rect? rect, @@ -409,6 +428,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRRect( _i2.RRect? rrect, @@ -424,6 +444,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawDRRect( _i2.RRect? outer, @@ -441,6 +462,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawOval( _i2.Rect? rect, @@ -456,6 +478,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawCircle( _i2.Offset? c, @@ -473,6 +496,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawArc( _i2.Rect? rect, @@ -494,6 +518,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPath( _i2.Path? path, @@ -509,6 +534,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImage( _i2.Image? image, @@ -526,6 +552,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImageRect( _i2.Image? image, @@ -545,6 +572,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImageNine( _i2.Image? image, @@ -564,6 +592,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPicture(_i2.Picture? picture) => super.noSuchMethod( Invocation.method( @@ -572,6 +601,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawParagraph( _i2.Paragraph? paragraph, @@ -587,6 +617,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPoints( _i2.PointMode? pointMode, @@ -604,6 +635,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRawPoints( _i2.PointMode? pointMode, @@ -621,6 +653,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawVertices( _i2.Vertices? vertices, @@ -638,6 +671,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawAtlas( _i2.Image? atlas, @@ -663,6 +697,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRawAtlas( _i2.Image? atlas, @@ -688,6 +723,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawShadow( _i2.Path? path, @@ -725,6 +761,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { Invocation.getter(#estimatedBounds), ), ) as _i2.Rect); + @override _i2.Canvas get canvas => (super.noSuchMethod( Invocation.getter(#canvas), @@ -733,6 +770,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { Invocation.getter(#canvas), ), ) as _i2.Canvas); + @override void paintChild( _i3.RenderObject? child, @@ -748,6 +786,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void appendLayer(_i4.Layer? layer) => super.noSuchMethod( Invocation.method( @@ -756,6 +795,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override _i2.VoidCallback addCompositionCallback(_i4.CompositionCallback? callback) => (super.noSuchMethod( @@ -765,6 +805,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValue: () {}, ) as _i2.VoidCallback); + @override void stopRecordingIfNeeded() => super.noSuchMethod( Invocation.method( @@ -773,6 +814,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void setIsComplexHint() => super.noSuchMethod( Invocation.method( @@ -781,6 +823,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void setWillChangeHint() => super.noSuchMethod( Invocation.method( @@ -789,6 +832,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void addLayer(_i4.Layer? layer) => super.noSuchMethod( Invocation.method( @@ -797,6 +841,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void pushLayer( _i4.ContainerLayer? childLayer, @@ -816,6 +861,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override _i3.PaintingContext createChildContext( _i4.ContainerLayer? childLayer, @@ -840,6 +886,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), ), ) as _i3.PaintingContext); + @override _i4.ClipRectLayer? pushClipRect( bool? needsCompositing, @@ -862,6 +909,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { #oldLayer: oldLayer, }, )) as _i4.ClipRectLayer?); + @override _i4.ClipRRectLayer? pushClipRRect( bool? needsCompositing, @@ -886,6 +934,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { #oldLayer: oldLayer, }, )) as _i4.ClipRRectLayer?); + @override _i4.ClipPathLayer? pushClipPath( bool? needsCompositing, @@ -910,6 +959,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { #oldLayer: oldLayer, }, )) as _i4.ClipPathLayer?); + @override _i4.ColorFilterLayer pushColorFilter( _i2.Offset? offset, @@ -940,6 +990,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), ), ) as _i4.ColorFilterLayer); + @override _i4.TransformLayer? pushTransform( bool? needsCompositing, @@ -958,6 +1009,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ], {#oldLayer: oldLayer}, )) as _i4.TransformLayer?); + @override _i4.OpacityLayer pushOpacity( _i2.Offset? offset, @@ -988,6 +1040,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), ), ) as _i4.OpacityLayer); + @override void clipPathAndPaint( _i2.Path? path, @@ -1007,6 +1060,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void clipRRectAndPaint( _i2.RRect? rrect, @@ -1026,6 +1080,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void clipRectAndPaint( _i2.Rect? rect, @@ -1063,16 +1118,19 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { Invocation.getter(#widget), ), ) as _i6.Widget); + @override bool get mounted => (super.noSuchMethod( Invocation.getter(#mounted), returnValue: false, ) as bool); + @override bool get debugDoingBuild => (super.noSuchMethod( Invocation.getter(#debugDoingBuild), returnValue: false, ) as bool); + @override _i6.InheritedWidget dependOnInheritedElement( _i6.InheritedElement? ancestor, { @@ -1093,6 +1151,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), ), ) as _i6.InheritedWidget); + @override void visitAncestorElements(_i6.ConditionalElementVisitor? visitor) => super.noSuchMethod( @@ -1102,6 +1161,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), returnValueForMissingStub: null, ); + @override void visitChildElements(_i6.ElementVisitor? visitor) => super.noSuchMethod( Invocation.method( @@ -1110,6 +1170,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), returnValueForMissingStub: null, ); + @override void dispatchNotification(_i10.Notification? notification) => super.noSuchMethod( @@ -1119,6 +1180,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), returnValueForMissingStub: null, ); + @override _i5.DiagnosticsNode describeElement( String? name, { @@ -1139,6 +1201,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), ), ) as _i5.DiagnosticsNode); + @override _i5.DiagnosticsNode describeWidget( String? name, { @@ -1159,6 +1222,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), ), ) as _i5.DiagnosticsNode); + @override List<_i5.DiagnosticsNode> describeMissingAncestor( {required Type? expectedAncestorType}) => @@ -1170,6 +1234,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), returnValue: <_i5.DiagnosticsNode>[], ) as List<_i5.DiagnosticsNode>); + @override _i5.DiagnosticsNode describeOwnershipChain(String? name) => (super.noSuchMethod( @@ -1212,6 +1277,7 @@ class MockPieChartPainter extends _i1.Mock implements _i11.PieChartPainter { ), returnValueForMissingStub: null, ); + @override List calculateSectionsAngle( List<_i7.PieChartSectionData>? sections, @@ -1227,6 +1293,7 @@ class MockPieChartPainter extends _i1.Mock implements _i11.PieChartPainter { ), returnValue: [], ) as List); + @override void drawCenterSpace( _i12.CanvasWrapper? canvasWrapper, @@ -1244,6 +1311,7 @@ class MockPieChartPainter extends _i1.Mock implements _i11.PieChartPainter { ), returnValueForMissingStub: null, ); + @override void drawSections( _i12.CanvasWrapper? canvasWrapper, @@ -1263,6 +1331,7 @@ class MockPieChartPainter extends _i1.Mock implements _i11.PieChartPainter { ), returnValueForMissingStub: null, ); + @override _i2.Path generateSectionPath( _i7.PieChartSectionData? section, @@ -1299,6 +1368,7 @@ class MockPieChartPainter extends _i1.Mock implements _i11.PieChartPainter { ), ), ) as _i2.Path); + @override _i2.Path createRectPathAroundLine( _i14.Line? line, @@ -1323,6 +1393,7 @@ class MockPieChartPainter extends _i1.Mock implements _i11.PieChartPainter { ), ), ) as _i2.Path); + @override void drawSection( _i7.PieChartSectionData? section, @@ -1340,6 +1411,7 @@ class MockPieChartPainter extends _i1.Mock implements _i11.PieChartPainter { ), returnValueForMissingStub: null, ); + @override void drawSectionStroke( _i7.PieChartSectionData? section, @@ -1359,6 +1431,7 @@ class MockPieChartPainter extends _i1.Mock implements _i11.PieChartPainter { ), returnValueForMissingStub: null, ); + @override void drawTexts( _i6.BuildContext? context, @@ -1378,6 +1451,7 @@ class MockPieChartPainter extends _i1.Mock implements _i11.PieChartPainter { ), returnValueForMissingStub: null, ); + @override double calculateCenterRadius( _i2.Size? viewSize, @@ -1393,6 +1467,7 @@ class MockPieChartPainter extends _i1.Mock implements _i11.PieChartPainter { ), returnValue: 0.0, ) as double); + @override _i7.PieTouchedSection handleTouch( _i2.Offset? localPosition, @@ -1420,6 +1495,7 @@ class MockPieChartPainter extends _i1.Mock implements _i11.PieChartPainter { ), ), ) as _i7.PieTouchedSection); + @override Map getBadgeOffsets( _i2.Size? viewSize, diff --git a/test/chart/radar_chart/radar_chart_painter_test.mocks.dart b/test/chart/radar_chart/radar_chart_painter_test.mocks.dart index 84b2cd6ef..6e7673931 100644 --- a/test/chart/radar_chart/radar_chart_painter_test.mocks.dart +++ b/test/chart/radar_chart/radar_chart_painter_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/chart/radar_chart/radar_chart_painter_test.dart. // Do not manually edit this file. @@ -155,6 +155,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void saveLayer( _i2.Rect? bounds, @@ -170,6 +171,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void restore() => super.noSuchMethod( Invocation.method( @@ -178,6 +180,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void restoreToCount(int? count) => super.noSuchMethod( Invocation.method( @@ -186,6 +189,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override int getSaveCount() => (super.noSuchMethod( Invocation.method( @@ -194,6 +198,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValue: 0, ) as int); + @override void translate( double? dx, @@ -209,6 +214,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void scale( double? sx, [ @@ -224,6 +230,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void rotate(double? radians) => super.noSuchMethod( Invocation.method( @@ -232,6 +239,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void skew( double? sx, @@ -247,6 +255,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void transform(_i5.Float64List? matrix4) => super.noSuchMethod( Invocation.method( @@ -255,6 +264,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override _i5.Float64List getTransform() => (super.noSuchMethod( Invocation.method( @@ -263,6 +273,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValue: _i5.Float64List(0), ) as _i5.Float64List); + @override void clipRect( _i2.Rect? rect, { @@ -280,6 +291,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void clipRRect( _i2.RRect? rrect, { @@ -293,6 +305,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void clipPath( _i2.Path? path, { @@ -306,6 +319,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override _i2.Rect getLocalClipBounds() => (super.noSuchMethod( Invocation.method( @@ -320,6 +334,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), ), ) as _i2.Rect); + @override _i2.Rect getDestinationClipBounds() => (super.noSuchMethod( Invocation.method( @@ -334,6 +349,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), ), ) as _i2.Rect); + @override void drawColor( _i2.Color? color, @@ -349,6 +365,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawLine( _i2.Offset? p1, @@ -366,6 +383,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPaint(_i2.Paint? paint) => super.noSuchMethod( Invocation.method( @@ -374,6 +392,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRect( _i2.Rect? rect, @@ -389,6 +408,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRRect( _i2.RRect? rrect, @@ -404,6 +424,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawDRRect( _i2.RRect? outer, @@ -421,6 +442,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawOval( _i2.Rect? rect, @@ -436,6 +458,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawCircle( _i2.Offset? c, @@ -453,6 +476,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawArc( _i2.Rect? rect, @@ -474,6 +498,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPath( _i2.Path? path, @@ -489,6 +514,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImage( _i2.Image? image, @@ -506,6 +532,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImageRect( _i2.Image? image, @@ -525,6 +552,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImageNine( _i2.Image? image, @@ -544,6 +572,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPicture(_i2.Picture? picture) => super.noSuchMethod( Invocation.method( @@ -552,6 +581,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawParagraph( _i2.Paragraph? paragraph, @@ -567,6 +597,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPoints( _i2.PointMode? pointMode, @@ -584,6 +615,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRawPoints( _i2.PointMode? pointMode, @@ -601,6 +633,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawVertices( _i2.Vertices? vertices, @@ -618,6 +651,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawAtlas( _i2.Image? atlas, @@ -643,6 +677,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRawAtlas( _i2.Image? atlas, @@ -668,6 +703,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawShadow( _i2.Path? path, @@ -705,6 +741,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { Invocation.getter(#canvas), ), ) as _i2.Canvas); + @override _i2.Size get size => (super.noSuchMethod( Invocation.getter(#size), @@ -713,6 +750,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { Invocation.getter(#size), ), ) as _i2.Size); + @override void drawRRect( _i2.RRect? rrect, @@ -728,6 +766,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void save() => super.noSuchMethod( Invocation.method( @@ -736,6 +775,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void restore() => super.noSuchMethod( Invocation.method( @@ -744,6 +784,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void clipRect( _i2.Rect? rect, { @@ -761,6 +802,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void translate( double? dx, @@ -776,6 +818,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void rotate(double? radius) => super.noSuchMethod( Invocation.method( @@ -784,6 +827,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawPath( _i2.Path? path, @@ -799,6 +843,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void saveLayer( _i2.Rect? bounds, @@ -814,6 +859,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawPicture(_i2.Picture? picture) => super.noSuchMethod( Invocation.method( @@ -822,6 +868,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawImage( _i2.Image? image, @@ -839,6 +886,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void clipPath( _i2.Path? path, { @@ -852,6 +900,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawRect( _i2.Rect? rect, @@ -867,6 +916,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawLine( _i2.Offset? p1, @@ -884,6 +934,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawCircle( _i2.Offset? center, @@ -901,6 +952,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawArc( _i2.Rect? rect, @@ -922,6 +974,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawText( _i3.TextPainter? tp, @@ -939,6 +992,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawDot( _i7.FlDotPainter? painter, @@ -956,6 +1010,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawRotated({ required _i2.Size? size, @@ -978,6 +1033,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawDashedLine( _i2.Offset? from, @@ -1015,16 +1071,19 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { Invocation.getter(#widget), ), ) as _i3.Widget); + @override bool get mounted => (super.noSuchMethod( Invocation.getter(#mounted), returnValue: false, ) as bool); + @override bool get debugDoingBuild => (super.noSuchMethod( Invocation.getter(#debugDoingBuild), returnValue: false, ) as bool); + @override _i3.InheritedWidget dependOnInheritedElement( _i3.InheritedElement? ancestor, { @@ -1045,6 +1104,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), ), ) as _i3.InheritedWidget); + @override void visitAncestorElements(_i3.ConditionalElementVisitor? visitor) => super.noSuchMethod( @@ -1054,6 +1114,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), returnValueForMissingStub: null, ); + @override void visitChildElements(_i3.ElementVisitor? visitor) => super.noSuchMethod( Invocation.method( @@ -1062,6 +1123,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), returnValueForMissingStub: null, ); + @override void dispatchNotification(_i3.Notification? notification) => super.noSuchMethod( @@ -1071,6 +1133,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), returnValueForMissingStub: null, ); + @override _i3.DiagnosticsNode describeElement( String? name, { @@ -1091,6 +1154,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), ), ) as _i3.DiagnosticsNode); + @override _i3.DiagnosticsNode describeWidget( String? name, { @@ -1111,6 +1175,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), ), ) as _i3.DiagnosticsNode); + @override List<_i3.DiagnosticsNode> describeMissingAncestor( {required Type? expectedAncestorType}) => @@ -1122,6 +1187,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), returnValue: <_i3.DiagnosticsNode>[], ) as List<_i3.DiagnosticsNode>); + @override _i3.DiagnosticsNode describeOwnershipChain(String? name) => (super.noSuchMethod( @@ -1155,6 +1221,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), returnValue: 0.0, ) as double); + @override double degrees(double? radians) => (super.noSuchMethod( Invocation.method( @@ -1163,6 +1230,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), returnValue: 0.0, ) as double); + @override _i2.Size getDefaultSize(_i2.Size? screenSize) => (super.noSuchMethod( Invocation.method( @@ -1177,6 +1245,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), ), ) as _i2.Size); + @override double translateRotatedPosition( double? size, @@ -1192,6 +1261,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), returnValue: 0.0, ) as double); + @override _i2.Offset calculateRotationOffset( _i2.Size? size, @@ -1216,6 +1286,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), ), ) as _i2.Offset); + @override _i3.BorderRadius? normalizeBorderRadius( _i3.BorderRadius? borderRadius, @@ -1228,6 +1299,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { width, ], )) as _i3.BorderRadius?); + @override _i3.BorderSide normalizeBorderSide( _i3.BorderSide? borderSide, @@ -1252,6 +1324,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), ), ) as _i3.BorderSide); + @override double getEfficientInterval( double? axisViewSize, @@ -1269,6 +1342,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), returnValue: 0.0, ) as double); + @override double roundInterval(double? input) => (super.noSuchMethod( Invocation.method( @@ -1277,14 +1351,34 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), returnValue: 0.0, ) as double); + + @override + int getFractionDigits(double? value) => (super.noSuchMethod( + Invocation.method( + #getFractionDigits, + [value], + ), + returnValue: 0, + ) as int); + @override - String formatNumber(double? number) => (super.noSuchMethod( + String formatNumber( + double? axisMin, + double? axisMax, + double? axisValue, + ) => + (super.noSuchMethod( Invocation.method( #formatNumber, - [number], + [ + axisMin, + axisMax, + axisValue, + ], ), returnValue: '', ) as String); + @override _i3.TextStyle getThemeAwareTextStyle( _i3.BuildContext? context, @@ -1309,6 +1403,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), ), ) as _i3.TextStyle); + @override double getBestInitialIntervalValue( double? min, @@ -1328,6 +1423,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), returnValue: 0.0, ) as double); + @override double convertRadiusToSigma(double? radius) => (super.noSuchMethod( Invocation.method( diff --git a/test/chart/radar_chart/radar_chart_renderer_test.mocks.dart b/test/chart/radar_chart/radar_chart_renderer_test.mocks.dart index 13ac05859..a176f281b 100644 --- a/test/chart/radar_chart/radar_chart_renderer_test.mocks.dart +++ b/test/chart/radar_chart/radar_chart_renderer_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/chart/radar_chart/radar_chart_renderer_test.dart. // Do not manually edit this file. @@ -154,6 +154,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void saveLayer( _i2.Rect? bounds, @@ -169,6 +170,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void restore() => super.noSuchMethod( Invocation.method( @@ -177,6 +179,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void restoreToCount(int? count) => super.noSuchMethod( Invocation.method( @@ -185,6 +188,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override int getSaveCount() => (super.noSuchMethod( Invocation.method( @@ -193,6 +197,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValue: 0, ) as int); + @override void translate( double? dx, @@ -208,6 +213,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void scale( double? sx, [ @@ -223,6 +229,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void rotate(double? radians) => super.noSuchMethod( Invocation.method( @@ -231,6 +238,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void skew( double? sx, @@ -246,6 +254,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void transform(_i7.Float64List? matrix4) => super.noSuchMethod( Invocation.method( @@ -254,6 +263,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override _i7.Float64List getTransform() => (super.noSuchMethod( Invocation.method( @@ -262,6 +272,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValue: _i7.Float64List(0), ) as _i7.Float64List); + @override void clipRect( _i2.Rect? rect, { @@ -279,6 +290,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void clipRRect( _i2.RRect? rrect, { @@ -292,6 +304,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void clipPath( _i2.Path? path, { @@ -305,6 +318,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override _i2.Rect getLocalClipBounds() => (super.noSuchMethod( Invocation.method( @@ -319,6 +333,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), ), ) as _i2.Rect); + @override _i2.Rect getDestinationClipBounds() => (super.noSuchMethod( Invocation.method( @@ -333,6 +348,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), ), ) as _i2.Rect); + @override void drawColor( _i2.Color? color, @@ -348,6 +364,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawLine( _i2.Offset? p1, @@ -365,6 +382,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPaint(_i2.Paint? paint) => super.noSuchMethod( Invocation.method( @@ -373,6 +391,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRect( _i2.Rect? rect, @@ -388,6 +407,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRRect( _i2.RRect? rrect, @@ -403,6 +423,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawDRRect( _i2.RRect? outer, @@ -420,6 +441,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawOval( _i2.Rect? rect, @@ -435,6 +457,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawCircle( _i2.Offset? c, @@ -452,6 +475,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawArc( _i2.Rect? rect, @@ -473,6 +497,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPath( _i2.Path? path, @@ -488,6 +513,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImage( _i2.Image? image, @@ -505,6 +531,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImageRect( _i2.Image? image, @@ -524,6 +551,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImageNine( _i2.Image? image, @@ -543,6 +571,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPicture(_i2.Picture? picture) => super.noSuchMethod( Invocation.method( @@ -551,6 +580,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawParagraph( _i2.Paragraph? paragraph, @@ -566,6 +596,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPoints( _i2.PointMode? pointMode, @@ -583,6 +614,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRawPoints( _i2.PointMode? pointMode, @@ -600,6 +632,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawVertices( _i2.Vertices? vertices, @@ -617,6 +650,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawAtlas( _i2.Image? atlas, @@ -642,6 +676,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRawAtlas( _i2.Image? atlas, @@ -667,6 +702,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawShadow( _i2.Path? path, @@ -704,6 +740,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { Invocation.getter(#estimatedBounds), ), ) as _i2.Rect); + @override _i2.Canvas get canvas => (super.noSuchMethod( Invocation.getter(#canvas), @@ -712,6 +749,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { Invocation.getter(#canvas), ), ) as _i2.Canvas); + @override void paintChild( _i3.RenderObject? child, @@ -727,6 +765,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void appendLayer(_i4.Layer? layer) => super.noSuchMethod( Invocation.method( @@ -735,6 +774,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override _i2.VoidCallback addCompositionCallback(_i4.CompositionCallback? callback) => (super.noSuchMethod( @@ -744,6 +784,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValue: () {}, ) as _i2.VoidCallback); + @override void stopRecordingIfNeeded() => super.noSuchMethod( Invocation.method( @@ -752,6 +793,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void setIsComplexHint() => super.noSuchMethod( Invocation.method( @@ -760,6 +802,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void setWillChangeHint() => super.noSuchMethod( Invocation.method( @@ -768,6 +811,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void addLayer(_i4.Layer? layer) => super.noSuchMethod( Invocation.method( @@ -776,6 +820,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void pushLayer( _i4.ContainerLayer? childLayer, @@ -795,6 +840,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override _i3.PaintingContext createChildContext( _i4.ContainerLayer? childLayer, @@ -819,6 +865,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), ), ) as _i3.PaintingContext); + @override _i4.ClipRectLayer? pushClipRect( bool? needsCompositing, @@ -841,6 +888,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { #oldLayer: oldLayer, }, )) as _i4.ClipRectLayer?); + @override _i4.ClipRRectLayer? pushClipRRect( bool? needsCompositing, @@ -865,6 +913,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { #oldLayer: oldLayer, }, )) as _i4.ClipRRectLayer?); + @override _i4.ClipPathLayer? pushClipPath( bool? needsCompositing, @@ -889,6 +938,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { #oldLayer: oldLayer, }, )) as _i4.ClipPathLayer?); + @override _i4.ColorFilterLayer pushColorFilter( _i2.Offset? offset, @@ -919,6 +969,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), ), ) as _i4.ColorFilterLayer); + @override _i4.TransformLayer? pushTransform( bool? needsCompositing, @@ -937,6 +988,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ], {#oldLayer: oldLayer}, )) as _i4.TransformLayer?); + @override _i4.OpacityLayer pushOpacity( _i2.Offset? offset, @@ -967,6 +1019,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), ), ) as _i4.OpacityLayer); + @override void clipPathAndPaint( _i2.Path? path, @@ -986,6 +1039,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void clipRRectAndPaint( _i2.RRect? rrect, @@ -1005,6 +1059,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void clipRectAndPaint( _i2.Rect? rect, @@ -1042,16 +1097,19 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { Invocation.getter(#widget), ), ) as _i6.Widget); + @override bool get mounted => (super.noSuchMethod( Invocation.getter(#mounted), returnValue: false, ) as bool); + @override bool get debugDoingBuild => (super.noSuchMethod( Invocation.getter(#debugDoingBuild), returnValue: false, ) as bool); + @override _i6.InheritedWidget dependOnInheritedElement( _i6.InheritedElement? ancestor, { @@ -1072,6 +1130,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), ), ) as _i6.InheritedWidget); + @override void visitAncestorElements(_i6.ConditionalElementVisitor? visitor) => super.noSuchMethod( @@ -1081,6 +1140,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), returnValueForMissingStub: null, ); + @override void visitChildElements(_i6.ElementVisitor? visitor) => super.noSuchMethod( Invocation.method( @@ -1089,6 +1149,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), returnValueForMissingStub: null, ); + @override void dispatchNotification(_i9.Notification? notification) => super.noSuchMethod( @@ -1098,6 +1159,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), returnValueForMissingStub: null, ); + @override _i5.DiagnosticsNode describeElement( String? name, { @@ -1118,6 +1180,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), ), ) as _i5.DiagnosticsNode); + @override _i5.DiagnosticsNode describeWidget( String? name, { @@ -1138,6 +1201,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), ), ) as _i5.DiagnosticsNode); + @override List<_i5.DiagnosticsNode> describeMissingAncestor( {required Type? expectedAncestorType}) => @@ -1149,6 +1213,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), returnValue: <_i5.DiagnosticsNode>[], ) as List<_i5.DiagnosticsNode>); + @override _i5.DiagnosticsNode describeOwnershipChain(String? name) => (super.noSuchMethod( @@ -1183,6 +1248,7 @@ class MockRadarChartPainter extends _i1.Mock implements _i10.RadarChartPainter { ), returnValueForMissingStub: null, ); + @override void paint( _i6.BuildContext? context, @@ -1200,6 +1266,7 @@ class MockRadarChartPainter extends _i1.Mock implements _i10.RadarChartPainter { ), returnValueForMissingStub: null, ); + @override double getDefaultChartCenterValue() => (super.noSuchMethod( Invocation.method( @@ -1208,6 +1275,7 @@ class MockRadarChartPainter extends _i1.Mock implements _i10.RadarChartPainter { ), returnValue: 0.0, ) as double); + @override double getChartCenterValue(_i13.RadarChartData? data) => (super.noSuchMethod( Invocation.method( @@ -1216,6 +1284,7 @@ class MockRadarChartPainter extends _i1.Mock implements _i10.RadarChartPainter { ), returnValue: 0.0, ) as double); + @override double getScaledPoint( _i13.RadarEntry? point, @@ -1233,6 +1302,7 @@ class MockRadarChartPainter extends _i1.Mock implements _i10.RadarChartPainter { ), returnValue: 0.0, ) as double); + @override double getFirstTickValue(_i13.RadarChartData? data) => (super.noSuchMethod( Invocation.method( @@ -1241,6 +1311,7 @@ class MockRadarChartPainter extends _i1.Mock implements _i10.RadarChartPainter { ), returnValue: 0.0, ) as double); + @override double getSpaceBetweenTicks(_i13.RadarChartData? data) => (super.noSuchMethod( Invocation.method( @@ -1249,6 +1320,7 @@ class MockRadarChartPainter extends _i1.Mock implements _i10.RadarChartPainter { ), returnValue: 0.0, ) as double); + @override void drawTicks( _i6.BuildContext? context, @@ -1266,6 +1338,7 @@ class MockRadarChartPainter extends _i1.Mock implements _i10.RadarChartPainter { ), returnValueForMissingStub: null, ); + @override void drawGrids( _i11.CanvasWrapper? canvasWrapper, @@ -1281,6 +1354,7 @@ class MockRadarChartPainter extends _i1.Mock implements _i10.RadarChartPainter { ), returnValueForMissingStub: null, ); + @override void drawTitles( _i6.BuildContext? context, @@ -1298,6 +1372,7 @@ class MockRadarChartPainter extends _i1.Mock implements _i10.RadarChartPainter { ), returnValueForMissingStub: null, ); + @override void drawDataSets( _i11.CanvasWrapper? canvasWrapper, @@ -1313,6 +1388,7 @@ class MockRadarChartPainter extends _i1.Mock implements _i10.RadarChartPainter { ), returnValueForMissingStub: null, ); + @override _i13.RadarTouchedSpot? handleTouch( _i2.Offset? touchedPoint, @@ -1327,6 +1403,7 @@ class MockRadarChartPainter extends _i1.Mock implements _i10.RadarChartPainter { holder, ], )) as _i13.RadarTouchedSpot?); + @override double radarCenterY(_i2.Size? size) => (super.noSuchMethod( Invocation.method( @@ -1335,6 +1412,7 @@ class MockRadarChartPainter extends _i1.Mock implements _i10.RadarChartPainter { ), returnValue: 0.0, ) as double); + @override double radarCenterX(_i2.Size? size) => (super.noSuchMethod( Invocation.method( @@ -1343,6 +1421,7 @@ class MockRadarChartPainter extends _i1.Mock implements _i10.RadarChartPainter { ), returnValue: 0.0, ) as double); + @override double radarRadius(_i2.Size? size) => (super.noSuchMethod( Invocation.method( @@ -1351,6 +1430,7 @@ class MockRadarChartPainter extends _i1.Mock implements _i10.RadarChartPainter { ), returnValue: 0.0, ) as double); + @override List<_i10.RadarDataSetsPosition> calculateDataSetsPosition( _i2.Size? viewSize, diff --git a/test/chart/scatter_chart/scatter_chart_painter_test.mocks.dart b/test/chart/scatter_chart/scatter_chart_painter_test.mocks.dart index 3305195d0..f8e87a9b0 100644 --- a/test/chart/scatter_chart/scatter_chart_painter_test.mocks.dart +++ b/test/chart/scatter_chart/scatter_chart_painter_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/chart/scatter_chart/scatter_chart_painter_test.dart. // Do not manually edit this file. @@ -155,6 +155,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void saveLayer( _i2.Rect? bounds, @@ -170,6 +171,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void restore() => super.noSuchMethod( Invocation.method( @@ -178,6 +180,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void restoreToCount(int? count) => super.noSuchMethod( Invocation.method( @@ -186,6 +189,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override int getSaveCount() => (super.noSuchMethod( Invocation.method( @@ -194,6 +198,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValue: 0, ) as int); + @override void translate( double? dx, @@ -209,6 +214,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void scale( double? sx, [ @@ -224,6 +230,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void rotate(double? radians) => super.noSuchMethod( Invocation.method( @@ -232,6 +239,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void skew( double? sx, @@ -247,6 +255,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void transform(_i5.Float64List? matrix4) => super.noSuchMethod( Invocation.method( @@ -255,6 +264,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override _i5.Float64List getTransform() => (super.noSuchMethod( Invocation.method( @@ -263,6 +273,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValue: _i5.Float64List(0), ) as _i5.Float64List); + @override void clipRect( _i2.Rect? rect, { @@ -280,6 +291,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void clipRRect( _i2.RRect? rrect, { @@ -293,6 +305,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void clipPath( _i2.Path? path, { @@ -306,6 +319,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override _i2.Rect getLocalClipBounds() => (super.noSuchMethod( Invocation.method( @@ -320,6 +334,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), ), ) as _i2.Rect); + @override _i2.Rect getDestinationClipBounds() => (super.noSuchMethod( Invocation.method( @@ -334,6 +349,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), ), ) as _i2.Rect); + @override void drawColor( _i2.Color? color, @@ -349,6 +365,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawLine( _i2.Offset? p1, @@ -366,6 +383,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPaint(_i2.Paint? paint) => super.noSuchMethod( Invocation.method( @@ -374,6 +392,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRect( _i2.Rect? rect, @@ -389,6 +408,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRRect( _i2.RRect? rrect, @@ -404,6 +424,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawDRRect( _i2.RRect? outer, @@ -421,6 +442,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawOval( _i2.Rect? rect, @@ -436,6 +458,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawCircle( _i2.Offset? c, @@ -453,6 +476,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawArc( _i2.Rect? rect, @@ -474,6 +498,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPath( _i2.Path? path, @@ -489,6 +514,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImage( _i2.Image? image, @@ -506,6 +532,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImageRect( _i2.Image? image, @@ -525,6 +552,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImageNine( _i2.Image? image, @@ -544,6 +572,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPicture(_i2.Picture? picture) => super.noSuchMethod( Invocation.method( @@ -552,6 +581,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawParagraph( _i2.Paragraph? paragraph, @@ -567,6 +597,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPoints( _i2.PointMode? pointMode, @@ -584,6 +615,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRawPoints( _i2.PointMode? pointMode, @@ -601,6 +633,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawVertices( _i2.Vertices? vertices, @@ -618,6 +651,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawAtlas( _i2.Image? atlas, @@ -643,6 +677,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRawAtlas( _i2.Image? atlas, @@ -668,6 +703,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawShadow( _i2.Path? path, @@ -705,6 +741,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { Invocation.getter(#canvas), ), ) as _i2.Canvas); + @override _i2.Size get size => (super.noSuchMethod( Invocation.getter(#size), @@ -713,6 +750,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { Invocation.getter(#size), ), ) as _i2.Size); + @override void drawRRect( _i2.RRect? rrect, @@ -728,6 +766,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void save() => super.noSuchMethod( Invocation.method( @@ -736,6 +775,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void restore() => super.noSuchMethod( Invocation.method( @@ -744,6 +784,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void clipRect( _i2.Rect? rect, { @@ -761,6 +802,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void translate( double? dx, @@ -776,6 +818,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void rotate(double? radius) => super.noSuchMethod( Invocation.method( @@ -784,6 +827,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawPath( _i2.Path? path, @@ -799,6 +843,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void saveLayer( _i2.Rect? bounds, @@ -814,6 +859,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawPicture(_i2.Picture? picture) => super.noSuchMethod( Invocation.method( @@ -822,6 +868,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawImage( _i2.Image? image, @@ -839,6 +886,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void clipPath( _i2.Path? path, { @@ -852,6 +900,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawRect( _i2.Rect? rect, @@ -867,6 +916,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawLine( _i2.Offset? p1, @@ -884,6 +934,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawCircle( _i2.Offset? center, @@ -901,6 +952,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawArc( _i2.Rect? rect, @@ -922,6 +974,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawText( _i3.TextPainter? tp, @@ -939,6 +992,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawDot( _i7.FlDotPainter? painter, @@ -956,6 +1010,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawRotated({ required _i2.Size? size, @@ -978,6 +1033,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { ), returnValueForMissingStub: null, ); + @override void drawDashedLine( _i2.Offset? from, @@ -1015,16 +1071,19 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { Invocation.getter(#widget), ), ) as _i3.Widget); + @override bool get mounted => (super.noSuchMethod( Invocation.getter(#mounted), returnValue: false, ) as bool); + @override bool get debugDoingBuild => (super.noSuchMethod( Invocation.getter(#debugDoingBuild), returnValue: false, ) as bool); + @override _i3.InheritedWidget dependOnInheritedElement( _i3.InheritedElement? ancestor, { @@ -1045,6 +1104,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), ), ) as _i3.InheritedWidget); + @override void visitAncestorElements(_i3.ConditionalElementVisitor? visitor) => super.noSuchMethod( @@ -1054,6 +1114,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), returnValueForMissingStub: null, ); + @override void visitChildElements(_i3.ElementVisitor? visitor) => super.noSuchMethod( Invocation.method( @@ -1062,6 +1123,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), returnValueForMissingStub: null, ); + @override void dispatchNotification(_i3.Notification? notification) => super.noSuchMethod( @@ -1071,6 +1133,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), returnValueForMissingStub: null, ); + @override _i3.DiagnosticsNode describeElement( String? name, { @@ -1091,6 +1154,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), ), ) as _i3.DiagnosticsNode); + @override _i3.DiagnosticsNode describeWidget( String? name, { @@ -1111,6 +1175,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), ), ) as _i3.DiagnosticsNode); + @override List<_i3.DiagnosticsNode> describeMissingAncestor( {required Type? expectedAncestorType}) => @@ -1122,6 +1187,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), returnValue: <_i3.DiagnosticsNode>[], ) as List<_i3.DiagnosticsNode>); + @override _i3.DiagnosticsNode describeOwnershipChain(String? name) => (super.noSuchMethod( @@ -1155,6 +1221,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), returnValue: 0.0, ) as double); + @override double degrees(double? radians) => (super.noSuchMethod( Invocation.method( @@ -1163,6 +1230,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), returnValue: 0.0, ) as double); + @override _i2.Size getDefaultSize(_i2.Size? screenSize) => (super.noSuchMethod( Invocation.method( @@ -1177,6 +1245,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), ), ) as _i2.Size); + @override double translateRotatedPosition( double? size, @@ -1192,6 +1261,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), returnValue: 0.0, ) as double); + @override _i2.Offset calculateRotationOffset( _i2.Size? size, @@ -1216,6 +1286,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), ), ) as _i2.Offset); + @override _i3.BorderRadius? normalizeBorderRadius( _i3.BorderRadius? borderRadius, @@ -1228,6 +1299,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { width, ], )) as _i3.BorderRadius?); + @override _i3.BorderSide normalizeBorderSide( _i3.BorderSide? borderSide, @@ -1252,6 +1324,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), ), ) as _i3.BorderSide); + @override double getEfficientInterval( double? axisViewSize, @@ -1269,6 +1342,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), returnValue: 0.0, ) as double); + @override double roundInterval(double? input) => (super.noSuchMethod( Invocation.method( @@ -1277,14 +1351,34 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), returnValue: 0.0, ) as double); + + @override + int getFractionDigits(double? value) => (super.noSuchMethod( + Invocation.method( + #getFractionDigits, + [value], + ), + returnValue: 0, + ) as int); + @override - String formatNumber(double? number) => (super.noSuchMethod( + String formatNumber( + double? axisMin, + double? axisMax, + double? axisValue, + ) => + (super.noSuchMethod( Invocation.method( #formatNumber, - [number], + [ + axisMin, + axisMax, + axisValue, + ], ), returnValue: '', ) as String); + @override _i3.TextStyle getThemeAwareTextStyle( _i3.BuildContext? context, @@ -1309,6 +1403,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), ), ) as _i3.TextStyle); + @override double getBestInitialIntervalValue( double? min, @@ -1328,6 +1423,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { ), returnValue: 0.0, ) as double); + @override double convertRadiusToSigma(double? radius) => (super.noSuchMethod( Invocation.method( diff --git a/test/chart/scatter_chart/scatter_chart_renderer_test.mocks.dart b/test/chart/scatter_chart/scatter_chart_renderer_test.mocks.dart index 890e683be..56fd25da9 100644 --- a/test/chart/scatter_chart/scatter_chart_renderer_test.mocks.dart +++ b/test/chart/scatter_chart/scatter_chart_renderer_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/chart/scatter_chart/scatter_chart_renderer_test.dart. // Do not manually edit this file. @@ -154,6 +154,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void saveLayer( _i2.Rect? bounds, @@ -169,6 +170,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void restore() => super.noSuchMethod( Invocation.method( @@ -177,6 +179,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void restoreToCount(int? count) => super.noSuchMethod( Invocation.method( @@ -185,6 +188,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override int getSaveCount() => (super.noSuchMethod( Invocation.method( @@ -193,6 +197,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValue: 0, ) as int); + @override void translate( double? dx, @@ -208,6 +213,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void scale( double? sx, [ @@ -223,6 +229,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void rotate(double? radians) => super.noSuchMethod( Invocation.method( @@ -231,6 +238,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void skew( double? sx, @@ -246,6 +254,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void transform(_i7.Float64List? matrix4) => super.noSuchMethod( Invocation.method( @@ -254,6 +263,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override _i7.Float64List getTransform() => (super.noSuchMethod( Invocation.method( @@ -262,6 +272,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValue: _i7.Float64List(0), ) as _i7.Float64List); + @override void clipRect( _i2.Rect? rect, { @@ -279,6 +290,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void clipRRect( _i2.RRect? rrect, { @@ -292,6 +304,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void clipPath( _i2.Path? path, { @@ -305,6 +318,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override _i2.Rect getLocalClipBounds() => (super.noSuchMethod( Invocation.method( @@ -319,6 +333,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), ), ) as _i2.Rect); + @override _i2.Rect getDestinationClipBounds() => (super.noSuchMethod( Invocation.method( @@ -333,6 +348,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), ), ) as _i2.Rect); + @override void drawColor( _i2.Color? color, @@ -348,6 +364,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawLine( _i2.Offset? p1, @@ -365,6 +382,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPaint(_i2.Paint? paint) => super.noSuchMethod( Invocation.method( @@ -373,6 +391,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRect( _i2.Rect? rect, @@ -388,6 +407,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRRect( _i2.RRect? rrect, @@ -403,6 +423,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawDRRect( _i2.RRect? outer, @@ -420,6 +441,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawOval( _i2.Rect? rect, @@ -435,6 +457,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawCircle( _i2.Offset? c, @@ -452,6 +475,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawArc( _i2.Rect? rect, @@ -473,6 +497,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPath( _i2.Path? path, @@ -488,6 +513,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImage( _i2.Image? image, @@ -505,6 +531,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImageRect( _i2.Image? image, @@ -524,6 +551,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImageNine( _i2.Image? image, @@ -543,6 +571,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPicture(_i2.Picture? picture) => super.noSuchMethod( Invocation.method( @@ -551,6 +580,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawParagraph( _i2.Paragraph? paragraph, @@ -566,6 +596,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPoints( _i2.PointMode? pointMode, @@ -583,6 +614,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRawPoints( _i2.PointMode? pointMode, @@ -600,6 +632,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawVertices( _i2.Vertices? vertices, @@ -617,6 +650,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawAtlas( _i2.Image? atlas, @@ -642,6 +676,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRawAtlas( _i2.Image? atlas, @@ -667,6 +702,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawShadow( _i2.Path? path, @@ -704,6 +740,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { Invocation.getter(#estimatedBounds), ), ) as _i2.Rect); + @override _i2.Canvas get canvas => (super.noSuchMethod( Invocation.getter(#canvas), @@ -712,6 +749,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { Invocation.getter(#canvas), ), ) as _i2.Canvas); + @override void paintChild( _i3.RenderObject? child, @@ -727,6 +765,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void appendLayer(_i4.Layer? layer) => super.noSuchMethod( Invocation.method( @@ -735,6 +774,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override _i2.VoidCallback addCompositionCallback(_i4.CompositionCallback? callback) => (super.noSuchMethod( @@ -744,6 +784,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValue: () {}, ) as _i2.VoidCallback); + @override void stopRecordingIfNeeded() => super.noSuchMethod( Invocation.method( @@ -752,6 +793,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void setIsComplexHint() => super.noSuchMethod( Invocation.method( @@ -760,6 +802,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void setWillChangeHint() => super.noSuchMethod( Invocation.method( @@ -768,6 +811,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void addLayer(_i4.Layer? layer) => super.noSuchMethod( Invocation.method( @@ -776,6 +820,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void pushLayer( _i4.ContainerLayer? childLayer, @@ -795,6 +840,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override _i3.PaintingContext createChildContext( _i4.ContainerLayer? childLayer, @@ -819,6 +865,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), ), ) as _i3.PaintingContext); + @override _i4.ClipRectLayer? pushClipRect( bool? needsCompositing, @@ -841,6 +888,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { #oldLayer: oldLayer, }, )) as _i4.ClipRectLayer?); + @override _i4.ClipRRectLayer? pushClipRRect( bool? needsCompositing, @@ -865,6 +913,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { #oldLayer: oldLayer, }, )) as _i4.ClipRRectLayer?); + @override _i4.ClipPathLayer? pushClipPath( bool? needsCompositing, @@ -889,6 +938,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { #oldLayer: oldLayer, }, )) as _i4.ClipPathLayer?); + @override _i4.ColorFilterLayer pushColorFilter( _i2.Offset? offset, @@ -919,6 +969,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), ), ) as _i4.ColorFilterLayer); + @override _i4.TransformLayer? pushTransform( bool? needsCompositing, @@ -937,6 +988,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ], {#oldLayer: oldLayer}, )) as _i4.TransformLayer?); + @override _i4.OpacityLayer pushOpacity( _i2.Offset? offset, @@ -967,6 +1019,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), ), ) as _i4.OpacityLayer); + @override void clipPathAndPaint( _i2.Path? path, @@ -986,6 +1039,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void clipRRectAndPaint( _i2.RRect? rrect, @@ -1005,6 +1059,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { ), returnValueForMissingStub: null, ); + @override void clipRectAndPaint( _i2.Rect? rect, @@ -1042,16 +1097,19 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { Invocation.getter(#widget), ), ) as _i6.Widget); + @override bool get mounted => (super.noSuchMethod( Invocation.getter(#mounted), returnValue: false, ) as bool); + @override bool get debugDoingBuild => (super.noSuchMethod( Invocation.getter(#debugDoingBuild), returnValue: false, ) as bool); + @override _i6.InheritedWidget dependOnInheritedElement( _i6.InheritedElement? ancestor, { @@ -1072,6 +1130,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), ), ) as _i6.InheritedWidget); + @override void visitAncestorElements(_i6.ConditionalElementVisitor? visitor) => super.noSuchMethod( @@ -1081,6 +1140,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), returnValueForMissingStub: null, ); + @override void visitChildElements(_i6.ElementVisitor? visitor) => super.noSuchMethod( Invocation.method( @@ -1089,6 +1149,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), returnValueForMissingStub: null, ); + @override void dispatchNotification(_i9.Notification? notification) => super.noSuchMethod( @@ -1098,6 +1159,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), returnValueForMissingStub: null, ); + @override _i5.DiagnosticsNode describeElement( String? name, { @@ -1118,6 +1180,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), ), ) as _i5.DiagnosticsNode); + @override _i5.DiagnosticsNode describeWidget( String? name, { @@ -1138,6 +1201,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), ), ) as _i5.DiagnosticsNode); + @override List<_i5.DiagnosticsNode> describeMissingAncestor( {required Type? expectedAncestorType}) => @@ -1149,6 +1213,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ), returnValue: <_i5.DiagnosticsNode>[], ) as List<_i5.DiagnosticsNode>); + @override _i5.DiagnosticsNode describeOwnershipChain(String? name) => (super.noSuchMethod( @@ -1192,6 +1257,7 @@ class MockScatterChartPainter extends _i1.Mock ), returnValueForMissingStub: null, ); + @override void drawSpots( _i6.BuildContext? context, @@ -1209,6 +1275,7 @@ class MockScatterChartPainter extends _i1.Mock ), returnValueForMissingStub: null, ); + @override void drawTouchTooltips( _i6.BuildContext? context, @@ -1226,6 +1293,7 @@ class MockScatterChartPainter extends _i1.Mock ), returnValueForMissingStub: null, ); + @override void drawTouchTooltip( _i6.BuildContext? context, @@ -1247,6 +1315,7 @@ class MockScatterChartPainter extends _i1.Mock ), returnValueForMissingStub: null, ); + @override _i13.ScatterTouchedSpot? handleTouch( _i2.Offset? localPosition, @@ -1261,6 +1330,7 @@ class MockScatterChartPainter extends _i1.Mock holder, ], )) as _i13.ScatterTouchedSpot?); + @override void drawGrid( _i11.CanvasWrapper? canvasWrapper, @@ -1276,6 +1346,7 @@ class MockScatterChartPainter extends _i1.Mock ), returnValueForMissingStub: null, ); + @override void drawBackground( _i11.CanvasWrapper? canvasWrapper, @@ -1291,6 +1362,7 @@ class MockScatterChartPainter extends _i1.Mock ), returnValueForMissingStub: null, ); + @override void drawRangeAnnotation( _i11.CanvasWrapper? canvasWrapper, @@ -1306,6 +1378,7 @@ class MockScatterChartPainter extends _i1.Mock ), returnValueForMissingStub: null, ); + @override void drawExtraLines( _i6.BuildContext? context, @@ -1323,6 +1396,7 @@ class MockScatterChartPainter extends _i1.Mock ), returnValueForMissingStub: null, ); + @override void drawHorizontalLines( _i6.BuildContext? context, @@ -1342,6 +1416,7 @@ class MockScatterChartPainter extends _i1.Mock ), returnValueForMissingStub: null, ); + @override void drawVerticalLines( _i6.BuildContext? context, @@ -1361,6 +1436,7 @@ class MockScatterChartPainter extends _i1.Mock ), returnValueForMissingStub: null, ); + @override double getPixelX( double? spotX, @@ -1378,6 +1454,7 @@ class MockScatterChartPainter extends _i1.Mock ), returnValue: 0.0, ) as double); + @override double getPixelY( double? spotY, @@ -1395,6 +1472,7 @@ class MockScatterChartPainter extends _i1.Mock ), returnValue: 0.0, ) as double); + @override double getTooltipLeft( double? dx, diff --git a/test/utils/canvas_wrapper_test.mocks.dart b/test/utils/canvas_wrapper_test.mocks.dart index cccfd2559..48153adb5 100644 --- a/test/utils/canvas_wrapper_test.mocks.dart +++ b/test/utils/canvas_wrapper_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/utils/canvas_wrapper_test.dart. // Do not manually edit this file. @@ -96,6 +96,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void saveLayer( _i2.Rect? bounds, @@ -111,6 +112,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void restore() => super.noSuchMethod( Invocation.method( @@ -119,6 +121,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void restoreToCount(int? count) => super.noSuchMethod( Invocation.method( @@ -127,6 +130,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override int getSaveCount() => (super.noSuchMethod( Invocation.method( @@ -135,6 +139,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValue: 0, ) as int); + @override void translate( double? dx, @@ -150,6 +155,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void scale( double? sx, [ @@ -165,6 +171,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void rotate(double? radians) => super.noSuchMethod( Invocation.method( @@ -173,6 +180,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void skew( double? sx, @@ -188,6 +196,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void transform(_i4.Float64List? matrix4) => super.noSuchMethod( Invocation.method( @@ -196,6 +205,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override _i4.Float64List getTransform() => (super.noSuchMethod( Invocation.method( @@ -204,6 +214,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValue: _i4.Float64List(0), ) as _i4.Float64List); + @override void clipRect( _i2.Rect? rect, { @@ -221,6 +232,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void clipRRect( _i2.RRect? rrect, { @@ -234,6 +246,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void clipPath( _i2.Path? path, { @@ -247,6 +260,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override _i2.Rect getLocalClipBounds() => (super.noSuchMethod( Invocation.method( @@ -261,6 +275,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), ), ) as _i2.Rect); + @override _i2.Rect getDestinationClipBounds() => (super.noSuchMethod( Invocation.method( @@ -275,6 +290,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), ), ) as _i2.Rect); + @override void drawColor( _i2.Color? color, @@ -290,6 +306,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawLine( _i2.Offset? p1, @@ -307,6 +324,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPaint(_i2.Paint? paint) => super.noSuchMethod( Invocation.method( @@ -315,6 +333,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRect( _i2.Rect? rect, @@ -330,6 +349,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRRect( _i2.RRect? rrect, @@ -345,6 +365,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawDRRect( _i2.RRect? outer, @@ -362,6 +383,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawOval( _i2.Rect? rect, @@ -377,6 +399,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawCircle( _i2.Offset? c, @@ -394,6 +417,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawArc( _i2.Rect? rect, @@ -415,6 +439,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPath( _i2.Path? path, @@ -430,6 +455,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImage( _i2.Image? image, @@ -447,6 +473,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImageRect( _i2.Image? image, @@ -466,6 +493,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawImageNine( _i2.Image? image, @@ -485,6 +513,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPicture(_i2.Picture? picture) => super.noSuchMethod( Invocation.method( @@ -493,6 +522,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawParagraph( _i2.Paragraph? paragraph, @@ -508,6 +538,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawPoints( _i2.PointMode? pointMode, @@ -525,6 +556,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRawPoints( _i2.PointMode? pointMode, @@ -542,6 +574,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawVertices( _i2.Vertices? vertices, @@ -559,6 +592,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawAtlas( _i2.Image? atlas, @@ -584,6 +618,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawRawAtlas( _i2.Image? atlas, @@ -609,6 +644,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ), returnValueForMissingStub: null, ); + @override void drawShadow( _i2.Path? path, @@ -643,6 +679,7 @@ class MockFlDotPainter extends _i1.Mock implements _i5.FlDotPainter { Invocation.getter(#props), returnValue: [], ) as List); + @override void draw( _i2.Canvas? canvas, @@ -660,6 +697,7 @@ class MockFlDotPainter extends _i1.Mock implements _i5.FlDotPainter { ), returnValueForMissingStub: null, ); + @override _i2.Size getSize(_i5.FlSpot? spot) => (super.noSuchMethod( Invocation.method( @@ -692,6 +730,7 @@ class MockUtils extends _i1.Mock implements _i6.Utils { ), returnValue: 0.0, ) as double); + @override double degrees(double? radians) => (super.noSuchMethod( Invocation.method( @@ -700,6 +739,7 @@ class MockUtils extends _i1.Mock implements _i6.Utils { ), returnValue: 0.0, ) as double); + @override _i2.Size getDefaultSize(_i2.Size? screenSize) => (super.noSuchMethod( Invocation.method( @@ -714,6 +754,7 @@ class MockUtils extends _i1.Mock implements _i6.Utils { ), ), ) as _i2.Size); + @override double translateRotatedPosition( double? size, @@ -729,6 +770,7 @@ class MockUtils extends _i1.Mock implements _i6.Utils { ), returnValue: 0.0, ) as double); + @override _i2.Offset calculateRotationOffset( _i2.Size? size, @@ -753,6 +795,7 @@ class MockUtils extends _i1.Mock implements _i6.Utils { ), ), ) as _i2.Offset); + @override _i3.BorderRadius? normalizeBorderRadius( _i3.BorderRadius? borderRadius, @@ -765,6 +808,7 @@ class MockUtils extends _i1.Mock implements _i6.Utils { width, ], )) as _i3.BorderRadius?); + @override _i3.BorderSide normalizeBorderSide( _i3.BorderSide? borderSide, @@ -789,6 +833,7 @@ class MockUtils extends _i1.Mock implements _i6.Utils { ), ), ) as _i3.BorderSide); + @override double getEfficientInterval( double? axisViewSize, @@ -806,6 +851,7 @@ class MockUtils extends _i1.Mock implements _i6.Utils { ), returnValue: 0.0, ) as double); + @override double roundInterval(double? input) => (super.noSuchMethod( Invocation.method( @@ -814,14 +860,34 @@ class MockUtils extends _i1.Mock implements _i6.Utils { ), returnValue: 0.0, ) as double); + @override - String formatNumber(double? number) => (super.noSuchMethod( + int getFractionDigits(double? value) => (super.noSuchMethod( + Invocation.method( + #getFractionDigits, + [value], + ), + returnValue: 0, + ) as int); + + @override + String formatNumber( + double? axisMin, + double? axisMax, + double? axisValue, + ) => + (super.noSuchMethod( Invocation.method( #formatNumber, - [number], + [ + axisMin, + axisMax, + axisValue, + ], ), returnValue: '', ) as String); + @override _i3.TextStyle getThemeAwareTextStyle( _i3.BuildContext? context, @@ -846,6 +912,7 @@ class MockUtils extends _i1.Mock implements _i6.Utils { ), ), ) as _i3.TextStyle); + @override double getBestInitialIntervalValue( double? min, @@ -865,6 +932,7 @@ class MockUtils extends _i1.Mock implements _i6.Utils { ), returnValue: 0.0, ) as double); + @override double convertRadiusToSigma(double? radius) => (super.noSuchMethod( Invocation.method( diff --git a/test/utils/utils_test.dart b/test/utils/utils_test.dart index d06d7559d..85d9e750c 100644 --- a/test/utils/utils_test.dart +++ b/test/utils/utils_test.dart @@ -220,34 +220,53 @@ void main() { expect(Utils().getEfficientInterval(10, 0), 1); }); + test('test getFractionDigits', () { + expect(Utils().getFractionDigits(1), 1); + expect(Utils().getFractionDigits(343), 1); + expect(Utils().getFractionDigits(22), 1); + expect(Utils().getFractionDigits(444444), 1); + expect(Utils().getFractionDigits(0.9), 2); + expect(Utils().getFractionDigits(0.1), 2); + expect(Utils().getFractionDigits(0.01), 3); + expect(Utils().getFractionDigits(0.001), 4); + expect(Utils().getFractionDigits(0.009), 4); + expect(Utils().getFractionDigits(0.008), 4); + expect(Utils().getFractionDigits(0.0001), 5); + expect(Utils().getFractionDigits(0.0009), 5); + expect(Utils().getFractionDigits(0.00001), 6); + expect(Utils().getFractionDigits(0.000001), 7); + expect(Utils().getFractionDigits(0.0000001), 8); + expect(Utils().getFractionDigits(0.00000001), 9); + }); + test('test formatNumber', () { - expect(Utils().formatNumber(0), '0'); - expect(Utils().formatNumber(-0), '0'); - expect(Utils().formatNumber(-0.01), '0'); - expect(Utils().formatNumber(0.01), '0'); - expect(Utils().formatNumber(-0.1), '-0.1'); - expect(Utils().formatNumber(423), '423'); - expect(Utils().formatNumber(-423), '-423'); - expect(Utils().formatNumber(1000), '1K'); - expect(Utils().formatNumber(1234), '1.2K'); - expect(Utils().formatNumber(10000), '10K'); - expect(Utils().formatNumber(41234), '41.2K'); - expect(Utils().formatNumber(82349), '82.3K'); - expect(Utils().formatNumber(82350), '82.3K'); - expect(Utils().formatNumber(82351), '82.4K'); - expect(Utils().formatNumber(-82351), '-82.4K'); - expect(Utils().formatNumber(100000), '100K'); - expect(Utils().formatNumber(101000), '101K'); - expect(Utils().formatNumber(2345123), '2.3M'); - expect(Utils().formatNumber(2352123), '2.4M'); - expect(Utils().formatNumber(-2352123), '-2.4M'); - expect(Utils().formatNumber(521000000), '521M'); - expect(Utils().formatNumber(4324512345), '4.3B'); - expect(Utils().formatNumber(4000000000), '4B'); - expect(Utils().formatNumber(-4000000000), '-4B'); - expect(Utils().formatNumber(823147521343), '823.1B'); - expect(Utils().formatNumber(8231475213435), '8231.5B'); - expect(Utils().formatNumber(-8231475213435), '-8231.5B'); + expect(Utils().formatNumber(0, 10, 0), '0'); + expect(Utils().formatNumber(0, 10, -0), '0'); + expect(Utils().formatNumber(0, 10, -0.01), '0'); + expect(Utils().formatNumber(0, 10, 0.01), '0'); + expect(Utils().formatNumber(0, 10, -0.1), '-0.1'); + expect(Utils().formatNumber(0, 10, 423), '423'); + expect(Utils().formatNumber(0, 10, -423), '-423'); + expect(Utils().formatNumber(0, 10, 1000), '1K'); + expect(Utils().formatNumber(0, 10, 1234), '1.2K'); + expect(Utils().formatNumber(0, 10, 10000), '10K'); + expect(Utils().formatNumber(0, 10, 41234), '41.2K'); + expect(Utils().formatNumber(0, 10, 82349), '82.3K'); + expect(Utils().formatNumber(0, 10, 82350), '82.3K'); + expect(Utils().formatNumber(0, 10, 82351), '82.4K'); + expect(Utils().formatNumber(0, 10, -82351), '-82.4K'); + expect(Utils().formatNumber(0, 10, 100000), '100K'); + expect(Utils().formatNumber(0, 10, 101000), '101K'); + expect(Utils().formatNumber(0, 10, 2345123), '2.3M'); + expect(Utils().formatNumber(0, 10, 2352123), '2.4M'); + expect(Utils().formatNumber(0, 10, -2352123), '-2.4M'); + expect(Utils().formatNumber(0, 10, 521000000), '521M'); + expect(Utils().formatNumber(0, 10, 4324512345), '4.3B'); + expect(Utils().formatNumber(0, 10, 4000000000), '4B'); + expect(Utils().formatNumber(0, 10, -4000000000), '-4B'); + expect(Utils().formatNumber(0, 10, 823147521343), '823.1B'); + expect(Utils().formatNumber(0, 10, 8231475213435), '8231.5B'); + expect(Utils().formatNumber(0, 10, -8231475213435), '-8231.5B'); }); group('test getThemeAwareTextStyle', () { diff --git a/test/utils/utils_test.mocks.dart b/test/utils/utils_test.mocks.dart index fe4c97927..952e998a8 100644 --- a/test/utils/utils_test.mocks.dart +++ b/test/utils/utils_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in fl_chart/test/utils/utils_test.dart. // Do not manually edit this file. @@ -132,6 +132,7 @@ class MockUtils extends _i1.Mock implements _i5.Utils { ), returnValue: 0.0, ) as double); + @override double degrees(double? radians) => (super.noSuchMethod( Invocation.method( @@ -140,6 +141,7 @@ class MockUtils extends _i1.Mock implements _i5.Utils { ), returnValue: 0.0, ) as double); + @override _i2.Size getDefaultSize(_i2.Size? screenSize) => (super.noSuchMethod( Invocation.method( @@ -154,6 +156,7 @@ class MockUtils extends _i1.Mock implements _i5.Utils { ), ), ) as _i2.Size); + @override double translateRotatedPosition( double? size, @@ -169,6 +172,7 @@ class MockUtils extends _i1.Mock implements _i5.Utils { ), returnValue: 0.0, ) as double); + @override _i2.Offset calculateRotationOffset( _i2.Size? size, @@ -193,6 +197,7 @@ class MockUtils extends _i1.Mock implements _i5.Utils { ), ), ) as _i2.Offset); + @override _i3.BorderRadius? normalizeBorderRadius( _i3.BorderRadius? borderRadius, @@ -205,6 +210,7 @@ class MockUtils extends _i1.Mock implements _i5.Utils { width, ], )) as _i3.BorderRadius?); + @override _i3.BorderSide normalizeBorderSide( _i3.BorderSide? borderSide, @@ -229,6 +235,7 @@ class MockUtils extends _i1.Mock implements _i5.Utils { ), ), ) as _i3.BorderSide); + @override double getEfficientInterval( double? axisViewSize, @@ -246,6 +253,7 @@ class MockUtils extends _i1.Mock implements _i5.Utils { ), returnValue: 0.0, ) as double); + @override double roundInterval(double? input) => (super.noSuchMethod( Invocation.method( @@ -254,14 +262,34 @@ class MockUtils extends _i1.Mock implements _i5.Utils { ), returnValue: 0.0, ) as double); + @override - String formatNumber(double? number) => (super.noSuchMethod( + int getFractionDigits(double? value) => (super.noSuchMethod( + Invocation.method( + #getFractionDigits, + [value], + ), + returnValue: 0, + ) as int); + + @override + String formatNumber( + double? axisMin, + double? axisMax, + double? axisValue, + ) => + (super.noSuchMethod( Invocation.method( #formatNumber, - [number], + [ + axisMin, + axisMax, + axisValue, + ], ), returnValue: '', ) as String); + @override _i3.TextStyle getThemeAwareTextStyle( _i3.BuildContext? context, @@ -286,6 +314,7 @@ class MockUtils extends _i1.Mock implements _i5.Utils { ), ), ) as _i3.TextStyle); + @override double getBestInitialIntervalValue( double? min, @@ -305,6 +334,7 @@ class MockUtils extends _i1.Mock implements _i5.Utils { ), returnValue: 0.0, ) as double); + @override double convertRadiusToSigma(double? radius) => (super.noSuchMethod( Invocation.method( @@ -331,16 +361,19 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { Invocation.getter(#widget), ), ) as _i3.Widget); + @override bool get mounted => (super.noSuchMethod( Invocation.getter(#mounted), returnValue: false, ) as bool); + @override bool get debugDoingBuild => (super.noSuchMethod( Invocation.getter(#debugDoingBuild), returnValue: false, ) as bool); + @override _i3.InheritedWidget dependOnInheritedElement( _i3.InheritedElement? ancestor, { @@ -361,6 +394,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), ), ) as _i3.InheritedWidget); + @override void visitAncestorElements(_i3.ConditionalElementVisitor? visitor) => super.noSuchMethod( @@ -370,6 +404,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), returnValueForMissingStub: null, ); + @override void visitChildElements(_i3.ElementVisitor? visitor) => super.noSuchMethod( Invocation.method( @@ -378,6 +413,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), returnValueForMissingStub: null, ); + @override void dispatchNotification(_i3.Notification? notification) => super.noSuchMethod( @@ -387,6 +423,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), returnValueForMissingStub: null, ); + @override _i3.DiagnosticsNode describeElement( String? name, { @@ -407,6 +444,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), ), ) as _i3.DiagnosticsNode); + @override _i3.DiagnosticsNode describeWidget( String? name, { @@ -427,6 +465,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), ), ) as _i3.DiagnosticsNode); + @override List<_i3.DiagnosticsNode> describeMissingAncestor( {required Type? expectedAncestorType}) => @@ -438,6 +477,7 @@ class MockBuildContext extends _i1.Mock implements _i3.BuildContext { ), returnValue: <_i3.DiagnosticsNode>[], ) as List<_i3.DiagnosticsNode>); + @override _i3.DiagnosticsNode describeOwnershipChain(String? name) => (super.noSuchMethod( From 621b79e82d54e6cda3f5fdda344f79f971417f57 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Sat, 7 Oct 2023 03:16:23 +0200 Subject: [PATCH 026/149] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 99114db56..c302bfd86 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ * **BUGFIX** (by @Anas35) Fix Tooltip not displaying when value from BackgroundBarChartRodData is less than zero. #1345. * **BUGFIX** (by @imaNNeo) Fix Negative BarChartRodStackItem are not drawn correctly bug, #1347 * **BUGFIX** (by @imaNNeo) Fix bar_chart_helper minY calculation bug, #1388 +* **IMPROVEMENT** (by @imaNNeo) Consider fraction digits when formatting chart side titles, #1267 ## 0.63.0 * **BUGFIX** (by @imaNNeo) Fix PieChart crash on web-renderer html by ignoring `sectionsSpace` when `Path.combine()` does not work (it's flutter engine [issue](https://github.com/flutter/flutter/issues/44572)), #955 From e3910de44eed99277d681fefdc69023a28f13142 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Sat, 7 Oct 2023 03:20:49 +0200 Subject: [PATCH 027/149] Bump version to 0.64.0 --- CHANGELOG.md | 2 +- pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c302bfd86..39f644524 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## nextVersion +## 0.64.0 * **BUGFIX** (by @Anas35) Fix Tooltip not displaying when value from BackgroundBarChartRodData is less than zero. #1345. * **BUGFIX** (by @imaNNeo) Fix Negative BarChartRodStackItem are not drawn correctly bug, #1347 * **BUGFIX** (by @imaNNeo) Fix bar_chart_helper minY calculation bug, #1388 diff --git a/pubspec.yaml b/pubspec.yaml index 837e3011b..7324dcd51 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: fl_chart description: A highly customizable Flutter chart library that supports Line Chart, Bar Chart, Pie Chart, Scatter Chart, and Radar Chart. -version: 0.63.0 +version: 0.64.0 homepage: https://flchart.dev/ repository: https://github.com/imaNNeo/fl_chart issue_tracker: https://github.com/imaNNeo/fl_chart/issues From 7918942fbebd19f9a1b7abb009d9e546d6506432 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Sat, 7 Oct 2023 03:43:06 +0200 Subject: [PATCH 028/149] Fix macOS debug network issue --- example/macos/Runner/DebugProfile.entitlements | 2 ++ 1 file changed, 2 insertions(+) diff --git a/example/macos/Runner/DebugProfile.entitlements b/example/macos/Runner/DebugProfile.entitlements index dddb8a30c..c946719a1 100644 --- a/example/macos/Runner/DebugProfile.entitlements +++ b/example/macos/Runner/DebugProfile.entitlements @@ -8,5 +8,7 @@ com.apple.security.network.server + com.apple.security.network.client + From b99169b95870a976d95ab3cf85abf058c9ca330d Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Sat, 7 Oct 2023 03:43:20 +0200 Subject: [PATCH 029/149] Fix radar chart sample 1 overflow --- .../lib/presentation/samples/radar/radar_chart_sample1.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/example/lib/presentation/samples/radar/radar_chart_sample1.dart b/example/lib/presentation/samples/radar/radar_chart_sample1.dart index a8c5ab792..a30b1dc49 100644 --- a/example/lib/presentation/samples/radar/radar_chart_sample1.dart +++ b/example/lib/presentation/samples/radar/radar_chart_sample1.dart @@ -50,6 +50,10 @@ class _RadarChartSample1State extends State { max: 360, onChanged: (double value) => setState(() => angleValue = value), ), + ], + ), + Row( + children: [ Checkbox( value: relativeAngleMode, onChanged: (v) => setState(() => relativeAngleMode = v!), From 396b2e16214d3a250eb0826dd5417414e787303f Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Sat, 7 Oct 2023 03:43:29 +0200 Subject: [PATCH 030/149] Upgrade example/ dependencies --- example/macos/Podfile.lock | 4 ++-- example/pubspec.yaml | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/example/macos/Podfile.lock b/example/macos/Podfile.lock index b94d353eb..5f803859e 100644 --- a/example/macos/Podfile.lock +++ b/example/macos/Podfile.lock @@ -21,8 +21,8 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 - path_provider_foundation: 37748e03f12783f9de2cb2c4eadfaa25fe6d4852 - url_launcher_macos: c04e4fa86382d4f94f6b38f14625708be3ae52e2 + path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 + url_launcher_macos: d2691c7dd33ed713bf3544850a623080ec693d95 PODFILE CHECKSUM: 353c8bcc5d5b0994e508d035b5431cfe18c1dea7 diff --git a/example/pubspec.yaml b/example/pubspec.yaml index a1caf4cc4..e8ae01818 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -10,21 +10,21 @@ dependencies: sdk: flutter flutter_web_plugins: sdk: flutter - cupertino_icons: ^1.0.5 - google_fonts: ^4.0.4 - flutter_svg: ^2.0.5 + cupertino_icons: ^1.0.6 + google_fonts: ^6.1.0 + flutter_svg: ^2.0.7 universal_platform: ^1.0.0+1 - flutter_staggered_grid_view: ^0.6.2 - url_launcher: ^6.1.11 - go_router: ^7.0.1 - dartx: ^1.1.0 + flutter_staggered_grid_view: ^0.7.0 + url_launcher: ^6.1.14 + go_router: ^11.1.2 + dartx: ^1.2.0 fl_chart: path: ../ dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^2.0.1 + flutter_lints: ^2.0.3 flutter: uses-material-design: true From 79e6ec7088587007812aef6b194371e4eb807fa3 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Sat, 7 Oct 2023 03:48:25 +0200 Subject: [PATCH 031/149] Open flchart.dev when user clicks on the fl_chart logo --- example/lib/presentation/menu/app_menu.dart | 13 +++++++++++-- example/lib/urls.dart | 1 + 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/example/lib/presentation/menu/app_menu.dart b/example/lib/presentation/menu/app_menu.dart index 179a3ee62..e854f98a2 100644 --- a/example/lib/presentation/menu/app_menu.dart +++ b/example/lib/presentation/menu/app_menu.dart @@ -1,4 +1,5 @@ import 'package:fl_chart_app/presentation/resources/app_resources.dart'; +import 'package:fl_chart_app/urls.dart'; import 'package:fl_chart_app/util/app_helper.dart'; import 'package:flutter/material.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -30,11 +31,19 @@ class AppMenuState extends State { color: AppColors.itemsBackground, child: Column( children: [ - const SafeArea( + SafeArea( child: AspectRatio( aspectRatio: 3, child: Center( - child: FlChartBanner(), + child: InkWell( + onTap: () async { + final url = Uri.parse(Urls.flChartUrl); + if (await canLaunchUrl(url)) { + await launchUrl(url); + } + }, + child: const FlChartBanner(), + ), ), ), ), diff --git a/example/lib/urls.dart b/example/lib/urls.dart index 772c77702..d1b9fb160 100644 --- a/example/lib/urls.dart +++ b/example/lib/urls.dart @@ -1,6 +1,7 @@ import 'package:fl_chart_app/util/app_helper.dart'; class Urls { + static const flChartUrl = 'https://flchart.dev'; static String getChartSourceCodeUrl(ChartType chartType, int sampleNumber) { final chartDir = chartType.name.toLowerCase(); return 'https://github.com/imaNNeo/fl_chart/blob/master/example/lib/presentation/samples/$chartDir/${chartDir}_chart_sample$sampleNumber.dart'; From ab886589a29ac9e27bd29e49830c753ba54b0c43 Mon Sep 17 00:00:00 2001 From: Dartek12 Date: Sun, 24 Sep 2023 19:26:33 +0200 Subject: [PATCH 032/149] Added gradient to FlLine --- CHANGELOG.md | 3 + .../base/axis_chart/axis_chart_data.dart | 17 ++++-- .../base/axis_chart/axis_chart_painter.dart | 59 ++++++++++++++----- lib/src/chart/line_chart/line_chart_data.dart | 2 +- .../chart/line_chart/line_chart_painter.dart | 38 ++++++++---- lib/src/extensions/paint_extension.dart | 10 ++++ test/extensions/paint_extension_test.dart | 16 +++++ 7 files changed, 113 insertions(+), 32 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 39f644524..80d73b8cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## nextVersion +* **FEATURE** (by @Dartek12): Added gradient to [FlLine](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#FlLine) + ## 0.64.0 * **BUGFIX** (by @Anas35) Fix Tooltip not displaying when value from BackgroundBarChartRodData is less than zero. #1345. * **BUGFIX** (by @imaNNeo) Fix Negative BarChartRodStackItem are not drawn correctly bug, #1347 diff --git a/lib/src/chart/base/axis_chart/axis_chart_data.dart b/lib/src/chart/base/axis_chart/axis_chart_data.dart index 778bab21a..ee07e0621 100644 --- a/lib/src/chart/base/axis_chart/axis_chart_data.dart +++ b/lib/src/chart/base/axis_chart/axis_chart_data.dart @@ -664,13 +664,18 @@ class FlLine with EquatableMixin { /// For example, the array `[5, 10]` would result in dashes 5 pixels long /// followed by blank spaces 10 pixels long. const FlLine({ - this.color = Colors.black, + Color? color, + this.gradient, this.strokeWidth = 2, this.dashArray, - }); + }) : color = color ?? + ((color == null && gradient == null) ? Colors.black : null); /// Defines color of the line. - final Color color; + final Color? color; + + /// Defines the gradient of the line. + final Gradient? gradient; /// Defines thickness of the line. final double strokeWidth; @@ -685,7 +690,8 @@ class FlLine with EquatableMixin { /// Lerps a [FlLine] based on [t] value, check [Tween.lerp]. static FlLine lerp(FlLine a, FlLine b, double t) { return FlLine( - color: Color.lerp(a.color, b.color, t)!, + color: Color.lerp(a.color, b.color, t), + gradient: Gradient.lerp(a.gradient, b.gradient, t), strokeWidth: lerpDouble(a.strokeWidth, b.strokeWidth, t)!, dashArray: lerpIntList(a.dashArray, b.dashArray, t), ); @@ -695,11 +701,13 @@ class FlLine with EquatableMixin { /// and replaces provided values. FlLine copyWith({ Color? color, + Gradient? gradient, double? strokeWidth, List? dashArray, }) { return FlLine( color: color ?? this.color, + gradient: gradient ?? this.gradient, strokeWidth: strokeWidth ?? this.strokeWidth, dashArray: dashArray ?? this.dashArray, ); @@ -709,6 +717,7 @@ class FlLine with EquatableMixin { @override List get props => [ color, + gradient, strokeWidth, dashArray, ]; diff --git a/lib/src/chart/base/axis_chart/axis_chart_painter.dart b/lib/src/chart/base/axis_chart/axis_chart_painter.dart index 610e0dac5..833b7ee91 100644 --- a/lib/src/chart/base/axis_chart/axis_chart_painter.dart +++ b/lib/src/chart/base/axis_chart/axis_chart_painter.dart @@ -73,20 +73,28 @@ abstract class AxisChartPainter if (!data.gridData.checkToShowVerticalLine(axisValue)) { continue; } - final flLineStyle = data.gridData.getDrawingVerticalLine(axisValue); - _gridPaint - ..color = flLineStyle.color - ..strokeWidth = flLineStyle.strokeWidth - ..transparentIfWidthIsZero(); - final bothX = getPixelX(axisValue, viewSize, holder); final x1 = bothX; const y1 = 0.0; final x2 = bothX; final y2 = viewSize.height; + final from = Offset(x1, y1); + final to = Offset(x2, y2); + + final flLineStyle = data.gridData.getDrawingVerticalLine(axisValue); + _gridPaint + ..setColorOrGradientForLine( + flLineStyle.color, + flLineStyle.gradient, + from: from, + to: to, + ) + ..strokeWidth = flLineStyle.strokeWidth + ..transparentIfWidthIsZero(); + canvasWrapper.drawDashedLine( - Offset(x1, y1), - Offset(x2, y2), + from, + to, _gridPaint, flLineStyle.dashArray, ); @@ -111,19 +119,28 @@ abstract class AxisChartPainter continue; } final flLine = data.gridData.getDrawingHorizontalLine(axisValue); - _gridPaint - ..color = flLine.color - ..strokeWidth = flLine.strokeWidth - ..transparentIfWidthIsZero(); final bothY = getPixelY(axisValue, viewSize, holder); const x1 = 0.0; final y1 = bothY; final x2 = viewSize.width; final y2 = bothY; + final from = Offset(x1, y1); + final to = Offset(x2, y2); + + _gridPaint + ..setColorOrGradientForLine( + flLine.color, + flLine.gradient, + from: from, + to: to, + ) + ..strokeWidth = flLine.strokeWidth + ..transparentIfWidthIsZero(); + canvasWrapper.drawDashedLine( - Offset(x1, y1), - Offset(x2, y2), + from, + to, _gridPaint, flLine.dashArray, ); @@ -229,7 +246,12 @@ abstract class AxisChartPainter if (!isLineOutsideOfChart) { _extraLinesPaint - ..color = line.color + ..setColorOrGradientForLine( + line.color, + line.gradient, + from: from, + to: to, + ) ..strokeWidth = line.strokeWidth ..transparentIfWidthIsZero() ..strokeCap = line.strokeCap; @@ -316,7 +338,12 @@ abstract class AxisChartPainter if (!isLineOutsideOfChart) { _extraLinesPaint - ..color = line.color + ..setColorOrGradientForLine( + line.color, + line.gradient, + from: from, + to: to, + ) ..strokeWidth = line.strokeWidth ..transparentIfWidthIsZero() ..strokeCap = line.strokeCap; diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index 6c2b7d18f..3985e76eb 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -1195,7 +1195,7 @@ List defaultTouchedIndicators( lineColor = _defaultGetDotColor(barData.spots[index], 0, barData); } const lineStrokeWidth = 4.0; - final flLine = FlLine(color: lineColor!, strokeWidth: lineStrokeWidth); + final flLine = FlLine(color: lineColor, strokeWidth: lineStrokeWidth); var dotSize = 10.0; if (barData.dotData.show) { diff --git a/lib/src/chart/line_chart/line_chart_painter.dart b/lib/src/chart/line_chart/line_chart_painter.dart index 3cc5a6060..bf7293000 100644 --- a/lib/src/chart/line_chart/line_chart_painter.dart +++ b/lib/src/chart/line_chart/line_chart_painter.dart @@ -411,16 +411,22 @@ class LineChartPainter extends AxisChartPainter { } } + final indicatorLine = indicatorData.indicatorBelowLine; _touchLinePaint - ..color = indicatorData.indicatorBelowLine.color - ..strokeWidth = indicatorData.indicatorBelowLine.strokeWidth + ..setColorOrGradientForLine( + indicatorLine.color, + indicatorLine.gradient, + from: lineStart, + to: lineEnd, + ) + ..strokeWidth = indicatorLine.strokeWidth ..transparentIfWidthIsZero(); canvasWrapper.drawDashedLine( lineStart, lineEnd, _touchLinePaint, - indicatorData.indicatorBelowLine.dashArray, + indicatorLine.dashArray, ); /// Draw the indicator dot @@ -752,17 +758,22 @@ class LineChartPainter extends AxisChartPainter { ); } + final lineStyle = barData.belowBarData.spotsLine.flLineStyle; _barAreaLinesPaint - ..color = barData.belowBarData.spotsLine.flLineStyle.color - ..strokeWidth = - barData.belowBarData.spotsLine.flLineStyle.strokeWidth + ..setColorOrGradientForLine( + lineStyle.color, + lineStyle.gradient, + from: from, + to: to, + ) + ..strokeWidth = lineStyle.strokeWidth ..transparentIfWidthIsZero(); canvasWrapper.drawDashedLine( from, to, _barAreaLinesPaint, - barData.belowBarData.spotsLine.flLineStyle.dashArray, + lineStyle.dashArray, ); } } @@ -841,17 +852,22 @@ class LineChartPainter extends AxisChartPainter { ); } + final lineStyle = barData.aboveBarData.spotsLine.flLineStyle; _barAreaLinesPaint - ..color = barData.aboveBarData.spotsLine.flLineStyle.color - ..strokeWidth = - barData.aboveBarData.spotsLine.flLineStyle.strokeWidth + ..setColorOrGradientForLine( + lineStyle.color, + lineStyle.gradient, + from: from, + to: to, + ) + ..strokeWidth = lineStyle.strokeWidth ..transparentIfWidthIsZero(); canvasWrapper.drawDashedLine( from, to, _barAreaLinesPaint, - barData.aboveBarData.spotsLine.flLineStyle.dashArray, + lineStyle.dashArray, ); } } diff --git a/lib/src/extensions/paint_extension.dart b/lib/src/extensions/paint_extension.dart index 2eb469e40..7c7cb71bb 100644 --- a/lib/src/extensions/paint_extension.dart +++ b/lib/src/extensions/paint_extension.dart @@ -18,4 +18,14 @@ extension PaintExtension on Paint { shader = null; } } + + void setColorOrGradientForLine( + Color? color, + Gradient? gradient, { + required Offset from, + required Offset to, + }) { + final rect = Rect.fromPoints(from, to); + setColorOrGradient(color, gradient, rect); + } } diff --git a/test/extensions/paint_extension_test.dart b/test/extensions/paint_extension_test.dart index d1bb321fb..da7a16a6e 100644 --- a/test/extensions/paint_extension_test.dart +++ b/test/extensions/paint_extension_test.dart @@ -36,4 +36,20 @@ void main() { expect(paint.color, MockData.color0); expect(paint.shader, isNull); }); + + test('test setColorOrGradientForLine', () { + final paint = Paint() + ..color = MockData.color0 + ..setColorOrGradientForLine( + null, + MockData.gradient1, + from: MockData.rect1.topLeft, + to: MockData.rect1.bottomRight, + ); + expect(paint.shader, isNotNull); + + paint.setColorOrGradient(MockData.color0, null, MockData.rect1); + expect(paint.color, MockData.color0); + expect(paint.shader, isNull); + }); } From 696bb2d939b14fe0074177bb0f6be3790a9fcd28 Mon Sep 17 00:00:00 2001 From: Dartek12 Date: Sun, 1 Oct 2023 19:46:27 +0200 Subject: [PATCH 033/149] Updated docs --- repo_files/documentations/base_chart.md | 1 + 1 file changed, 1 insertion(+) diff --git a/repo_files/documentations/base_chart.md b/repo_files/documentations/base_chart.md index 2c01399bb..c41ed5c50 100644 --- a/repo_files/documentations/base_chart.md +++ b/repo_files/documentations/base_chart.md @@ -67,6 +67,7 @@ |propName|Description|default value| |:-------|:----------|:------------| |color|determines the color of line|Colors.black| +|gradient|gradient of the line|null| |strokeWidth|determines the stroke width of the line|2| |dashArray|A circular array of dash offsets and lengths. For example, the array `[5, 10]` would result in dashes 5 pixels long followed by blank spaces 10 pixels long. The array `[5, 10, 5]` would result in a 5 pixel dash, a 10 pixel gap, a 5 pixel dash, a 5 pixel gap, a 10 pixel dash, etc.|null| From c8dc3c0877f9c0ea25f4f9149eec4f4de7d954b9 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Sun, 5 Nov 2023 13:52:48 +0100 Subject: [PATCH 034/149] Mention the issue id in the CHANGELOG.md file --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 80d73b8cd..6d2114d5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,5 @@ ## nextVersion -* **FEATURE** (by @Dartek12): Added gradient to [FlLine](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#FlLine) +* **FEATURE** (by @Dartek12): Added gradient to [FlLine](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#FlLine), #1197 ## 0.64.0 * **BUGFIX** (by @Anas35) Fix Tooltip not displaying when value from BackgroundBarChartRodData is less than zero. #1345. From 07c3d855fe121706038439c606e4e5625e1e370e Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Sat, 11 Nov 2023 02:31:04 +0100 Subject: [PATCH 035/149] Fix iOS, macOS build issues --- example/ios/Podfile.lock | 29 +++++++ example/ios/Runner.xcodeproj/project.pbxproj | 75 ++++++++++++++++++- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../contents.xcworkspacedata | 3 + example/macos/Podfile.lock | 2 +- 5 files changed, 107 insertions(+), 4 deletions(-) create mode 100644 example/ios/Podfile.lock diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock new file mode 100644 index 000000000..b4b133aee --- /dev/null +++ b/example/ios/Podfile.lock @@ -0,0 +1,29 @@ +PODS: + - Flutter (1.0.0) + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS + - url_launcher_ios (0.0.1): + - Flutter + +DEPENDENCIES: + - Flutter (from `Flutter`) + - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) + - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) + +EXTERNAL SOURCES: + Flutter: + :path: Flutter + path_provider_foundation: + :path: ".symlinks/plugins/path_provider_foundation/darwin" + url_launcher_ios: + :path: ".symlinks/plugins/url_launcher_ios/ios" + +SPEC CHECKSUMS: + Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 + path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 + url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4 + +PODFILE CHECKSUM: ef19549a9bc3046e7bb7d2fab4d021637c0c58a3 + +COCOAPODS: 1.13.0 diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index 23ddfa126..fab3d87e7 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -3,11 +3,12 @@ archiveVersion = 1; classes = { }; - objectVersion = 50; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3A769574DE769ECF798B0709 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 380B38C853A9B1A4CE259991 /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; @@ -31,7 +32,9 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 380B38C853A9B1A4CE259991 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 70B7C328B4B2F1CF5A8F4CD5 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; @@ -42,6 +45,8 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + A5FD4176E495AE357451309C /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + F92DACD635C19D794086368F /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -49,12 +54,32 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 3A769574DE769ECF798B0709 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 387A47388B1D7AAF78141AE7 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 380B38C853A9B1A4CE259991 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 87E9D592125921BB4FA5096E /* Pods */ = { + isa = PBXGroup; + children = ( + 70B7C328B4B2F1CF5A8F4CD5 /* Pods-Runner.debug.xcconfig */, + F92DACD635C19D794086368F /* Pods-Runner.release.xcconfig */, + A5FD4176E495AE357451309C /* Pods-Runner.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -72,6 +97,8 @@ 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, + 87E9D592125921BB4FA5096E /* Pods */, + 387A47388B1D7AAF78141AE7 /* Frameworks */, ); sourceTree = ""; }; @@ -105,12 +132,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( + B16E897CCC57E0F4B2344803 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 00C61598CDE2223281B7DB47 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -127,7 +156,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1430; ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -169,12 +198,31 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 00C61598CDE2223281B7DB47 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); name = "Thin Binary"; outputPaths = ( @@ -185,6 +233,7 @@ }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -197,6 +246,28 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; + B16E897CCC57E0F4B2344803 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ diff --git a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index c87d15a33..a6b826db2 100644 --- a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ + + diff --git a/example/macos/Podfile.lock b/example/macos/Podfile.lock index 5f803859e..d5bfe3047 100644 --- a/example/macos/Podfile.lock +++ b/example/macos/Podfile.lock @@ -26,4 +26,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 353c8bcc5d5b0994e508d035b5431cfe18c1dea7 -COCOAPODS: 1.12.1 +COCOAPODS: 1.13.0 From ba68c76e3683cc346b933feb10484e0b7f8686f5 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Sat, 11 Nov 2023 02:42:18 +0100 Subject: [PATCH 036/149] Fix bar line shadow crash when we have only one (or zero) spot, #1466 --- CHANGELOG.md | 1 + lib/src/chart/line_chart/line_chart_painter.dart | 3 +++ 2 files changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d2114d5d..70ad4e028 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ## nextVersion * **FEATURE** (by @Dartek12): Added gradient to [FlLine](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#FlLine), #1197 +* **BUGFIX** (by @imaNNeo): Fix bar line shadow crash when we have only one (or zero) spot, #1466 ## 0.64.0 * **BUGFIX** (by @Anas35) Fix Tooltip not displaying when value from BackgroundBarChartRodData is less than zero. #1345. diff --git a/lib/src/chart/line_chart/line_chart_painter.dart b/lib/src/chart/line_chart/line_chart_painter.dart index bf7293000..a1aea66de 100644 --- a/lib/src/chart/line_chart/line_chart_painter.dart +++ b/lib/src/chart/line_chart/line_chart_painter.dart @@ -909,6 +909,9 @@ class LineChartPainter extends AxisChartPainter { if (!barData.show || barData.shadow.color.opacity == 0.0) { return; } + if (barPath.computeMetrics().isEmpty) { + return; + } _barPaint ..strokeCap = barData.isStrokeCapRound ? StrokeCap.round : StrokeCap.butt From 3c30cc379c905139d3f2a466de3da4b8d5ab50f6 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Sat, 11 Nov 2023 03:54:50 +0100 Subject: [PATCH 037/149] Fix having negative `toY` (or positive `fromY`) in BarChart's `minY` and `maxY` calculations, #1470 --- CHANGELOG.md | 5 +- lib/src/chart/bar_chart/bar_chart_helper.dart | 28 ++++---- .../bar_chart/bar_chart_helper_test.dart | 21 +++++- .../bar_chart/bar_chart_painter_test.dart | 67 +++++++++---------- 4 files changed, 68 insertions(+), 53 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 70ad4e028..bf78b226c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## nextVersion -* **FEATURE** (by @Dartek12): Added gradient to [FlLine](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#FlLine), #1197 -* **BUGFIX** (by @imaNNeo): Fix bar line shadow crash when we have only one (or zero) spot, #1466 +* **FEATURE** (by @Dartek12) Added gradient to [FlLine](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#FlLine), #1197 +* **BUGFIX** (by @imaNNeo) Fix bar line shadow crash when we have only one (or zero) spot, #1466 +* **BUGFIX** (by @imaNNeo) Fix having negative `toY` (or positive `fromY`) in BarChart's `minY` and `maxY` calculations, #1470 ## 0.64.0 * **BUGFIX** (by @Anas35) Fix Tooltip not displaying when value from BackgroundBarChartRodData is less than zero. #1345. diff --git a/lib/src/chart/bar_chart/bar_chart_helper.dart b/lib/src/chart/bar_chart/bar_chart_helper.dart index 52fe02450..10763170d 100644 --- a/lib/src/chart/bar_chart/bar_chart_helper.dart +++ b/lib/src/chart/bar_chart/bar_chart_helper.dart @@ -1,3 +1,5 @@ +import 'dart:math'; + import 'package:equatable/equatable.dart'; import 'package:fl_chart/src/chart/bar_chart/bar_chart_data.dart'; import 'package:fl_chart/src/utils/list_wrapper.dart'; @@ -33,28 +35,25 @@ class BarChartHelper { return BarChartMinMaxAxisValues(0, 0); } - var maxY = barGroup.barRods[0].toY; - var minY = barGroup.barRods[0].fromY; + var maxY = max(barGroup.barRods[0].fromY, barGroup.barRods[0].toY); + var minY = min(barGroup.barRods[0].fromY, barGroup.barRods[0].toY); for (var i = 0; i < barGroups.length; i++) { final barGroup = barGroups[i]; for (var j = 0; j < barGroup.barRods.length; j++) { final rod = barGroup.barRods[j]; - if (rod.toY > maxY) { - maxY = rod.toY; - } - - if (rod.backDrawRodData.show && rod.backDrawRodData.toY > maxY) { - maxY = rod.backDrawRodData.toY; - } + maxY = max(maxY, rod.fromY); + minY = min(minY, rod.fromY); - if (rod.fromY < minY) { - minY = rod.fromY; - } + maxY = max(maxY, rod.toY); + minY = min(minY, rod.toY); - if (rod.backDrawRodData.show && rod.backDrawRodData.fromY < minY) { - minY = rod.backDrawRodData.fromY; + if (rod.backDrawRodData.show) { + maxY = max(maxY, rod.backDrawRodData.fromY); + minY = min(minY, rod.backDrawRodData.fromY); + maxY = max(maxY, rod.backDrawRodData.toY); + minY = min(minY, rod.backDrawRodData.toY); } } } @@ -68,6 +67,7 @@ class BarChartHelper { /// Holds minY, and maxY for use in [BarChartData] class BarChartMinMaxAxisValues with EquatableMixin { BarChartMinMaxAxisValues(this.minY, this.maxY, {this.readFromCache = false}); + final double minY; final double maxY; final bool readFromCache; diff --git a/test/chart/bar_chart/bar_chart_helper_test.dart b/test/chart/bar_chart/bar_chart_helper_test.dart index b5c6c7caf..658854754 100644 --- a/test/chart/bar_chart/bar_chart_helper_test.dart +++ b/test/chart/bar_chart/bar_chart_helper_test.dart @@ -44,7 +44,7 @@ void main() { ), ]; final result = BarChartHelper.calculateMaxAxisValues(barGroups); - expect(result.minY, 0); + expect(result.minY, -40); expect(result.maxY, 10); }); @@ -57,6 +57,25 @@ void main() { expect(result.maxY, 0); }); + test('Test validity 4', () { + final barGroups = [ + barChartGroupData1.copyWith( + barRods: [ + BarChartRodData(fromY: 0, toY: -10), + BarChartRodData(fromY: -10, toY: -40), + BarChartRodData(toY: 0), + BarChartRodData(toY: 10), + BarChartRodData(toY: 5), + BarChartRodData(fromY: 10, toY: -50), + BarChartRodData(fromY: 39, toY: -50), + ], + ), + ]; + final result = BarChartHelper.calculateMaxAxisValues(barGroups); + expect(result.minY, -50); + expect(result.maxY, 39); + }); + test('Test equality', () { final barGroups = [barChartGroupData1, barChartGroupData2]; final result1 = BarChartHelper.calculateMaxAxisValues(barGroups); diff --git a/test/chart/bar_chart/bar_chart_painter_test.dart b/test/chart/bar_chart/bar_chart_painter_test.dart index f5750b372..d73c0344e 100644 --- a/test/chart/bar_chart/bar_chart_painter_test.dart +++ b/test/chart/bar_chart/bar_chart_painter_test.dart @@ -389,7 +389,7 @@ void main() { 28.5, 0, 38.5, - 100, + 76.923, const Radius.circular(0.1), ), ), @@ -402,9 +402,9 @@ void main() { results[1]['rRect'] as RRect, RRect.fromLTRBR( 43.5, - 20, + 15.384, 54.5, - 100, + 76.923, const Radius.circular(0.2), ), ), @@ -417,9 +417,9 @@ void main() { results[2]['rRect'] as RRect, RRect.fromLTRBR( 59.5, - 20, + 15.384, 71.5, - 100, + 76.923, const Radius.circular(0.3), ), ), @@ -434,7 +434,7 @@ void main() { 81.5, 0, 91.5, - 100, + 76.923, const Radius.circular(0.4), ), ), @@ -445,9 +445,9 @@ void main() { results[4]['rRect'] as RRect, RRect.fromLTRBR( 96.5, - 20, + 15.384, 106.5, - 100, + 76.923, const Radius.circular(5), ), ), @@ -459,9 +459,9 @@ void main() { results[5]['rRect'] as RRect, RRect.fromLTRBR( 116.5, - 20, + 15.384, 126.5, - 100, + 76.923, const Radius.circular(5), ), ), @@ -475,7 +475,7 @@ void main() { 116.5, 0, 126.5, - 100, + 76.923, const Radius.circular(5), ), ), @@ -486,9 +486,9 @@ void main() { results[7]['rRect'] as RRect, RRect.fromLTRBR( 131.5, - 20, + 15.384, 141.5, - 100, + 76.923, const Radius.circular(5), ), ), @@ -500,9 +500,9 @@ void main() { results[8]['rRect'] as RRect, RRect.fromLTRBR( 146.5, - 100, + 76.923, 156.5, - 130, + 100, const Radius.circular(5), ), ), @@ -514,9 +514,9 @@ void main() { results[9]['rRect'] as RRect, RRect.fromLTRBR( 146.5, - 20, + 15.384, 156.5, - 100, + 76.923, const Radius.circular(5), ), ), @@ -527,9 +527,9 @@ void main() { results[10]['rRect'] as RRect, RRect.fromLTRBR( 161.5, - 20, + 15.384, 171.5, - 100, + 76.923, const Radius.circular(5), ), ), @@ -647,9 +647,9 @@ void main() { results[0]['rrect'] as RRect, RRect.fromLTRBR( 84, - 76.5, + 65, 94, - 78.4, + 66.666, const Radius.circular(0.1), ), ), @@ -662,9 +662,9 @@ void main() { results[1]['rrect'] as RRect, RRect.fromLTRBR( 83.5, - 80.4, + 68.333, 94.5, - 98, + 83.333, const Radius.circular(0.2), ), ), @@ -677,9 +677,9 @@ void main() { results[2]['rrect'] as RRect, RRect.fromLTRBR( 83, - 100, + 85, 95, - 117.6, + 100, const Radius.circular(0.3), ), ), @@ -692,9 +692,9 @@ void main() { results[3]['rrect'] as RRect, RRect.fromLTRBR( 106, - 39.2, + 33.333, 116, - 41.2, + 35, const Radius.circular(0.1), ), ), @@ -705,9 +705,9 @@ void main() { results[4]['rrect'] as RRect, RRect.fromLTRBR( 105.5, - 19.6, + 16.666, 116.5, - 37.3, + 31.666, const Radius.circular(0.2), ), ), @@ -721,7 +721,7 @@ void main() { 105, 0, 117, - 17.6, + 15, const Radius.circular(0.3), ), ), @@ -1674,16 +1674,11 @@ void main() { null, ); - expect( - painter.handleTouch(const Offset(110.1, 70.2), viewSize, holder), - null, - ); - final result1 = painter.handleTouch(const Offset(89, 38.5), viewSize, holder); expect(result1!.touchedBarGroupIndex, 0); expect(result1.touchedRodDataIndex, 0); - expect(result1.touchedStackItemIndex, -1); + expect(result1.touchedStackItemIndex, 0); final result2 = painter.handleTouch(const Offset(88.8, 16.5), viewSize, holder); From b3529d36a045f3708d7809a8f232fa93e9e9c0ba Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Sun, 12 Nov 2023 22:58:59 +0100 Subject: [PATCH 038/149] Remove the changelog section from CONTRIBUTING. Because it is a file which changes by all the users who create a PR, so they get conflict everytime. That's why I decided to handle the CHANGELOG in another way. --- CONTRIBUTING.md | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0d279ee6b..2b3c529f6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -85,29 +85,6 @@ When you push something in your PR (after approving your PR by one of us), you s Please make sure that your code is **not decreasing** the coverage. -## Changelog -We have a file called [CHANGELOG.md](https://github.com/imaNNeo/fl_chart/blob/master/CHANGELOG.md) which contains the history of our versions. - -Please check it to understand how it works and how is the convention. Simply new versions added at the top of the CHANGELOG.md file. You can find the [first version (oldest)](https://github.com/imaNNeo/fl_chart/blob/master/CHANGELOG.md#001---released-on-2019-june-4) at the bottom of the file. - -When you are done in your PR, it's time to write a changelog for you changes. - -Most of the times, there will be a [newVersion](https://github.com/imaNNeo/fl_chart/blob/master/CHANGELOG.md#newversion) tag at the top of the `CHANGELOG.md` file in the `master` branch. If it doesn't exist, you can write it and write your change below that. - -Each change should be started with one of the following prefixes: -1. **IMPROVEMENT** (When you are improving something, for example improving performance) - -2. **BREAKING** (When it breaks something, for example renaming something to something else, or removing something, ...) - -3. **BUGFIX** (When you fix a bug or an issue) - -4. **FEATURE** (When you are adding a feature to the library, for example allowing user to change the stroke color of something, or when you add a new concept or anything else) - -In front of a prefix, you should write about your change. Don't forget to mention the related issues. - -If your change has two (or more) prefixes, describe them in separate lines independently. - - ## Creating a Pull Request Congratulations! Your code meets all of our guidelines :100:. Now you have to From f0b387d75cf48f048030f3d44a8c570f3a94edee Mon Sep 17 00:00:00 2001 From: Florian Zierer Date: Thu, 26 Oct 2023 16:10:01 +0200 Subject: [PATCH 039/149] Fix bargraph overflow - If bargraphs overflow with BarChartAlignment.start, BarChartAlignment.center or BarChartAlignment.end, use BarChartAlignment.spaceEvenly to shrink all bars to the available space - Update documentation for BarChartData.groupsSpace --- .../extensions/bar_chart_data_extension.dart | 48 ++++++++++--------- repo_files/documentations/bar_chart.md | 2 +- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/lib/src/extensions/bar_chart_data_extension.dart b/lib/src/extensions/bar_chart_data_extension.dart index f93203774..e381c6d89 100644 --- a/lib/src/extensions/bar_chart_data_extension.dart +++ b/lib/src/extensions/bar_chart_data_extension.dart @@ -4,6 +4,22 @@ extension BarChartDataExtension on BarChartData { List calculateGroupsX(double viewWidth) { assert(barGroups.isNotEmpty); final groupsX = List.filled(barGroups.length, 0); + + var sumWidth = + barGroups.map((group) => group.width).reduce((a, b) => a + b); + final spaceAvailable = viewWidth - sumWidth; + + void spaceEvenly() { + final eachSpace = spaceAvailable / (barGroups.length + 1); + var tempX = 0.0; + barGroups.asMap().forEach((i, group) { + tempX += eachSpace; + tempX += group.width / 2; + groupsX[i] = tempX; + tempX += group.width / 2; + }); + } + switch (alignment) { case BarChartAlignment.start: var tempX = 0.0; @@ -14,10 +30,11 @@ extension BarChartDataExtension on BarChartData { final groupSpace = i == barGroups.length - 1 ? 0 : groupsSpace; tempX += group.width + groupSpace; } + if (tempX > viewWidth) { + spaceEvenly(); + } case BarChartAlignment.end: - var sumWidth = - barGroups.map((group) => group.width).reduce((a, b) => a + b); sumWidth += groupsSpace * (barGroups.length - 1); final horizontalMargin = viewWidth - sumWidth; @@ -29,10 +46,11 @@ extension BarChartDataExtension on BarChartData { final groupSpace = i == barGroups.length - 1 ? 0 : groupsSpace; tempX += group.width + groupSpace; } + if (tempX > viewWidth) { + spaceEvenly(); + } case BarChartAlignment.center: - var sumWidth = - barGroups.map((group) => group.width).reduce((a, b) => a + b); sumWidth += groupsSpace * (barGroups.length - 1); final horizontalMargin = (viewWidth - sumWidth) / 2; @@ -44,11 +62,11 @@ extension BarChartDataExtension on BarChartData { final groupSpace = i == barGroups.length - 1 ? 0 : groupsSpace; tempX += group.width + groupSpace; } + if (tempX > viewWidth) { + spaceEvenly(); + } case BarChartAlignment.spaceBetween: - final sumWidth = - barGroups.map((group) => group.width).reduce((a, b) => a + b); - final spaceAvailable = viewWidth - sumWidth; final eachSpace = spaceAvailable / (barGroups.length - 1); var tempX = 0.0; @@ -62,9 +80,6 @@ extension BarChartDataExtension on BarChartData { }); case BarChartAlignment.spaceAround: - final sumWidth = - barGroups.map((group) => group.width).reduce((a, b) => a + b); - final spaceAvailable = viewWidth - sumWidth; final eachSpace = spaceAvailable / (barGroups.length * 2); var tempX = 0.0; @@ -77,18 +92,7 @@ extension BarChartDataExtension on BarChartData { }); case BarChartAlignment.spaceEvenly: - final sumWidth = - barGroups.map((group) => group.width).reduce((a, b) => a + b); - final spaceAvailable = viewWidth - sumWidth; - final eachSpace = spaceAvailable / (barGroups.length + 1); - - var tempX = 0.0; - barGroups.asMap().forEach((i, group) { - tempX += eachSpace; - tempX += group.width / 2; - groupsX[i] = tempX; - tempX += group.width / 2; - }); + spaceEvenly(); } return groupsX; diff --git a/repo_files/documentations/bar_chart.md b/repo_files/documentations/bar_chart.md index a0f9d2529..6a5dba0d9 100644 --- a/repo_files/documentations/bar_chart.md +++ b/repo_files/documentations/bar_chart.md @@ -20,7 +20,7 @@ When you change the chart's state, it animates to the new state internally (usin |PropName |Description |default value| |:---------------|:---------------|:-------| |barGroups| list of [BarChartGroupData ](#BarChartGroupData) to show the bar lines together, you can provide one item per group to show normal bar chart|[]| -|groupsSpace| space between groups, it applies only when the [alignment](#BarChartAlignment) is `Alignment.center`,|16| +|groupsSpace| space between groups, it applies only when the [alignment](#BarChartAlignment) is `Alignment.start`, `BarChartAlignment.center` or `BarChartAlignment.end` ,|16| |alignment| a [BarChartAlignment](#BarChartAlignment) that determines the alignment of the barGroups, inspired by [Flutter MainAxisAlignment](https://docs.flutter.io/flutter/rendering/MainAxisAlignment-class.html)| BarChartAlignment.spaceBetween| |titlesData| check the [FlTitlesData](base_chart.md#FlTitlesData)|FlTitlesData()| |axisTitleData| check the [FlAxisTitleData](base_chart.md#FlAxisTitleData)| FlAxisTitleData()| From 356b722073d9b25a14e66d56b9ff203f7d672b7d Mon Sep 17 00:00:00 2001 From: bobatsar Date: Thu, 26 Oct 2023 16:35:25 +0200 Subject: [PATCH 040/149] Fix documentation --- repo_files/documentations/bar_chart.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo_files/documentations/bar_chart.md b/repo_files/documentations/bar_chart.md index 6a5dba0d9..9c28a16c1 100644 --- a/repo_files/documentations/bar_chart.md +++ b/repo_files/documentations/bar_chart.md @@ -20,7 +20,7 @@ When you change the chart's state, it animates to the new state internally (usin |PropName |Description |default value| |:---------------|:---------------|:-------| |barGroups| list of [BarChartGroupData ](#BarChartGroupData) to show the bar lines together, you can provide one item per group to show normal bar chart|[]| -|groupsSpace| space between groups, it applies only when the [alignment](#BarChartAlignment) is `Alignment.start`, `BarChartAlignment.center` or `BarChartAlignment.end` ,|16| +|groupsSpace| space between groups, it applies only when the [alignment](#BarChartAlignment) is `BarChartAlignment.start`, `BarChartAlignment.center` or `BarChartAlignment.end`|16| |alignment| a [BarChartAlignment](#BarChartAlignment) that determines the alignment of the barGroups, inspired by [Flutter MainAxisAlignment](https://docs.flutter.io/flutter/rendering/MainAxisAlignment-class.html)| BarChartAlignment.spaceBetween| |titlesData| check the [FlTitlesData](base_chart.md#FlTitlesData)|FlTitlesData()| |axisTitleData| check the [FlAxisTitleData](base_chart.md#FlAxisTitleData)| FlAxisTitleData()| From 1334eb70c06962fc1c4c9e71e1d0582f5a024cc5 Mon Sep 17 00:00:00 2001 From: Florian Zierer Date: Mon, 13 Nov 2023 12:14:09 +0100 Subject: [PATCH 041/149] Add golden widget tests for bargraph overflow --- .../bar_chart_alignment_widget_test.dart | 74 ++++++++++++++++++ .../golden/BarChartAlignment.center_20.0.png | Bin 0 -> 6787 bytes .../golden/BarChartAlignment.center_4.0.png | Bin 0 -> 4756 bytes .../golden/BarChartAlignment.end_20.0.png | Bin 0 -> 6787 bytes .../golden/BarChartAlignment.end_4.0.png | Bin 0 -> 4770 bytes .../golden/BarChartAlignment.start_20.0.png | Bin 0 -> 6787 bytes .../golden/BarChartAlignment.start_4.0.png | Bin 0 -> 4759 bytes 7 files changed, 74 insertions(+) create mode 100644 test/chart/bar_chart/bar_chart_alignment_widget_test.dart create mode 100644 test/chart/bar_chart/golden/BarChartAlignment.center_20.0.png create mode 100644 test/chart/bar_chart/golden/BarChartAlignment.center_4.0.png create mode 100644 test/chart/bar_chart/golden/BarChartAlignment.end_20.0.png create mode 100644 test/chart/bar_chart/golden/BarChartAlignment.end_4.0.png create mode 100644 test/chart/bar_chart/golden/BarChartAlignment.start_20.0.png create mode 100644 test/chart/bar_chart/golden/BarChartAlignment.start_4.0.png diff --git a/test/chart/bar_chart/bar_chart_alignment_widget_test.dart b/test/chart/bar_chart/bar_chart_alignment_widget_test.dart new file mode 100644 index 000000000..42bc0b79a --- /dev/null +++ b/test/chart/bar_chart/bar_chart_alignment_widget_test.dart @@ -0,0 +1,74 @@ +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +List get barGroups => [ + BarChartGroupData(x: 0, barRods: [BarChartRodData(toY: 8)]), + BarChartGroupData(x: 1, barRods: [BarChartRodData(toY: 10)]), + BarChartGroupData(x: 2, barRods: [BarChartRodData(toY: 14)]), + BarChartGroupData(x: 3, barRods: [BarChartRodData(toY: 15)]), + BarChartGroupData(x: 4, barRods: [BarChartRodData(toY: 13)]), + BarChartGroupData(x: 5, barRods: [BarChartRodData(toY: 10)]), + BarChartGroupData(x: 6, barRods: [BarChartRodData(toY: 16)]), + BarChartGroupData(x: 7, barRods: [BarChartRodData(toY: 8)]), + BarChartGroupData(x: 8, barRods: [BarChartRodData(toY: 10)]), + BarChartGroupData(x: 9, barRods: [BarChartRodData(toY: 14)]), + BarChartGroupData(x: 10, barRods: [BarChartRodData(toY: 15)]), + BarChartGroupData(x: 11, barRods: [BarChartRodData(toY: 13)]), + BarChartGroupData(x: 12, barRods: [BarChartRodData(toY: 10)]), + BarChartGroupData(x: 13, barRods: [BarChartRodData(toY: 16)]), + BarChartGroupData(x: 14, barRods: [BarChartRodData(toY: 8)]), + BarChartGroupData(x: 15, barRods: [BarChartRodData(toY: 10)]), + BarChartGroupData(x: 16, barRods: [BarChartRodData(toY: 14)]), + BarChartGroupData(x: 17, barRods: [BarChartRodData(toY: 15)]), + BarChartGroupData(x: 18, barRods: [BarChartRodData(toY: 13)]), + BarChartGroupData(x: 19, barRods: [BarChartRodData(toY: 10)]), + BarChartGroupData(x: 20, barRods: [BarChartRodData(toY: 16)]), + ]; + +void main() { + const viewSize = Size(400, 400); + + testWidgets( + 'Barchart alignment overflow test', + (WidgetTester tester) async { + for (final groupsSpace in [4.0, 20.0]) { + for (final barChartAlignment in [ + BarChartAlignment.start, + BarChartAlignment.center, + BarChartAlignment.end, + ]) { + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: Center( + child: SizedBox( + width: viewSize.width, + height: viewSize.height, + child: BarChart( + BarChartData( + barGroups: barGroups, + gridData: const FlGridData(show: false), + alignment: barChartAlignment, + groupsSpace: groupsSpace, + maxY: 20, + ), + ), + ), + ), + ), + ), + ); + + await tester.pumpAndSettle(); + final fname = '${barChartAlignment}_$groupsSpace'; + + await expectLater( + find.byType(BarChart), + matchesGoldenFile('golden/$fname.png'), + ); + } + } + }, + ); +} diff --git a/test/chart/bar_chart/golden/BarChartAlignment.center_20.0.png b/test/chart/bar_chart/golden/BarChartAlignment.center_20.0.png new file mode 100644 index 0000000000000000000000000000000000000000..7212246afcb6c3109f1cabfed15f105de742f111 GIT binary patch literal 6787 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 literal 0 HcmV?d00001 diff --git a/test/chart/bar_chart/golden/BarChartAlignment.end_20.0.png b/test/chart/bar_chart/golden/BarChartAlignment.end_20.0.png new file mode 100644 index 0000000000000000000000000000000000000000..7212246afcb6c3109f1cabfed15f105de742f111 GIT binary patch literal 6787 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 Cr6&de literal 0 HcmV?d00001 diff --git a/test/chart/bar_chart/golden/BarChartAlignment.start_20.0.png b/test/chart/bar_chart/golden/BarChartAlignment.start_20.0.png new file mode 100644 index 0000000000000000000000000000000000000000..7212246afcb6c3109f1cabfed15f105de742f111 GIT binary patch literal 6787 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 Date: Mon, 13 Nov 2023 12:17:23 +0100 Subject: [PATCH 042/149] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf78b226c..19473ca33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ * **FEATURE** (by @Dartek12) Added gradient to [FlLine](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#FlLine), #1197 * **BUGFIX** (by @imaNNeo) Fix bar line shadow crash when we have only one (or zero) spot, #1466 * **BUGFIX** (by @imaNNeo) Fix having negative `toY` (or positive `fromY`) in BarChart's `minY` and `maxY` calculations, #1470 +* **BUGFIX** (by @bobatsar) Fix bars drawn outside of diagram ## 0.64.0 * **BUGFIX** (by @Anas35) Fix Tooltip not displaying when value from BackgroundBarChartRodData is less than zero. #1345. From cd14e6d609a7b7f35e7040f454693f2cd395cb87 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Mon, 13 Nov 2023 00:59:22 +0100 Subject: [PATCH 043/149] Open fl_chart web page only when we're on the web, otherwise open the home page of the app --- example/lib/presentation/menu/app_menu.dart | 10 +++------- example/lib/presentation/pages/home_page.dart | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/example/lib/presentation/menu/app_menu.dart b/example/lib/presentation/menu/app_menu.dart index e854f98a2..2c798116b 100644 --- a/example/lib/presentation/menu/app_menu.dart +++ b/example/lib/presentation/menu/app_menu.dart @@ -1,5 +1,4 @@ import 'package:fl_chart_app/presentation/resources/app_resources.dart'; -import 'package:fl_chart_app/urls.dart'; import 'package:fl_chart_app/util/app_helper.dart'; import 'package:flutter/material.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -11,12 +10,14 @@ class AppMenu extends StatefulWidget { final List menuItems; final int currentSelectedIndex; final Function(int, ChartMenuItem) onItemSelected; + final VoidCallback? onBannerClicked; const AppMenu({ Key? key, required this.menuItems, required this.currentSelectedIndex, required this.onItemSelected, + required this.onBannerClicked, }) : super(key: key); @override @@ -36,12 +37,7 @@ class AppMenuState extends State { aspectRatio: 3, child: Center( child: InkWell( - onTap: () async { - final url = Uri.parse(Urls.flChartUrl); - if (await canLaunchUrl(url)) { - await launchUrl(url); - } - }, + onTap: widget.onBannerClicked, child: const FlChartBanner(), ), ), diff --git a/example/lib/presentation/pages/home_page.dart b/example/lib/presentation/pages/home_page.dart index 35df81d42..2fedf73dc 100644 --- a/example/lib/presentation/pages/home_page.dart +++ b/example/lib/presentation/pages/home_page.dart @@ -1,9 +1,12 @@ import 'package:dartx/dartx.dart'; import 'package:fl_chart_app/presentation/menu/app_menu.dart'; import 'package:fl_chart_app/presentation/resources/app_resources.dart'; +import 'package:fl_chart_app/urls.dart'; import 'package:fl_chart_app/util/app_helper.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; +import 'package:url_launcher/url_launcher.dart'; import 'chart_samples_page.dart'; @@ -50,6 +53,19 @@ class HomePage extends StatelessWidget { Navigator.of(context).pop(); } }, + onBannerClicked: kIsWeb || needsDrawer ? () async { + if (kIsWeb) { + final url = Uri.parse(Urls.flChartUrl); + if (await canLaunchUrl(url)) { + await launchUrl(url); + } + return; + } + if (needsDrawer) { + Navigator.of(context).pop(); + return; + } + } : null, ); final samplesSectionWidget = ChartSamplesPage(chartType: showingChartType); From fb672b54171be36a280c0638963f15348a9a92cf Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Mon, 13 Nov 2023 01:33:00 +0100 Subject: [PATCH 044/149] Add appVersion and fl_chart version on the bottom of app menu --- example/lib/cubits/app/app_cubit.dart | 27 ++++++ example/lib/cubits/app/app_state.dart | 34 +++++++ example/lib/main.dart | 29 +++--- example/lib/presentation/menu/app_menu.dart | 93 +++++++++++++------ .../Flutter/GeneratedPluginRegistrant.swift | 2 + example/macos/Podfile.lock | 6 ++ example/pubspec.yaml | 3 + 7 files changed, 153 insertions(+), 41 deletions(-) create mode 100644 example/lib/cubits/app/app_cubit.dart create mode 100644 example/lib/cubits/app/app_state.dart diff --git a/example/lib/cubits/app/app_cubit.dart b/example/lib/cubits/app/app_cubit.dart new file mode 100644 index 000000000..317f1969b --- /dev/null +++ b/example/lib/cubits/app/app_cubit.dart @@ -0,0 +1,27 @@ +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:package_info_plus/package_info_plus.dart'; +import 'package:equatable/equatable.dart'; + +part 'app_state.dart'; + +class AppCubit extends Cubit { + AppCubit() : super(const AppState()) { + initialize(); + } + + void initialize() async { + PackageInfo packageInfo = await PackageInfo.fromPlatform(); + emit(state.copyWith( + currentPackageInfo: packageInfo, + availableVersionToUpdate: '', + usingFlChartVersion: BuildConstants.usingFlChartVersion, + )); + } +} + +class BuildConstants { + static const String usingFlChartVersion = String.fromEnvironment( + 'USING_FL_CHART_VERSION', + defaultValue: '', + ); +} diff --git a/example/lib/cubits/app/app_state.dart b/example/lib/cubits/app/app_state.dart new file mode 100644 index 000000000..374135336 --- /dev/null +++ b/example/lib/cubits/app/app_state.dart @@ -0,0 +1,34 @@ +part of 'app_cubit.dart'; + +class AppState extends Equatable { + final PackageInfo? currentPackageInfo; + final String availableVersionToUpdate; + final String usingFlChartVersion; + + String? get appVersion => currentPackageInfo?.version; + + const AppState([ + this.currentPackageInfo, + this.availableVersionToUpdate = '', + this.usingFlChartVersion = '', + ]); + + AppState copyWith({ + PackageInfo? currentPackageInfo, + String? availableVersionToUpdate, + String? usingFlChartVersion, + }) { + return AppState( + currentPackageInfo ?? this.currentPackageInfo, + availableVersionToUpdate ?? this.availableVersionToUpdate, + usingFlChartVersion ?? this.usingFlChartVersion, + ); + } + + @override + List get props => [ + currentPackageInfo, + availableVersionToUpdate, + usingFlChartVersion, + ]; +} diff --git a/example/lib/main.dart b/example/lib/main.dart index c217f30fd..a021e21bb 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -1,5 +1,7 @@ +import 'package:fl_chart_app/cubits/app/app_cubit.dart'; import 'package:fl_chart_app/presentation/resources/app_resources.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:google_fonts/google_fonts.dart'; import 'presentation/router/app_router.dart'; @@ -13,19 +15,24 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { - return MaterialApp.router( - title: AppTexts.appName, - theme: ThemeData( - brightness: Brightness.dark, - useMaterial3: true, - textTheme: GoogleFonts.assistantTextTheme( - Theme.of(context).textTheme.apply( - bodyColor: AppColors.mainTextColor3, - ), + return MultiBlocProvider( + providers: [ + BlocProvider(create: (BuildContext context) => AppCubit()), + ], + child: MaterialApp.router( + title: AppTexts.appName, + theme: ThemeData( + brightness: Brightness.dark, + useMaterial3: true, + textTheme: GoogleFonts.assistantTextTheme( + Theme.of(context).textTheme.apply( + bodyColor: AppColors.mainTextColor3, + ), + ), + scaffoldBackgroundColor: AppColors.pageBackground, ), - scaffoldBackgroundColor: AppColors.pageBackground, + routerConfig: appRouterConfig, ), - routerConfig: appRouterConfig, ); } } diff --git a/example/lib/presentation/menu/app_menu.dart b/example/lib/presentation/menu/app_menu.dart index 2c798116b..edb6bb428 100644 --- a/example/lib/presentation/menu/app_menu.dart +++ b/example/lib/presentation/menu/app_menu.dart @@ -1,6 +1,9 @@ +import 'package:dartx/dartx.dart'; +import 'package:fl_chart_app/cubits/app/app_cubit.dart'; import 'package:fl_chart_app/presentation/resources/app_resources.dart'; import 'package:fl_chart_app/util/app_helper.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:url_launcher/url_launcher.dart'; import 'fl_chart_banner.dart'; @@ -27,7 +30,6 @@ class AppMenu extends StatefulWidget { class AppMenuState extends State { @override Widget build(BuildContext context) { - const needToUpdateTheApp = 1 == 0; return Container( color: AppColors.itemsBackground, child: Column( @@ -65,40 +67,71 @@ class AppMenuState extends State { itemCount: widget.menuItems.length, ), ), - if (needToUpdateTheApp) - Container( - margin: const EdgeInsets.all(12), - child: Row( - children: [ - const Expanded( - child: Padding( - padding: EdgeInsets.all(10.0), - child: Text( - 'FL Chart v 1.00 - update to get the latest features!', - style: TextStyle( - color: Colors.white, - fontSize: 12, + const _AppVersionRow(), + ], + ), + ); + } +} + +class _AppVersionRow extends StatelessWidget { + const _AppVersionRow(); + + @override + Widget build(BuildContext context) { + return BlocBuilder(builder: (context, state) { + if (state.appVersion.isNullOrBlank) { + return Container(); + } + return Container( + margin: const EdgeInsets.all(12), + child: Row( + children: [ + Expanded( + child: Padding( + padding: const EdgeInsets.all(10.0), + child: RichText( + text: TextSpan( + text: '', + style: DefaultTextStyle.of(context).style, + children: [ + const TextSpan(text: 'App version: '), + TextSpan( + text: 'v${state.appVersion!}', + style: const TextStyle( + fontWeight: FontWeight.bold, ), ), - ), + if (state.usingFlChartVersion.isNotBlank) ...[ + const TextSpan(text: '\nfl_chart: '), + TextSpan( + text: 'v${state.usingFlChartVersion}', + style: const TextStyle( + fontWeight: FontWeight.bold, + ), + ), + ] + ], ), - TextButton( - onPressed: () {}, - child: const Text( - 'Update', - style: TextStyle( - color: AppColors.primary, - fontSize: 12, - fontWeight: FontWeight.bold, - ), - ), + ), + ), + ), + if (state.availableVersionToUpdate.isNotBlank) + TextButton( + onPressed: () {}, + child: const Text( + 'Update', + style: TextStyle( + color: AppColors.primary, + fontSize: 12, + fontWeight: FontWeight.bold, ), - ], + ), ), - ) - ], - ), - ); + ], + ), + ); + }); } } diff --git a/example/macos/Flutter/GeneratedPluginRegistrant.swift b/example/macos/Flutter/GeneratedPluginRegistrant.swift index a1cdfd0cd..92f178120 100644 --- a/example/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,10 +5,12 @@ import FlutterMacOS import Foundation +import package_info_plus import path_provider_foundation import url_launcher_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) } diff --git a/example/macos/Podfile.lock b/example/macos/Podfile.lock index d5bfe3047..36635bacc 100644 --- a/example/macos/Podfile.lock +++ b/example/macos/Podfile.lock @@ -1,5 +1,7 @@ PODS: - FlutterMacOS (1.0.0) + - package_info_plus (0.0.1): + - FlutterMacOS - path_provider_foundation (0.0.1): - Flutter - FlutterMacOS @@ -8,12 +10,15 @@ PODS: DEPENDENCIES: - FlutterMacOS (from `Flutter/ephemeral`) + - package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`) - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) EXTERNAL SOURCES: FlutterMacOS: :path: Flutter/ephemeral + package_info_plus: + :path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos path_provider_foundation: :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin url_launcher_macos: @@ -21,6 +26,7 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 + package_info_plus: 02d7a575e80f194102bef286361c6c326e4c29ce path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 url_launcher_macos: d2691c7dd33ed713bf3544850a623080ec693d95 diff --git a/example/pubspec.yaml b/example/pubspec.yaml index e8ae01818..29165d565 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -20,6 +20,9 @@ dependencies: dartx: ^1.2.0 fl_chart: path: ../ + flutter_bloc: ^8.1.3 + package_info_plus: ^4.2.0 + equatable: ^2.0.5 dev_dependencies: flutter_test: From dcb1188ae207c5ffab131cee31e9d92c47cef86a Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Mon, 13 Nov 2023 01:38:33 +0100 Subject: [PATCH 045/149] Add flutter version veriable in the gh-pages.yml --- .github/workflows/gh-pages.yml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index e059d988e..43536ae14 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -9,8 +9,16 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 # Only works with v2 - - uses: subosito/flutter-action@v2 + - uses: actions/checkout@v4 + - name: Install Flutter + uses: subosito/flutter-action@v2 + + - name: Set fl_chart Version + run: | + VERSION=$(grep "version:" fl_chart.yaml | awk '{ print $2 }') + echo "USING_FL_CHART_VERSION=$VERSION" >> $GITHUB_ENV + - uses: bluefireteam/flutter-gh-pages@v8 with: - workingDir: example \ No newline at end of file + workingDir: example + customArgs: --dart-define="USING_FL_CHART_VERSION=${{ env.USING_FL_CHART_VERSION }}" From 0aaf7ee3a6c69ca414b12d101c35716bd2bd3b47 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Mon, 13 Nov 2023 01:40:15 +0100 Subject: [PATCH 046/149] Fix format --- example/lib/presentation/pages/home_page.dart | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/example/lib/presentation/pages/home_page.dart b/example/lib/presentation/pages/home_page.dart index 2fedf73dc..33f08a1ce 100644 --- a/example/lib/presentation/pages/home_page.dart +++ b/example/lib/presentation/pages/home_page.dart @@ -53,19 +53,21 @@ class HomePage extends StatelessWidget { Navigator.of(context).pop(); } }, - onBannerClicked: kIsWeb || needsDrawer ? () async { - if (kIsWeb) { - final url = Uri.parse(Urls.flChartUrl); - if (await canLaunchUrl(url)) { - await launchUrl(url); - } - return; - } - if (needsDrawer) { - Navigator.of(context).pop(); - return; - } - } : null, + onBannerClicked: kIsWeb || needsDrawer + ? () async { + if (kIsWeb) { + final url = Uri.parse(Urls.flChartUrl); + if (await canLaunchUrl(url)) { + await launchUrl(url); + } + return; + } + if (needsDrawer) { + Navigator.of(context).pop(); + return; + } + } + : null, ); final samplesSectionWidget = ChartSamplesPage(chartType: showingChartType); From 87f04445c0b1676946264f18dc97a8bcf27c07bf Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Mon, 13 Nov 2023 16:54:51 +0100 Subject: [PATCH 047/149] Add tryToLaunchUrl function in the app_utils to have a single place to open the URLs --- example/lib/presentation/menu/app_menu.dart | 35 +++++++++++++------ example/lib/presentation/pages/home_page.dart | 7 ++-- .../presentation/widgets/chart_holder.dart | 9 ++--- example/lib/urls.dart | 2 ++ example/lib/util/app_utils.dart | 10 ++++++ 5 files changed, 40 insertions(+), 23 deletions(-) diff --git a/example/lib/presentation/menu/app_menu.dart b/example/lib/presentation/menu/app_menu.dart index edb6bb428..f4deffdf2 100644 --- a/example/lib/presentation/menu/app_menu.dart +++ b/example/lib/presentation/menu/app_menu.dart @@ -1,7 +1,9 @@ import 'package:dartx/dartx.dart'; import 'package:fl_chart_app/cubits/app/app_cubit.dart'; import 'package:fl_chart_app/presentation/resources/app_resources.dart'; +import 'package:fl_chart_app/urls.dart'; import 'package:fl_chart_app/util/app_helper.dart'; +import 'package:fl_chart_app/util/app_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -116,18 +118,29 @@ class _AppVersionRow extends StatelessWidget { ), ), ), - if (state.availableVersionToUpdate.isNotBlank) - TextButton( - onPressed: () {}, - child: const Text( - 'Update', - style: TextStyle( - color: AppColors.primary, - fontSize: 12, - fontWeight: FontWeight.bold, + state.availableVersionToUpdate.isNotBlank + ? TextButton( + onPressed: () {}, + child: Text( + 'Update to ${state.availableVersionToUpdate}', + style: const TextStyle( + color: AppColors.primary, + fontSize: 12, + fontWeight: FontWeight.bold, + ), + ), + ) + : TextButton( + onPressed: () => AppUtils().tryToLaunchUrl(Urls.aboutUrl), + child: const Text( + 'About', + style: TextStyle( + color: AppColors.primary, + fontSize: 12, + fontWeight: FontWeight.bold, + ), + ), ), - ), - ), ], ), ); diff --git a/example/lib/presentation/pages/home_page.dart b/example/lib/presentation/pages/home_page.dart index 33f08a1ce..497e098e8 100644 --- a/example/lib/presentation/pages/home_page.dart +++ b/example/lib/presentation/pages/home_page.dart @@ -3,10 +3,10 @@ import 'package:fl_chart_app/presentation/menu/app_menu.dart'; import 'package:fl_chart_app/presentation/resources/app_resources.dart'; import 'package:fl_chart_app/urls.dart'; import 'package:fl_chart_app/util/app_helper.dart'; +import 'package:fl_chart_app/util/app_utils.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import 'package:url_launcher/url_launcher.dart'; import 'chart_samples_page.dart'; @@ -56,10 +56,7 @@ class HomePage extends StatelessWidget { onBannerClicked: kIsWeb || needsDrawer ? () async { if (kIsWeb) { - final url = Uri.parse(Urls.flChartUrl); - if (await canLaunchUrl(url)) { - await launchUrl(url); - } + await AppUtils().tryToLaunchUrl(Urls.flChartUrl); return; } if (needsDrawer) { diff --git a/example/lib/presentation/widgets/chart_holder.dart b/example/lib/presentation/widgets/chart_holder.dart index 2ea13ece4..3428d0838 100644 --- a/example/lib/presentation/widgets/chart_holder.dart +++ b/example/lib/presentation/widgets/chart_holder.dart @@ -1,7 +1,7 @@ import 'package:fl_chart_app/presentation/resources/app_resources.dart'; import 'package:fl_chart_app/presentation/samples/chart_sample.dart'; +import 'package:fl_chart_app/util/app_utils.dart'; import 'package:flutter/material.dart'; -import 'package:url_launcher/url_launcher.dart'; class ChartHolder extends StatelessWidget { final ChartSample chartSample; @@ -30,12 +30,7 @@ class ChartHolder extends StatelessWidget { ), Expanded(child: Container()), IconButton( - onPressed: () async { - final url = Uri.parse(chartSample.url); - if (await canLaunchUrl(url)) { - await launchUrl(url); - } - }, + onPressed: () => AppUtils().tryToLaunchUrl(chartSample.url), icon: const Icon( Icons.code, color: AppColors.primary, diff --git a/example/lib/urls.dart b/example/lib/urls.dart index d1b9fb160..83cb6d95b 100644 --- a/example/lib/urls.dart +++ b/example/lib/urls.dart @@ -11,4 +11,6 @@ class Urls { final chartDir = chartType.name.toLowerCase(); return 'https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/${chartDir}_chart.md'; } + + static String get aboutUrl => '$flChartUrl/about'; } diff --git a/example/lib/util/app_utils.dart b/example/lib/util/app_utils.dart index efb5cfa2a..51e209503 100644 --- a/example/lib/util/app_utils.dart +++ b/example/lib/util/app_utils.dart @@ -1,5 +1,7 @@ import 'dart:math' as math; +import 'package:url_launcher/url_launcher.dart'; + class AppUtils { factory AppUtils() { return _singleton; @@ -15,4 +17,12 @@ class AppUtils { double radianToDegree(double radian) { return radian * 180 / math.pi; } + + Future tryToLaunchUrl(String url) async { + final uri = Uri.parse(url); + if (await canLaunchUrl(uri)) { + return await launchUrl(uri); + } + return false; + } } From 0ae88cff737e226a837316b8547b33163552cfd0 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Tue, 21 Nov 2023 02:34:21 +0100 Subject: [PATCH 048/149] Remove flaky golden tests, I need to learn more about them later --- .../bar_chart_alignment_widget_test.dart | 74 ------------------ .../golden/BarChartAlignment.center_20.0.png | Bin 6787 -> 0 bytes .../golden/BarChartAlignment.center_4.0.png | Bin 4756 -> 0 bytes .../golden/BarChartAlignment.end_20.0.png | Bin 6787 -> 0 bytes .../golden/BarChartAlignment.end_4.0.png | Bin 4770 -> 0 bytes .../golden/BarChartAlignment.start_20.0.png | Bin 6787 -> 0 bytes .../golden/BarChartAlignment.start_4.0.png | Bin 4759 -> 0 bytes 7 files changed, 74 deletions(-) delete mode 100644 test/chart/bar_chart/bar_chart_alignment_widget_test.dart delete mode 100644 test/chart/bar_chart/golden/BarChartAlignment.center_20.0.png delete mode 100644 test/chart/bar_chart/golden/BarChartAlignment.center_4.0.png delete mode 100644 test/chart/bar_chart/golden/BarChartAlignment.end_20.0.png delete mode 100644 test/chart/bar_chart/golden/BarChartAlignment.end_4.0.png delete mode 100644 test/chart/bar_chart/golden/BarChartAlignment.start_20.0.png delete mode 100644 test/chart/bar_chart/golden/BarChartAlignment.start_4.0.png diff --git a/test/chart/bar_chart/bar_chart_alignment_widget_test.dart b/test/chart/bar_chart/bar_chart_alignment_widget_test.dart deleted file mode 100644 index 42bc0b79a..000000000 --- a/test/chart/bar_chart/bar_chart_alignment_widget_test.dart +++ /dev/null @@ -1,74 +0,0 @@ -import 'package:fl_chart/fl_chart.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -List get barGroups => [ - BarChartGroupData(x: 0, barRods: [BarChartRodData(toY: 8)]), - BarChartGroupData(x: 1, barRods: [BarChartRodData(toY: 10)]), - BarChartGroupData(x: 2, barRods: [BarChartRodData(toY: 14)]), - BarChartGroupData(x: 3, barRods: [BarChartRodData(toY: 15)]), - BarChartGroupData(x: 4, barRods: [BarChartRodData(toY: 13)]), - BarChartGroupData(x: 5, barRods: [BarChartRodData(toY: 10)]), - BarChartGroupData(x: 6, barRods: [BarChartRodData(toY: 16)]), - BarChartGroupData(x: 7, barRods: [BarChartRodData(toY: 8)]), - BarChartGroupData(x: 8, barRods: [BarChartRodData(toY: 10)]), - BarChartGroupData(x: 9, barRods: [BarChartRodData(toY: 14)]), - BarChartGroupData(x: 10, barRods: [BarChartRodData(toY: 15)]), - BarChartGroupData(x: 11, barRods: [BarChartRodData(toY: 13)]), - BarChartGroupData(x: 12, barRods: [BarChartRodData(toY: 10)]), - BarChartGroupData(x: 13, barRods: [BarChartRodData(toY: 16)]), - BarChartGroupData(x: 14, barRods: [BarChartRodData(toY: 8)]), - BarChartGroupData(x: 15, barRods: [BarChartRodData(toY: 10)]), - BarChartGroupData(x: 16, barRods: [BarChartRodData(toY: 14)]), - BarChartGroupData(x: 17, barRods: [BarChartRodData(toY: 15)]), - BarChartGroupData(x: 18, barRods: [BarChartRodData(toY: 13)]), - BarChartGroupData(x: 19, barRods: [BarChartRodData(toY: 10)]), - BarChartGroupData(x: 20, barRods: [BarChartRodData(toY: 16)]), - ]; - -void main() { - const viewSize = Size(400, 400); - - testWidgets( - 'Barchart alignment overflow test', - (WidgetTester tester) async { - for (final groupsSpace in [4.0, 20.0]) { - for (final barChartAlignment in [ - BarChartAlignment.start, - BarChartAlignment.center, - BarChartAlignment.end, - ]) { - await tester.pumpWidget( - MaterialApp( - home: Scaffold( - body: Center( - child: SizedBox( - width: viewSize.width, - height: viewSize.height, - child: BarChart( - BarChartData( - barGroups: barGroups, - gridData: const FlGridData(show: false), - alignment: barChartAlignment, - groupsSpace: groupsSpace, - maxY: 20, - ), - ), - ), - ), - ), - ), - ); - - await tester.pumpAndSettle(); - final fname = '${barChartAlignment}_$groupsSpace'; - - await expectLater( - find.byType(BarChart), - matchesGoldenFile('golden/$fname.png'), - ); - } - } - }, - ); -} diff --git a/test/chart/bar_chart/golden/BarChartAlignment.center_20.0.png b/test/chart/bar_chart/golden/BarChartAlignment.center_20.0.png deleted file mode 100644 index 7212246afcb6c3109f1cabfed15f105de742f111..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6787 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 diff --git a/test/chart/bar_chart/golden/BarChartAlignment.end_20.0.png b/test/chart/bar_chart/golden/BarChartAlignment.end_20.0.png deleted file mode 100644 index 7212246afcb6c3109f1cabfed15f105de742f111..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6787 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 Cr6&de diff --git a/test/chart/bar_chart/golden/BarChartAlignment.start_20.0.png b/test/chart/bar_chart/golden/BarChartAlignment.start_20.0.png deleted file mode 100644 index 7212246afcb6c3109f1cabfed15f105de742f111..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6787 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 Date: Tue, 21 Nov 2023 02:38:37 +0100 Subject: [PATCH 049/149] Use TextScaler textScaler insted of double textScale to get rid of the deprecation warning --- .../chart/bar_chart/bar_chart_painter.dart | 2 +- .../chart/bar_chart/bar_chart_renderer.dart | 23 ++- .../base/base_chart/base_chart_painter.dart | 6 +- .../chart/line_chart/line_chart_painter.dart | 2 +- .../chart/line_chart/line_chart_renderer.dart | 23 ++- .../chart/pie_chart/pie_chart_painter.dart | 2 +- .../chart/pie_chart/pie_chart_renderer.dart | 23 ++- .../radar_chart/radar_chart_painter.dart | 2 +- .../radar_chart/radar_chart_renderer.dart | 23 ++- .../scatter_chart/scatter_chart_painter.dart | 4 +- .../scatter_chart/scatter_chart_renderer.dart | 23 ++- .../bar_chart/bar_chart_painter_test.dart | 51 ++++-- .../bar_chart/bar_chart_renderer_test.dart | 16 +- .../line_chart/line_chart_painter_test.dart | 171 ++++++++++++------ .../line_chart/line_chart_renderer_test.dart | 16 +- .../pie_chart/pie_chart_painter_test.dart | 25 ++- .../pie_chart/pie_chart_renderer_test.dart | 16 +- .../radar_chart/radar_chart_painter_test.dart | 36 ++-- .../radar_chart_renderer_test.dart | 16 +- .../scatter_chart_painter_test.dart | 66 +++++-- .../scatter_chart_renderer_test.dart | 16 +- 21 files changed, 349 insertions(+), 213 deletions(-) diff --git a/lib/src/chart/bar_chart/bar_chart_painter.dart b/lib/src/chart/bar_chart/bar_chart_painter.dart index 407c0fb46..ab99f7cbd 100644 --- a/lib/src/chart/bar_chart/bar_chart_painter.dart +++ b/lib/src/chart/bar_chart/bar_chart_painter.dart @@ -358,7 +358,7 @@ class BarChartPainter extends AxisChartPainter { text: span, textAlign: tooltipItem.textAlign, textDirection: tooltipItem.textDirection, - textScaleFactor: holder.textScale, + textScaler: holder.textScaler, )..layout(maxWidth: tooltipData.maxContentWidth); /// creating TextPainters to calculate the width and height of the tooltip diff --git a/lib/src/chart/bar_chart/bar_chart_renderer.dart b/lib/src/chart/bar_chart/bar_chart_renderer.dart index 41bdb957c..fca83a4d5 100644 --- a/lib/src/chart/bar_chart/bar_chart_renderer.dart +++ b/lib/src/chart/bar_chart/bar_chart_renderer.dart @@ -19,7 +19,7 @@ class BarChartLeaf extends LeafRenderObjectWidget { context, data, targetData, - MediaQuery.of(context).textScaleFactor, + MediaQuery.of(context).textScaler, ); @override @@ -27,7 +27,7 @@ class BarChartLeaf extends LeafRenderObjectWidget { renderObject ..data = data ..targetData = targetData - ..textScale = MediaQuery.of(context).textScaleFactor + ..textScaler = MediaQuery.of(context).textScaler ..buildContext = context; } } @@ -39,10 +39,10 @@ class RenderBarChart extends RenderBaseChart { BuildContext context, BarChartData data, BarChartData targetData, - double textScale, + TextScaler textScaler, ) : _data = data, _targetData = targetData, - _textScale = textScale, + _textScaler = textScaler, super(targetData.barTouchData, context); BarChartData get data => _data; @@ -64,12 +64,12 @@ class RenderBarChart extends RenderBaseChart { markNeedsPaint(); } - double get textScale => _textScale; - double _textScale; + TextScaler get textScaler => _textScaler; + TextScaler _textScaler; - set textScale(double value) { - if (_textScale == value) return; - _textScale = value; + set textScaler(TextScaler value) { + if (_textScaler == value) return; + _textScaler = value; markNeedsPaint(); } @@ -80,9 +80,8 @@ class RenderBarChart extends RenderBaseChart { @visibleForTesting BarChartPainter painter = BarChartPainter(); - PaintHolder get paintHolder { - return PaintHolder(data, targetData, textScale); - } + PaintHolder get paintHolder => + PaintHolder(data, targetData, textScaler); @override void paint(PaintingContext context, Offset offset) { diff --git a/lib/src/chart/base/base_chart/base_chart_painter.dart b/lib/src/chart/base/base_chart/base_chart_painter.dart index d613d2e1a..3e3d1ee95 100644 --- a/lib/src/chart/base/base_chart/base_chart_painter.dart +++ b/lib/src/chart/base/base_chart/base_chart_painter.dart @@ -19,7 +19,7 @@ class BaseChartPainter { /// Holds data for painting on canvas class PaintHolder { /// Holds data for painting on canvas - const PaintHolder(this.data, this.targetData, this.textScale); + const PaintHolder(this.data, this.targetData, this.textScaler); /// [data] is what we need to show frame by frame (it might be changed by an animator) final Data data; @@ -27,6 +27,6 @@ class PaintHolder { /// [targetData] is the target of animation that is playing. final Data targetData; - /// system [textScale] - final double textScale; + /// system [TextScaler] used for scaling texts for better readability + final TextScaler textScaler; } diff --git a/lib/src/chart/line_chart/line_chart_painter.dart b/lib/src/chart/line_chart/line_chart_painter.dart index a1aea66de..8623e56b4 100644 --- a/lib/src/chart/line_chart/line_chart_painter.dart +++ b/lib/src/chart/line_chart/line_chart_painter.dart @@ -1012,7 +1012,7 @@ class LineChartPainter extends AxisChartPainter { text: span, textAlign: tooltipItem.textAlign, textDirection: tooltipItem.textDirection, - textScaleFactor: holder.textScale, + textScaler: holder.textScaler, )..layout(maxWidth: tooltipData.maxContentWidth); drawingTextPainters.add(tp); } diff --git a/lib/src/chart/line_chart/line_chart_renderer.dart b/lib/src/chart/line_chart/line_chart_renderer.dart index dfae057dd..9d57d6048 100644 --- a/lib/src/chart/line_chart/line_chart_renderer.dart +++ b/lib/src/chart/line_chart/line_chart_renderer.dart @@ -24,7 +24,7 @@ class LineChartLeaf extends LeafRenderObjectWidget { context, data, targetData, - MediaQuery.of(context).textScaleFactor, + MediaQuery.of(context).textScaler, ); @override @@ -32,7 +32,7 @@ class LineChartLeaf extends LeafRenderObjectWidget { renderObject ..data = data ..targetData = targetData - ..textScale = MediaQuery.of(context).textScaleFactor + ..textScaler = MediaQuery.of(context).textScaler ..buildContext = context; } } @@ -44,10 +44,10 @@ class RenderLineChart extends RenderBaseChart { BuildContext context, LineChartData data, LineChartData targetData, - double textScale, + TextScaler textScaler, ) : _data = data, _targetData = targetData, - _textScale = textScale, + _textScaler = textScaler, super( targetData.lineTouchData, context, @@ -70,11 +70,11 @@ class RenderLineChart extends RenderBaseChart { markNeedsPaint(); } - double get textScale => _textScale; - double _textScale; - set textScale(double value) { - if (_textScale == value) return; - _textScale = value; + TextScaler get textScaler => _textScaler; + TextScaler _textScaler; + set textScaler(TextScaler value) { + if (_textScaler == value) return; + _textScaler = value; markNeedsPaint(); } @@ -85,9 +85,8 @@ class RenderLineChart extends RenderBaseChart { @visibleForTesting LineChartPainter painter = LineChartPainter(); - PaintHolder get paintHolder { - return PaintHolder(data, targetData, textScale); - } + PaintHolder get paintHolder => + PaintHolder(data, targetData, textScaler); @override void paint(PaintingContext context, Offset offset) { diff --git a/lib/src/chart/pie_chart/pie_chart_painter.dart b/lib/src/chart/pie_chart/pie_chart_painter.dart index 4922eb676..8f73cdced 100644 --- a/lib/src/chart/pie_chart/pie_chart_painter.dart +++ b/lib/src/chart/pie_chart/pie_chart_painter.dart @@ -354,7 +354,7 @@ class PieChartPainter extends BaseChartPainter { text: span, textAlign: TextAlign.center, textDirection: TextDirection.ltr, - textScaleFactor: holder.textScale, + textScaler: holder.textScaler, )..layout(); canvasWrapper.drawText( diff --git a/lib/src/chart/pie_chart/pie_chart_renderer.dart b/lib/src/chart/pie_chart/pie_chart_renderer.dart index 52ba7f8a4..ef001a477 100644 --- a/lib/src/chart/pie_chart/pie_chart_renderer.dart +++ b/lib/src/chart/pie_chart/pie_chart_renderer.dart @@ -26,7 +26,7 @@ class PieChartLeaf extends MultiChildRenderObjectWidget { context, data, targetData, - MediaQuery.of(context).textScaleFactor, + MediaQuery.of(context).textScaler, ); @override @@ -34,7 +34,7 @@ class PieChartLeaf extends MultiChildRenderObjectWidget { renderObject ..data = data ..targetData = targetData - ..textScale = MediaQuery.of(context).textScaleFactor + ..textScaler = MediaQuery.of(context).textScaler ..buildContext = context; } } @@ -50,10 +50,10 @@ class RenderPieChart extends RenderBaseChart BuildContext context, PieChartData data, PieChartData targetData, - double textScale, + TextScaler textScaler, ) : _data = data, _targetData = targetData, - _textScale = textScale, + _textScaler = textScaler, super(targetData.pieTouchData, context); PieChartData get data => _data; @@ -77,12 +77,12 @@ class RenderPieChart extends RenderBaseChart markNeedsLayout(); } - double get textScale => _textScale; - double _textScale; + TextScaler get textScaler => _textScaler; + TextScaler _textScaler; - set textScale(double value) { - if (_textScale == value) return; - _textScale = value; + set textScaler(TextScaler value) { + if (_textScaler == value) return; + _textScaler = value; markNeedsPaint(); } @@ -93,9 +93,8 @@ class RenderPieChart extends RenderBaseChart @visibleForTesting PieChartPainter painter = PieChartPainter(); - PaintHolder get paintHolder { - return PaintHolder(data, targetData, textScale); - } + PaintHolder get paintHolder => + PaintHolder(data, targetData, textScaler); @override void setupParentData(RenderBox child) { diff --git a/lib/src/chart/radar_chart/radar_chart_painter.dart b/lib/src/chart/radar_chart/radar_chart_painter.dart index ab09ebc3e..3c2e5ac9e 100644 --- a/lib/src/chart/radar_chart/radar_chart_painter.dart +++ b/lib/src/chart/radar_chart/radar_chart_painter.dart @@ -276,7 +276,7 @@ class RadarChartPainter extends BaseChartPainter { _titleTextPaint ..textAlign = TextAlign.center ..textDirection = TextDirection.ltr - ..textScaleFactor = holder.textScale; + ..textScaler = holder.textScaler; for (var index = 0; index < data.titleCount; index++) { final baseTitleAngle = Utils().degrees(diffAngle * index); diff --git a/lib/src/chart/radar_chart/radar_chart_renderer.dart b/lib/src/chart/radar_chart/radar_chart_renderer.dart index c89d7f30a..d05d8094e 100644 --- a/lib/src/chart/radar_chart/radar_chart_renderer.dart +++ b/lib/src/chart/radar_chart/radar_chart_renderer.dart @@ -23,7 +23,7 @@ class RadarChartLeaf extends LeafRenderObjectWidget { context, data, targetData, - MediaQuery.of(context).textScaleFactor, + MediaQuery.of(context).textScaler, ); @override @@ -31,7 +31,7 @@ class RadarChartLeaf extends LeafRenderObjectWidget { renderObject ..data = data ..targetData = targetData - ..textScale = MediaQuery.of(context).textScaleFactor + ..textScaler = MediaQuery.of(context).textScaler ..buildContext = context; } } @@ -43,10 +43,10 @@ class RenderRadarChart extends RenderBaseChart { BuildContext context, RadarChartData data, RadarChartData targetData, - double textScale, + TextScaler textScaler, ) : _data = data, _targetData = targetData, - _textScale = textScale, + _textScaler = textScaler, super(targetData.radarTouchData, context); RadarChartData get data => _data; @@ -68,12 +68,12 @@ class RenderRadarChart extends RenderBaseChart { markNeedsPaint(); } - double get textScale => _textScale; - double _textScale; + TextScaler get textScaler => _textScaler; + TextScaler _textScaler; - set textScale(double value) { - if (_textScale == value) return; - _textScale = value; + set textScaler(TextScaler value) { + if (_textScaler == value) return; + _textScaler = value; markNeedsPaint(); } @@ -84,9 +84,8 @@ class RenderRadarChart extends RenderBaseChart { @visibleForTesting RadarChartPainter painter = RadarChartPainter(); - PaintHolder get paintHolder { - return PaintHolder(data, targetData, textScale); - } + PaintHolder get paintHolder => + PaintHolder(data, targetData, textScaler); @override void paint(PaintingContext context, Offset offset) { diff --git a/lib/src/chart/scatter_chart/scatter_chart_painter.dart b/lib/src/chart/scatter_chart/scatter_chart_painter.dart index 5d24fe4b2..773ceea7a 100644 --- a/lib/src/chart/scatter_chart/scatter_chart_painter.dart +++ b/lib/src/chart/scatter_chart/scatter_chart_painter.dart @@ -138,7 +138,7 @@ class ScatterChartPainter extends AxisChartPainter { text: span, textAlign: TextAlign.center, textDirection: holder.data.scatterLabelSettings.textDirection, - textScaleFactor: holder.textScale, + textScaler: holder.textScaler, )..layout(maxWidth: viewSize.width); final pixelX = getPixelX(scatterSpot.x, viewSize, holder); @@ -233,7 +233,7 @@ class ScatterChartPainter extends AxisChartPainter { text: span, textAlign: tooltipItem.textAlign, textDirection: tooltipItem.textDirection, - textScaleFactor: holder.textScale, + textScaler: holder.textScaler, )..layout(maxWidth: tooltipData.maxContentWidth); final width = drawingTextPainter.width; diff --git a/lib/src/chart/scatter_chart/scatter_chart_renderer.dart b/lib/src/chart/scatter_chart/scatter_chart_renderer.dart index 6ff2d760c..e4a925743 100644 --- a/lib/src/chart/scatter_chart/scatter_chart_renderer.dart +++ b/lib/src/chart/scatter_chart/scatter_chart_renderer.dart @@ -24,7 +24,7 @@ class ScatterChartLeaf extends LeafRenderObjectWidget { context, data, targetData, - MediaQuery.of(context).textScaleFactor, + MediaQuery.of(context).textScaler, ); @override @@ -35,7 +35,7 @@ class ScatterChartLeaf extends LeafRenderObjectWidget { renderObject ..data = data ..targetData = targetData - ..textScale = MediaQuery.of(context).textScaleFactor + ..textScaler = MediaQuery.of(context).textScaler ..buildContext = context; } } @@ -47,10 +47,10 @@ class RenderScatterChart extends RenderBaseChart { BuildContext context, ScatterChartData data, ScatterChartData targetData, - double textScale, + TextScaler textScaler, ) : _data = data, _targetData = targetData, - _textScale = textScale, + _textScaler = textScaler, super(targetData.scatterTouchData, context); ScatterChartData get data => _data; @@ -72,12 +72,12 @@ class RenderScatterChart extends RenderBaseChart { markNeedsPaint(); } - double get textScale => _textScale; - double _textScale; + TextScaler get textScaler => _textScaler; + TextScaler _textScaler; - set textScale(double value) { - if (_textScale == value) return; - _textScale = value; + set textScaler(TextScaler value) { + if (_textScaler == value) return; + _textScaler = value; markNeedsPaint(); } @@ -88,9 +88,8 @@ class RenderScatterChart extends RenderBaseChart { @visibleForTesting ScatterChartPainter painter = ScatterChartPainter(); - PaintHolder get paintHolder { - return PaintHolder(data, targetData, textScale); - } + PaintHolder get paintHolder => + PaintHolder(data, targetData, textScaler); @override void paint(PaintingContext context, Offset offset) { diff --git a/test/chart/bar_chart/bar_chart_painter_test.dart b/test/chart/bar_chart/bar_chart_painter_test.dart index d73c0344e..44877dbe5 100644 --- a/test/chart/bar_chart/bar_chart_painter_test.dart +++ b/test/chart/bar_chart/bar_chart_painter_test.dart @@ -44,7 +44,8 @@ void main() { ); final barChartPainter = BarChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockUtils = MockUtils(); Utils.changeInstance(mockUtils); @@ -346,7 +347,8 @@ void main() { ); final barChartPainter = BarChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); @@ -606,7 +608,8 @@ void main() { ); final barChartPainter = BarChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); @@ -754,7 +757,8 @@ void main() { final data = BarChartData(barGroups: barGroups); final barChartPainter = BarChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); @@ -887,7 +891,8 @@ void main() { ); final barChartPainter = BarChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); @@ -1082,7 +1087,8 @@ void main() { ); final barChartPainter = BarChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); @@ -1251,7 +1257,8 @@ void main() { ); final barChartPainter = BarChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); @@ -1374,7 +1381,8 @@ void main() { ); final barChartPainter = BarChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); @@ -1552,7 +1560,8 @@ void main() { ); final painter = BarChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); expect(painter.handleTouch(const Offset(10, 10), viewSize, holder), null); expect( @@ -1650,7 +1659,8 @@ void main() { ); final painter = BarChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); expect( painter.handleTouch(const Offset(134, 48.6), viewSize, holder), @@ -1735,7 +1745,8 @@ void main() { ); final painter = BarChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final result1 = painter.handleTouch(const Offset(4, 60), viewSize, holder); @@ -1790,7 +1801,8 @@ void main() { ); final barChartPainter = BarChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockBuildContext = MockBuildContext(); final mockCanvasWrapper = MockCanvasWrapper(); @@ -1840,7 +1852,8 @@ void main() { ); final barChartPainter = BarChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockBuildContext = MockBuildContext(); final mockCanvasWrapper = MockCanvasWrapper(); @@ -1893,7 +1906,8 @@ void main() { ); final barChartPainter = BarChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockUtils = MockUtils(); Utils.changeInstance(mockUtils); @@ -1989,7 +2003,8 @@ void main() { ); final barChartPainter = BarChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockUtils = MockUtils(); Utils.changeInstance(mockUtils); @@ -2080,7 +2095,8 @@ void main() { ); final barChartPainter = BarChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockUtils = MockUtils(); Utils.changeInstance(mockUtils); @@ -2178,7 +2194,8 @@ void main() { ); final barChartPainter = BarChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); diff --git a/test/chart/bar_chart/bar_chart_renderer_test.dart b/test/chart/bar_chart/bar_chart_renderer_test.dart index ce1055df8..f36210c48 100644 --- a/test/chart/bar_chart/bar_chart_renderer_test.dart +++ b/test/chart/bar_chart/bar_chart_renderer_test.dart @@ -40,14 +40,14 @@ void main() { ), ); - const textScale = 4.0; + const textScaler = TextScaler.linear(4); final mockBuildContext = MockBuildContext(); final renderBarChart = RenderBarChart( mockBuildContext, data, targetData, - textScale, + textScaler, ); final mockPainter = MockBarChartPainter(); @@ -63,10 +63,10 @@ void main() { expect(renderBarChart.data == data, true); expect(renderBarChart.data == targetData, false); expect(renderBarChart.targetData == targetData, true); - expect(renderBarChart.textScale == textScale, true); + expect(renderBarChart.textScaler == textScaler, true); expect(renderBarChart.paintHolder.data == data, true); expect(renderBarChart.paintHolder.targetData == targetData, true); - expect(renderBarChart.paintHolder.textScale == textScale, true); + expect(renderBarChart.paintHolder.textScaler == textScaler, true); }); test('test 2 check paint function', () { @@ -83,7 +83,7 @@ void main() { final paintHolder = result.captured[1] as PaintHolder; expect(paintHolder.data, data); expect(paintHolder.targetData, targetData); - expect(paintHolder.textScale, textScale); + expect(paintHolder.textScaler, textScaler); verify(mockCanvas.restore()).called(1); }); @@ -107,18 +107,18 @@ void main() { final paintHolder = results[0]['paint_holder'] as PaintHolder; expect(paintHolder.data, data); expect(paintHolder.targetData, targetData); - expect(paintHolder.textScale, textScale); + expect(paintHolder.textScaler, textScaler); }); test('test 4 check setters', () { renderBarChart ..data = targetData ..targetData = data - ..textScale = 22; + ..textScaler = const TextScaler.linear(22); expect(renderBarChart.data, targetData); expect(renderBarChart.targetData, data); - expect(renderBarChart.textScale, 22); + expect(renderBarChart.textScaler, const TextScaler.linear(22)); }); }); } diff --git a/test/chart/line_chart/line_chart_painter_test.dart b/test/chart/line_chart/line_chart_painter_test.dart index c702c6431..e9477e822 100644 --- a/test/chart/line_chart/line_chart_painter_test.dart +++ b/test/chart/line_chart/line_chart_painter_test.dart @@ -86,7 +86,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockUtils = MockUtils(); Utils.changeInstance(mockUtils); @@ -177,7 +178,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockUtils = MockUtils(); Utils.changeInstance(mockUtils); @@ -218,7 +220,8 @@ void main() { final data = LineChartData(); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -264,7 +267,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -313,7 +317,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -348,7 +353,8 @@ void main() { final data = LineChartData(lineBarsData: [barData]); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -378,7 +384,8 @@ void main() { final data = LineChartData(lineBarsData: [barData]); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -409,7 +416,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -470,7 +478,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -507,7 +516,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -536,7 +546,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -571,7 +582,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -611,7 +623,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -700,7 +713,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -745,7 +759,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -814,7 +829,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -878,7 +894,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -933,7 +950,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -989,7 +1007,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -1046,7 +1065,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -1105,7 +1125,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -1158,7 +1179,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -1209,7 +1231,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -1265,7 +1288,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -1339,7 +1363,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -1445,7 +1470,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -1519,7 +1545,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -1642,7 +1669,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -1787,7 +1815,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -1837,7 +1866,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -1894,7 +1924,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -1937,7 +1968,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -1965,7 +1997,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -2011,7 +2044,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -2091,7 +2125,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -2145,7 +2180,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -2211,7 +2247,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -2284,7 +2321,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -2394,7 +2432,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -2504,7 +2543,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -2596,7 +2636,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final result = lineChartPainter.getBarLineXLength( barData, viewSize, @@ -2660,7 +2701,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final touchResponse = lineChartPainter.handleTouch(const Offset(35, 0), viewSize, holder); expect(touchResponse, null); @@ -2717,7 +2759,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); expect( lineChartPainter .handleTouch(const Offset(30, 0), viewSize, holder)! @@ -2791,7 +2834,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final result1 = lineChartPainter.handleTouch(const Offset(11, 0), viewSize, holder)!; @@ -2859,7 +2903,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final touchResponse = lineChartPainter.getNearestTouchedSpot( viewSize, const Offset(35, 0), @@ -2930,7 +2975,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); expect( lineChartPainter.getNearestTouchedSpot( viewSize, @@ -3049,7 +3095,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); expect( lineChartPainter.getNearestTouchedSpot( viewSize, @@ -3120,7 +3167,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -3168,7 +3216,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -3247,7 +3296,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -3303,7 +3353,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -3334,7 +3385,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -3356,7 +3408,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -3386,7 +3439,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -3413,7 +3467,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -3455,7 +3510,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); @@ -3501,7 +3557,8 @@ void main() { ); final lineChartPainter = LineChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); diff --git a/test/chart/line_chart/line_chart_renderer_test.dart b/test/chart/line_chart/line_chart_renderer_test.dart index 10463b558..dde9635ea 100644 --- a/test/chart/line_chart/line_chart_renderer_test.dart +++ b/test/chart/line_chart/line_chart_renderer_test.dart @@ -40,14 +40,14 @@ void main() { ), ); - const textScale = 4.0; + const textScaler = TextScaler.linear(4); final mockBuildContext = MockBuildContext(); final renderLineChart = RenderLineChart( mockBuildContext, data, targetData, - textScale, + textScaler, ); final mockPainter = MockLineChartPainter(); @@ -63,10 +63,10 @@ void main() { expect(renderLineChart.data == data, true); expect(renderLineChart.data == targetData, false); expect(renderLineChart.targetData == targetData, true); - expect(renderLineChart.textScale == textScale, true); + expect(renderLineChart.textScaler == textScaler, true); expect(renderLineChart.paintHolder.data == data, true); expect(renderLineChart.paintHolder.targetData == targetData, true); - expect(renderLineChart.paintHolder.textScale == textScale, true); + expect(renderLineChart.paintHolder.textScaler == textScaler, true); }); test('test 2 check paint function', () { @@ -83,7 +83,7 @@ void main() { final paintHolder = result.captured[1] as PaintHolder; expect(paintHolder.data, data); expect(paintHolder.targetData, targetData); - expect(paintHolder.textScale, textScale); + expect(paintHolder.textScaler, textScaler); verify(mockCanvas.restore()).called(1); }); @@ -110,18 +110,18 @@ void main() { final paintHolder = results[0]['paint_holder'] as PaintHolder; expect(paintHolder.data, data); expect(paintHolder.targetData, targetData); - expect(paintHolder.textScale, textScale); + expect(paintHolder.textScaler, textScaler); }); test('test 4 check setters', () { renderLineChart ..data = targetData ..targetData = data - ..textScale = 22; + ..textScaler = const TextScaler.linear(22); expect(renderLineChart.data, targetData); expect(renderLineChart.targetData, data); - expect(renderLineChart.textScale, 22); + expect(renderLineChart.textScaler, const TextScaler.linear(22)); }); }); } diff --git a/test/chart/pie_chart/pie_chart_painter_test.dart b/test/chart/pie_chart/pie_chart_painter_test.dart index fcfaf8286..b92cdf6d8 100644 --- a/test/chart/pie_chart/pie_chart_painter_test.dart +++ b/test/chart/pie_chart/pie_chart_painter_test.dart @@ -36,7 +36,8 @@ void main() { ); final pieChartPainter = PieChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockUtils = MockUtils(); Utils.changeInstance(mockUtils); @@ -96,7 +97,8 @@ void main() { ); final barChartPainter = PieChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); @@ -131,7 +133,8 @@ void main() { ); final barChartPainter = PieChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); @@ -190,7 +193,8 @@ void main() { ); final barChartPainter = PieChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); @@ -835,14 +839,14 @@ void main() { final data1 = PieChartData(sections: sections, centerSpaceRadius: 15); final result1 = barChartPainter.calculateCenterRadius( viewSize, - PaintHolder(data1, data1, 1), + PaintHolder(data1, data1, TextScaler.noScaling), ); expect(result1, 15); final data2 = PieChartData(sections: sections); final result2 = barChartPainter.calculateCenterRadius( viewSize, - PaintHolder(data2, data2, 1), + PaintHolder(data2, data2, TextScaler.noScaling), ); expect(result2, 56); }); @@ -882,7 +886,8 @@ void main() { ], ); final barChartPainter = PieChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); expect( barChartPainter @@ -1137,7 +1142,11 @@ void main() { ], ); final barChartPainter = PieChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = PaintHolder( + data, + data, + TextScaler.noScaling, + ); final result = barChartPainter.getBadgeOffsets(viewSize, holder); expect( diff --git a/test/chart/pie_chart/pie_chart_renderer_test.dart b/test/chart/pie_chart/pie_chart_renderer_test.dart index 26f2ac818..51c696e08 100644 --- a/test/chart/pie_chart/pie_chart_renderer_test.dart +++ b/test/chart/pie_chart/pie_chart_renderer_test.dart @@ -18,14 +18,14 @@ void main() { final targetData = PieChartData(centerSpaceRadius: 12); - const textScale = 4.0; + const textScaler = TextScaler.linear(4); final mockBuildContext = MockBuildContext(); final renderBarChart = RenderPieChart( mockBuildContext, data, targetData, - textScale, + textScaler, ); final mockPainter = MockPieChartPainter(); @@ -41,10 +41,10 @@ void main() { expect(renderBarChart.data == data, true); expect(renderBarChart.data == targetData, false); expect(renderBarChart.targetData == targetData, true); - expect(renderBarChart.textScale == textScale, true); + expect(renderBarChart.textScaler == textScaler, true); expect(renderBarChart.paintHolder.data == data, true); expect(renderBarChart.paintHolder.targetData == targetData, true); - expect(renderBarChart.paintHolder.textScale == textScale, true); + expect(renderBarChart.paintHolder.textScaler == textScaler, true); }); test('test 2 check paint function', () { @@ -61,7 +61,7 @@ void main() { final paintHolder = result.captured[1] as PaintHolder; expect(paintHolder.data, data); expect(paintHolder.targetData, targetData); - expect(paintHolder.textScale, textScale); + expect(paintHolder.textScaler, textScaler); verify(mockCanvas.restore()).called(1); }); @@ -85,18 +85,18 @@ void main() { final paintHolder = results[0]['paint_holder'] as PaintHolder; expect(paintHolder.data, data); expect(paintHolder.targetData, targetData); - expect(paintHolder.textScale, textScale); + expect(paintHolder.textScaler, textScaler); }); test('test 4 check setters', () { renderBarChart ..data = targetData ..targetData = data - ..textScale = 22; + ..textScaler = const TextScaler.linear(22); expect(renderBarChart.data, targetData); expect(renderBarChart.targetData, data); - expect(renderBarChart.textScale, 22); + expect(renderBarChart.textScaler, const TextScaler.linear(22)); }); }); } diff --git a/test/chart/radar_chart/radar_chart_painter_test.dart b/test/chart/radar_chart/radar_chart_painter_test.dart index d4c232987..2ae13fa7c 100644 --- a/test/chart/radar_chart/radar_chart_painter_test.dart +++ b/test/chart/radar_chart/radar_chart_painter_test.dart @@ -44,7 +44,11 @@ void main() { ); final radarPainter = RadarChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = PaintHolder( + data, + data, + TextScaler.noScaling, + ); final mockUtils = MockUtils(); Utils.changeInstance(mockUtils); @@ -114,7 +118,8 @@ void main() { ); final radarChartPainter = RadarChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); @@ -205,7 +210,8 @@ void main() { ); final radarChartPainter = RadarChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); @@ -292,7 +298,8 @@ void main() { ); final radarChartPainter = RadarChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); @@ -380,7 +387,8 @@ void main() { ); final radarChartPainter = RadarChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); @@ -437,7 +445,8 @@ void main() { ); final radarChartPainter = RadarChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); @@ -541,7 +550,8 @@ void main() { ); final radarChartPainter = RadarChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); @@ -693,7 +703,8 @@ void main() { ); final radarChartPainter = RadarChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); @@ -784,7 +795,8 @@ void main() { ); final radarChartPainter = RadarChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); @@ -871,7 +883,8 @@ void main() { ); final radarChartPainter = RadarChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); @@ -1095,7 +1108,8 @@ void main() { ); final radarChartPainter = RadarChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final result = radarChartPainter.calculateDataSetsPosition(viewSize, holder); diff --git a/test/chart/radar_chart/radar_chart_renderer_test.dart b/test/chart/radar_chart/radar_chart_renderer_test.dart index ca51249a3..31354ab31 100644 --- a/test/chart/radar_chart/radar_chart_renderer_test.dart +++ b/test/chart/radar_chart/radar_chart_renderer_test.dart @@ -24,14 +24,14 @@ void main() { tickCount: 1, ); - const textScale = 4.0; + const textScaler = TextScaler.linear(4); final mockBuildContext = MockBuildContext(); final renderRadarChart = RenderRadarChart( mockBuildContext, data, targetData, - textScale, + textScaler, ); final mockPainter = MockRadarChartPainter(); @@ -47,10 +47,10 @@ void main() { expect(renderRadarChart.data == data, true); expect(renderRadarChart.data == targetData, false); expect(renderRadarChart.targetData == targetData, true); - expect(renderRadarChart.textScale == textScale, true); + expect(renderRadarChart.textScaler == textScaler, true); expect(renderRadarChart.paintHolder.data == data, true); expect(renderRadarChart.paintHolder.targetData == targetData, true); - expect(renderRadarChart.paintHolder.textScale == textScale, true); + expect(renderRadarChart.paintHolder.textScaler == textScaler, true); }); test('test 2 check paint function', () { @@ -67,7 +67,7 @@ void main() { final paintHolder = result.captured[1] as PaintHolder; expect(paintHolder.data, data); expect(paintHolder.targetData, targetData); - expect(paintHolder.textScale, textScale); + expect(paintHolder.textScaler, textScaler); verify(mockCanvas.restore()).called(1); }); @@ -91,18 +91,18 @@ void main() { final paintHolder = results[0]['paint_holder'] as PaintHolder; expect(paintHolder.data, data); expect(paintHolder.targetData, targetData); - expect(paintHolder.textScale, textScale); + expect(paintHolder.textScaler, textScaler); }); test('test 4 check setters', () { renderRadarChart ..data = targetData ..targetData = data - ..textScale = 22; + ..textScaler = const TextScaler.linear(22); expect(renderRadarChart.data, targetData); expect(renderRadarChart.targetData, data); - expect(renderRadarChart.textScale, 22); + expect(renderRadarChart.textScaler, const TextScaler.linear(22)); }); }); } diff --git a/test/chart/scatter_chart/scatter_chart_painter_test.dart b/test/chart/scatter_chart/scatter_chart_painter_test.dart index 85e47e8dc..87346c993 100644 --- a/test/chart/scatter_chart/scatter_chart_painter_test.dart +++ b/test/chart/scatter_chart/scatter_chart_painter_test.dart @@ -28,7 +28,11 @@ void main() { ); final scatterPainter = ScatterChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = PaintHolder( + data, + data, + TextScaler.noScaling, + ); final mockUtils = MockUtils(); Utils.changeInstance(mockUtils); @@ -83,7 +87,11 @@ void main() { ); final scatterChartPainter = ScatterChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = PaintHolder( + data, + data, + TextScaler.noScaling, + ); final mockBuildContext = MockBuildContext(); final mockCanvasWrapper = MockCanvasWrapper(); @@ -125,7 +133,11 @@ void main() { ); final scatterChartPainter = ScatterChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = PaintHolder( + data, + data, + TextScaler.noScaling, + ); final mockBuildContext = MockBuildContext(); final mockCanvasWrapper = MockCanvasWrapper(); @@ -175,7 +187,11 @@ void main() { ); final scatterChartPainter = ScatterChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = PaintHolder( + data, + data, + TextScaler.noScaling, + ); final mockBuildContext = MockBuildContext(); final mockCanvasWrapper = MockCanvasWrapper(); @@ -231,7 +247,11 @@ void main() { ); final scatterChartPainter = ScatterChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = PaintHolder( + data, + data, + TextScaler.noScaling, + ); final mockCanvasWrapper = MockCanvasWrapper(); final mockBuildContext = MockBuildContext(); final mockUtils = MockUtils(); @@ -282,7 +302,11 @@ void main() { ); final scatterChartPainter = ScatterChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = PaintHolder( + data, + data, + TextScaler.noScaling, + ); final mockCanvasWrapper = MockCanvasWrapper(); final mockBuildContext = MockBuildContext(); final mockUtils = MockUtils(); @@ -350,7 +374,11 @@ void main() { ); final scatterChartPainter = ScatterChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = PaintHolder( + data, + data, + TextScaler.noScaling, + ); final mockCanvasWrapper = MockCanvasWrapper(); final mockBuildContext = MockBuildContext(); final mockUtils = MockUtils(); @@ -451,7 +479,11 @@ void main() { ); final scatterChartPainter = ScatterChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = PaintHolder( + data, + data, + TextScaler.noScaling, + ); final mockCanvasWrapper = MockCanvasWrapper(); final mockBuildContext = MockBuildContext(); final mockUtils = MockUtils(); @@ -554,7 +586,11 @@ void main() { ); final scatterChartPainter = ScatterChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = PaintHolder( + data, + data, + TextScaler.noScaling, + ); final mockCanvasWrapper = MockCanvasWrapper(); final mockBuildContext = MockBuildContext(); final mockUtils = MockUtils(); @@ -635,7 +671,11 @@ void main() { ); final scatterChartPainter = ScatterChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = PaintHolder( + data, + data, + TextScaler.noScaling, + ); final touchedSpot = scatterChartPainter.handleTouch( const Offset(10, 90), viewSize, @@ -734,7 +774,11 @@ void main() { ); final scatterChartPainter = ScatterChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = PaintHolder( + data, + data, + TextScaler.noScaling, + ); final touchedSpot = scatterChartPainter.handleTouch( const Offset(10, 90), viewSize, diff --git a/test/chart/scatter_chart/scatter_chart_renderer_test.dart b/test/chart/scatter_chart/scatter_chart_renderer_test.dart index 746a5360b..35f6e4452 100644 --- a/test/chart/scatter_chart/scatter_chart_renderer_test.dart +++ b/test/chart/scatter_chart/scatter_chart_renderer_test.dart @@ -20,14 +20,14 @@ void main() { final targetData = ScatterChartData(scatterSpots: [MockData.scatterSpot3]); - const textScale = 4.0; + const textScaler = TextScaler.linear(4); final mockBuildContext = MockBuildContext(); final renderScatterChart = RenderScatterChart( mockBuildContext, data, targetData, - textScale, + textScaler, ); final mockPainter = MockScatterChartPainter(); @@ -43,10 +43,10 @@ void main() { expect(renderScatterChart.data == data, true); expect(renderScatterChart.data == targetData, false); expect(renderScatterChart.targetData == targetData, true); - expect(renderScatterChart.textScale == textScale, true); + expect(renderScatterChart.textScaler == textScaler, true); expect(renderScatterChart.paintHolder.data == data, true); expect(renderScatterChart.paintHolder.targetData == targetData, true); - expect(renderScatterChart.paintHolder.textScale == textScale, true); + expect(renderScatterChart.paintHolder.textScaler == textScaler, true); }); test('test 2 check paint function', () { @@ -63,7 +63,7 @@ void main() { final paintHolder = result.captured[1] as PaintHolder; expect(paintHolder.data, data); expect(paintHolder.targetData, targetData); - expect(paintHolder.textScale, textScale); + expect(paintHolder.textScaler, textScaler); verify(mockCanvas.restore()).called(1); }); @@ -87,18 +87,18 @@ void main() { final paintHolder = results[0]['paint_holder'] as PaintHolder; expect(paintHolder.data, data); expect(paintHolder.targetData, targetData); - expect(paintHolder.textScale, textScale); + expect(paintHolder.textScaler, textScaler); }); test('test 4 check setters', () { renderScatterChart ..data = targetData ..targetData = data - ..textScale = 22; + ..textScaler = const TextScaler.linear(22); expect(renderScatterChart.data, targetData); expect(renderScatterChart.targetData, data); - expect(renderScatterChart.textScale, 22); + expect(renderScatterChart.textScaler, const TextScaler.linear(22)); }); }); } From d173cc068588126d74ee6db1ceaf6690a8ad6b9e Mon Sep 17 00:00:00 2001 From: Jani Koponen Date: Mon, 16 Oct 2023 18:14:42 +0300 Subject: [PATCH 050/149] Add dashArray parameter to BarChartRodData --- lib/src/chart/bar_chart/bar_chart_data.dart | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/src/chart/bar_chart/bar_chart_data.dart b/lib/src/chart/bar_chart/bar_chart_data.dart index 6292faf92..b595f3e20 100644 --- a/lib/src/chart/bar_chart/bar_chart_data.dart +++ b/lib/src/chart/bar_chart/bar_chart_data.dart @@ -290,6 +290,7 @@ class BarChartRodData with EquatableMixin { /// and the x is equivalent to the [BarChartGroupData.x] value. /// /// It renders each rod using [color], [width], and [borderRadius] for rounding corners and also [borderSide] for stroke border. + /// Optionally you can use [dashArray] if you want your borders to have dashed lines. /// /// This bar draws with provided [color] or [gradient]. /// You must provide one of them. @@ -319,6 +320,7 @@ class BarChartRodData with EquatableMixin { this.gradient, double? width, BorderRadius? borderRadius, + this.dashArray, BorderSide? borderSide, BackgroundBarChartRodData? backDrawRodData, List? rodStackItems, @@ -353,6 +355,9 @@ class BarChartRodData with EquatableMixin { /// If you want to have a rounded rod, set this value. final BorderRadius? borderRadius; + /// If you want to have dashed border, set this value. + final List? dashArray; + /// If you want to have a border for rod, set this value. final BorderSide borderSide; @@ -377,6 +382,7 @@ class BarChartRodData with EquatableMixin { Gradient? gradient, double? width, BorderRadius? borderRadius, + List? dashArray, BorderSide? borderSide, BackgroundBarChartRodData? backDrawRodData, List? rodStackItems, @@ -388,6 +394,7 @@ class BarChartRodData with EquatableMixin { gradient: gradient ?? this.gradient, width: width ?? this.width, borderRadius: borderRadius ?? this.borderRadius, + dashArray: dashArray ?? this.dashArray, borderSide: borderSide ?? this.borderSide, backDrawRodData: backDrawRodData ?? this.backDrawRodData, rodStackItems: rodStackItems ?? this.rodStackItems, @@ -402,6 +409,7 @@ class BarChartRodData with EquatableMixin { color: Color.lerp(a.color, b.color, t), width: lerpDouble(a.width, b.width, t), borderRadius: BorderRadius.lerp(a.borderRadius, b.borderRadius, t), + dashArray: lerpIntList(a.dashArray, b.dashArray, t), borderSide: BorderSide.lerp(a.borderSide, b.borderSide, t), fromY: lerpDouble(a.fromY, b.fromY, t), toY: lerpDouble(a.toY, b.toY, t)!, @@ -422,6 +430,7 @@ class BarChartRodData with EquatableMixin { toY, width, borderRadius, + dashArray, borderSide, backDrawRodData, rodStackItems, From 98d10e5a3bdf45b4fe4d8fb344921455f95a4750 Mon Sep 17 00:00:00 2001 From: Jani Koponen Date: Mon, 16 Oct 2023 18:15:16 +0300 Subject: [PATCH 051/149] Make border draw last and use toDashedPath to draw the border --- .../chart/bar_chart/bar_chart_painter.dart | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/lib/src/chart/bar_chart/bar_chart_painter.dart b/lib/src/chart/bar_chart/bar_chart_painter.dart index ab99f7cbd..5a8b4e097 100644 --- a/lib/src/chart/bar_chart/bar_chart_painter.dart +++ b/lib/src/chart/bar_chart/bar_chart_painter.dart @@ -6,6 +6,7 @@ import 'package:fl_chart/src/chart/base/axis_chart/axis_chart_painter.dart'; import 'package:fl_chart/src/chart/base/base_chart/base_chart_painter.dart'; import 'package:fl_chart/src/extensions/bar_chart_data_extension.dart'; import 'package:fl_chart/src/extensions/paint_extension.dart'; +import 'package:fl_chart/src/extensions/path_extension.dart'; import 'package:fl_chart/src/extensions/rrect_extension.dart'; import 'package:fl_chart/src/utils/canvas_wrapper.dart'; import 'package:fl_chart/src/utils/utils.dart'; @@ -277,14 +278,6 @@ class BarChartPainter extends AxisChartPainter { ); canvasWrapper.drawRRect(barRRect, _barPaint); - // draw border stroke - if (borderSide.width > 0 && borderSide.color.opacity > 0) { - _barStrokePaint - ..color = borderSide.color - ..strokeWidth = borderSide.width; - canvasWrapper.drawRRect(barRRect, _barStrokePaint); - } - // draw rod stack if (barRod.rodStackItems.isNotEmpty) { for (var i = 0; i < barRod.rodStackItems.length; i++) { @@ -316,6 +309,22 @@ class BarChartPainter extends AxisChartPainter { ); } } + + // draw border stroke + if (borderSide.width > 0 && borderSide.color.opacity > 0) { + _barStrokePaint + ..color = borderSide.color + ..strokeWidth = borderSide.width; + + final borderPath = Path()..addRRect(barRRect); + + canvasWrapper.drawPath( + borderPath.toDashedPath( + barRod.dashArray, + ), + _barStrokePaint, + ); + } } } } From 1f1834a70a5adfe2954dcc70c2a3431a1e8512e1 Mon Sep 17 00:00:00 2001 From: Jani Koponen Date: Mon, 16 Oct 2023 18:15:47 +0300 Subject: [PATCH 052/149] Add new sample to show the dashed border --- .../samples/bar/bar_chart_sample8.dart | 145 ++++++++++++++++++ .../presentation/samples/chart_samples.dart | 2 + 2 files changed, 147 insertions(+) create mode 100644 example/lib/presentation/samples/bar/bar_chart_sample8.dart diff --git a/example/lib/presentation/samples/bar/bar_chart_sample8.dart b/example/lib/presentation/samples/bar/bar_chart_sample8.dart new file mode 100644 index 000000000..f912fc675 --- /dev/null +++ b/example/lib/presentation/samples/bar/bar_chart_sample8.dart @@ -0,0 +1,145 @@ +import 'dart:math'; + +import 'package:fl_chart_app/presentation/resources/app_resources.dart'; +import 'package:fl_chart_app/util/extensions/color_extensions.dart'; +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; + +class BarChartSample8 extends StatefulWidget { + BarChartSample8({super.key}); + + final Color barBackgroundColor = + AppColors.contentColorWhite.darken().withOpacity(0.3); + final Color barColor = AppColors.contentColorWhite; + + @override + State createState() => BarChartSample1State(); +} + +class BarChartSample1State extends State { + @override + Widget build(BuildContext context) { + return AspectRatio( + aspectRatio: 1, + child: Padding( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.graphic_eq), + const SizedBox( + width: 32, + ), + Text( + 'Sales forecasting chart', + style: TextStyle( + color: widget.barColor, + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + const SizedBox( + height: 32, + ), + Expanded( + child: BarChart( + randomData(), + ), + ), + ], + ), + ), + ); + } + + BarChartGroupData makeGroupData( + int x, + double y, + ) { + return BarChartGroupData( + x: x, + barRods: [ + BarChartRodData( + toY: y, + color: x >= 4 ? Colors.transparent : widget.barColor, + borderRadius: BorderRadius.zero, + dashArray: x >= 4 ? [4, 4] : null, + width: 22, + borderSide: BorderSide(color: widget.barColor, width: 2.0), + ), + ], + ); + } + + Widget getTitles(double value, TitleMeta meta) { + const style = TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 14, + ); + List days = ['M', 'T', 'W', 'T', 'F', 'S', 'S']; + + Widget text = Text( + days[value.toInt()], + style: style, + ); + + return SideTitleWidget( + axisSide: meta.axisSide, + space: 16, + child: text, + ); + } + + BarChartData randomData() { + return BarChartData( + maxY: 300.0, + barTouchData: BarTouchData( + enabled: false, + ), + titlesData: FlTitlesData( + show: true, + bottomTitles: AxisTitles( + sideTitles: SideTitles( + showTitles: true, + getTitlesWidget: getTitles, + reservedSize: 38, + ), + ), + leftTitles: const AxisTitles( + sideTitles: SideTitles( + reservedSize: 30, + showTitles: true, + ), + ), + topTitles: const AxisTitles( + sideTitles: SideTitles( + showTitles: false, + ), + ), + rightTitles: const AxisTitles( + sideTitles: SideTitles( + showTitles: false, + ), + ), + ), + borderData: FlBorderData( + show: false, + ), + barGroups: List.generate( + 7, + (i) => makeGroupData( + i, + Random().nextInt(290).toDouble() + 10, + ), + ), + gridData: const FlGridData(show: false), + ); + } +} diff --git a/example/lib/presentation/samples/chart_samples.dart b/example/lib/presentation/samples/chart_samples.dart index 4114cd5f6..98e090148 100644 --- a/example/lib/presentation/samples/chart_samples.dart +++ b/example/lib/presentation/samples/chart_samples.dart @@ -7,6 +7,7 @@ import 'bar/bar_chart_sample4.dart'; import 'bar/bar_chart_sample5.dart'; import 'bar/bar_chart_sample6.dart'; import 'bar/bar_chart_sample7.dart'; +import 'bar/bar_chart_sample8.dart'; import 'chart_sample.dart'; import 'line/line_chart_sample1.dart'; import 'line/line_chart_sample10.dart'; @@ -49,6 +50,7 @@ class ChartSamples { BarChartSample(5, (context) => const BarChartSample5()), BarChartSample(6, (context) => const BarChartSample6()), BarChartSample(7, (context) => BarChartSample7()), + BarChartSample(8, (context) => BarChartSample8()), ], ChartType.pie: [ PieChartSample(1, (context) => const PieChartSample1()), From d9a0efb1c48f75c1ec5013e51a765e8fd0c1a54e Mon Sep 17 00:00:00 2001 From: Jani Koponen Date: Mon, 16 Oct 2023 18:16:01 +0300 Subject: [PATCH 053/149] Update BarChartRodData documentation --- repo_files/documentations/bar_chart.md | 1 + 1 file changed, 1 insertion(+) diff --git a/repo_files/documentations/bar_chart.md b/repo_files/documentations/bar_chart.md index 9c28a16c1..4dcf9a8c8 100644 --- a/repo_files/documentations/bar_chart.md +++ b/repo_files/documentations/bar_chart.md @@ -57,6 +57,7 @@ enum values {`start`, `end`, `center`, `spaceEvenly`, `spaceAround`, `spaceBetwe |gradient| You can use any [Gradient](https://api.flutter.dev/flutter/dart-ui/Gradient-class.html) here. such as [LinearGradient](https://api.flutter.dev/flutter/painting/LinearGradient-class.html) or [RadialGradient](https://api.flutter.dev/flutter/painting/RadialGradient-class.html)|null| |width|stroke width of the rod bar|8| |borderRadius|Determines the edge rounding of the bar corners, see [BorderRadius](https://api.flutter.dev/flutter/painting/BorderRadius-class.html). When `null`, it defaults to completely round bars. |null| +|dashArray|Determines wether the border stroke is dashed. It is a circular array of dash offsets and lengths. For example, the array `[5, 10]` would result in dashes 5 pixels long followed by blank spaces 10 pixels long. The array `[5, 10, 5]` would result in a 5 pixel dash, a 10 pixel gap, a 5 pixel dash, a 5 pixel gap, a 10 pixel dash, etc.|null| |borderSide|Determines the border stroke around of the bar, see [BorderSide](https://api.flutter.dev/flutter/painting/BorderSide-class.html). When `null`, it defaults to draw no stroke. |null| |backDrawRodData|if provided, draws a rod in the background of the line bar, check the [BackgroundBarChartRodData](#BackgroundBarChartRodData)|null| |rodStackItem|if you want to have stacked bar chart, provide a list of [BarChartRodStackItem](#BarChartRodStackItem), it will draw over your rod.|[]| From 5151fc251d9d8a66f30248270a6fc362c2c622ae Mon Sep 17 00:00:00 2001 From: Jani Koponen Date: Mon, 16 Oct 2023 18:16:33 +0300 Subject: [PATCH 054/149] Create two tests to test borders --- .../bar_chart/bar_chart_painter_test.dart | 198 ++++++++++++++++++ 1 file changed, 198 insertions(+) diff --git a/test/chart/bar_chart/bar_chart_painter_test.dart b/test/chart/bar_chart/bar_chart_painter_test.dart index 44877dbe5..36b3da662 100644 --- a/test/chart/bar_chart/bar_chart_painter_test.dart +++ b/test/chart/bar_chart/bar_chart_painter_test.dart @@ -2,6 +2,7 @@ import 'package:fl_chart/fl_chart.dart'; import 'package:fl_chart/src/chart/bar_chart/bar_chart_painter.dart'; import 'package:fl_chart/src/chart/base/base_chart/base_chart_painter.dart'; import 'package:fl_chart/src/extensions/bar_chart_data_extension.dart'; +import 'package:fl_chart/src/extensions/path_extension.dart'; import 'package:fl_chart/src/utils/canvas_wrapper.dart'; import 'package:fl_chart/src/utils/utils.dart'; import 'package:flutter/material.dart'; @@ -787,6 +788,203 @@ void main() { expect(results[3]['paint_color'], const Color(0x33333333)); expect(results[4]['paint_color'], const Color(0x44444444)); }); + + test('test 4', () { + const viewSize = Size(200, 100); + + final barGroups = [ + BarChartGroupData( + x: 0, + barRods: [ + BarChartRodData( + fromY: 0, + toY: 5, + borderRadius: BorderRadius.zero, + color: Colors.white, + ), + ], + ), + BarChartGroupData( + x: 1, + barRods: [ + BarChartRodData( + fromY: 0, + toY: 10, + borderRadius: BorderRadius.zero, + color: Colors.white, + ), + ], + ), + BarChartGroupData( + x: 3, + barRods: [ + BarChartRodData( + fromY: 0, + toY: 15, + dashArray: [4, 4], + borderSide: const BorderSide( + color: Colors.white, + width: 2, + ), + borderRadius: BorderRadius.zero, + color: Colors.transparent, + ), + ], + ), + ]; + + final data = BarChartData(barGroups: barGroups); + + final barChartPainter = BarChartPainter(); + final holder = PaintHolder(data, data, 1); + + final mockCanvasWrapper = MockCanvasWrapper(); + when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); + when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); + + final groupsX = data.calculateGroupsX(viewSize.width); + final barGroupsPosition = barChartPainter.calculateGroupAndBarsPosition( + viewSize, + groupsX, + barGroups, + ); + + final rodDataResults = >[]; + final borderResult = >[]; + + when(mockCanvasWrapper.drawRRect(captureAny, captureAny)) + .thenAnswer((inv) { + final rrect = inv.positionalArguments[0] as RRect; + final paint = inv.positionalArguments[1] as Paint; + rodDataResults.add({ + 'rrect': rrect, + 'paint_color': paint.color, + }); + }); + + when(mockCanvasWrapper.drawPath(captureAny, captureAny)) + .thenAnswer((inv) { + final path = inv.positionalArguments[0] as Path; + final paint = inv.positionalArguments[1] as Paint; + borderResult.add({ + 'path': path, + 'paint_color': paint.color, + }); + }); + + barChartPainter.drawBars(mockCanvasWrapper, barGroupsPosition, holder); + expect(rodDataResults.length, 3); + expect(rodDataResults[0]['paint_color'], Colors.white); + expect(rodDataResults[1]['paint_color'], Colors.white); + expect(rodDataResults[2]['paint_color'], Colors.transparent); + + expect(borderResult.length, 1); + expect(borderResult[0]['paint_color'], Colors.white); + final rrect = rodDataResults[2]['rrect'] as RRect; + final path = Path()..addRRect(rrect); + final expectedPath = path.toDashedPath([4, 4]); + final currentPath = borderResult[0]['path'] as Path; + + expect(HelperMethods.equalsPaths(expectedPath, currentPath), true); + }); + + test('test 5', () { + const viewSize = Size(200, 100); + + final barGroups = [ + BarChartGroupData( + x: 0, + barRods: [ + BarChartRodData( + fromY: 0, + toY: 5, + borderRadius: BorderRadius.zero, + color: Colors.white, + ), + ], + ), + BarChartGroupData( + x: 1, + barRods: [ + BarChartRodData( + fromY: 0, + toY: 10, + borderRadius: BorderRadius.zero, + color: Colors.white, + ), + ], + ), + BarChartGroupData( + x: 3, + barRods: [ + BarChartRodData( + fromY: 0, + toY: 15, + borderSide: const BorderSide( + color: Colors.white, + width: 2, + ), + borderRadius: BorderRadius.zero, + color: Colors.transparent, + ), + ], + ), + ]; + + final data = BarChartData(barGroups: barGroups); + + final barChartPainter = BarChartPainter(); + final holder = PaintHolder(data, data, 1); + + final mockCanvasWrapper = MockCanvasWrapper(); + when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); + when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); + + final groupsX = data.calculateGroupsX(viewSize.width); + final barGroupsPosition = barChartPainter.calculateGroupAndBarsPosition( + viewSize, + groupsX, + barGroups, + ); + + final rodDataResults = >[]; + final borderResult = >[]; + + when(mockCanvasWrapper.drawRRect(captureAny, captureAny)) + .thenAnswer((inv) { + final rrect = inv.positionalArguments[0] as RRect; + final paint = inv.positionalArguments[1] as Paint; + rodDataResults.add({ + 'rrect': rrect, + 'paint_color': paint.color, + }); + }); + + when(mockCanvasWrapper.drawPath(captureAny, captureAny)) + .thenAnswer((inv) { + final path = inv.positionalArguments[0] as Path; + final paint = inv.positionalArguments[1] as Paint; + borderResult.add({ + 'path': path, + 'paint_color': paint.color, + }); + }); + + barChartPainter.drawBars(mockCanvasWrapper, barGroupsPosition, holder); + expect(rodDataResults.length, 3); + expect(rodDataResults[0]['paint_color'], Colors.white); + expect(rodDataResults[1]['paint_color'], Colors.white); + expect(rodDataResults[2]['paint_color'], Colors.transparent); + + expect(borderResult.length, 1); + expect(borderResult[0]['paint_color'], Colors.white); + final rrect = rodDataResults[2]['rrect'] as RRect; + final path = Path()..addRRect(rrect); + final expectedPath = path.toDashedPath(null); + final currentPath = borderResult[0]['path'] as Path; + + expect(HelperMethods.equalsPaths(expectedPath, currentPath), true); + }); }); group('drawTouchTooltip()', () { From 442445296ebf5c9339b3d7e573eedec5d09fbd1f Mon Sep 17 00:00:00 2001 From: Jani Koponen Date: Mon, 16 Oct 2023 18:41:53 +0300 Subject: [PATCH 055/149] Fix @kopsutin -> @k0psutin --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 19473ca33..c1d4a0fc9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ * **BUGFIX** (by @imaNNeo) Fix bar line shadow crash when we have only one (or zero) spot, #1466 * **BUGFIX** (by @imaNNeo) Fix having negative `toY` (or positive `fromY`) in BarChart's `minY` and `maxY` calculations, #1470 * **BUGFIX** (by @bobatsar) Fix bars drawn outside of diagram +* **FEATURE** (by @k0psutin) Add dashed border to BarChartRodData, #1144 ## 0.64.0 * **BUGFIX** (by @Anas35) Fix Tooltip not displaying when value from BackgroundBarChartRodData is less than zero. #1345. From 2955cef8442867dd38c6bbdbd54471e4f877172f Mon Sep 17 00:00:00 2001 From: Jani Koponen Date: Thu, 16 Nov 2023 19:57:30 +0200 Subject: [PATCH 056/149] Rename dashArray to borderDashArray --- .../presentation/samples/bar/bar_chart_sample8.dart | 2 +- lib/src/chart/bar_chart/bar_chart_data.dart | 12 ++++++------ lib/src/chart/bar_chart/bar_chart_painter.dart | 2 +- repo_files/documentations/bar_chart.md | 2 +- test/chart/bar_chart/bar_chart_painter_test.dart | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/example/lib/presentation/samples/bar/bar_chart_sample8.dart b/example/lib/presentation/samples/bar/bar_chart_sample8.dart index f912fc675..2198fb072 100644 --- a/example/lib/presentation/samples/bar/bar_chart_sample8.dart +++ b/example/lib/presentation/samples/bar/bar_chart_sample8.dart @@ -69,7 +69,7 @@ class BarChartSample1State extends State { toY: y, color: x >= 4 ? Colors.transparent : widget.barColor, borderRadius: BorderRadius.zero, - dashArray: x >= 4 ? [4, 4] : null, + borderDashArray: x >= 4 ? [4, 4] : null, width: 22, borderSide: BorderSide(color: widget.barColor, width: 2.0), ), diff --git a/lib/src/chart/bar_chart/bar_chart_data.dart b/lib/src/chart/bar_chart/bar_chart_data.dart index b595f3e20..c0207de66 100644 --- a/lib/src/chart/bar_chart/bar_chart_data.dart +++ b/lib/src/chart/bar_chart/bar_chart_data.dart @@ -290,7 +290,7 @@ class BarChartRodData with EquatableMixin { /// and the x is equivalent to the [BarChartGroupData.x] value. /// /// It renders each rod using [color], [width], and [borderRadius] for rounding corners and also [borderSide] for stroke border. - /// Optionally you can use [dashArray] if you want your borders to have dashed lines. + /// Optionally you can use [borderDashArray] if you want your borders to have dashed lines. /// /// This bar draws with provided [color] or [gradient]. /// You must provide one of them. @@ -320,7 +320,7 @@ class BarChartRodData with EquatableMixin { this.gradient, double? width, BorderRadius? borderRadius, - this.dashArray, + this.borderDashArray, BorderSide? borderSide, BackgroundBarChartRodData? backDrawRodData, List? rodStackItems, @@ -356,7 +356,7 @@ class BarChartRodData with EquatableMixin { final BorderRadius? borderRadius; /// If you want to have dashed border, set this value. - final List? dashArray; + final List? borderDashArray; /// If you want to have a border for rod, set this value. final BorderSide borderSide; @@ -394,7 +394,7 @@ class BarChartRodData with EquatableMixin { gradient: gradient ?? this.gradient, width: width ?? this.width, borderRadius: borderRadius ?? this.borderRadius, - dashArray: dashArray ?? this.dashArray, + borderDashArray: borderDashArray, borderSide: borderSide ?? this.borderSide, backDrawRodData: backDrawRodData ?? this.backDrawRodData, rodStackItems: rodStackItems ?? this.rodStackItems, @@ -409,7 +409,7 @@ class BarChartRodData with EquatableMixin { color: Color.lerp(a.color, b.color, t), width: lerpDouble(a.width, b.width, t), borderRadius: BorderRadius.lerp(a.borderRadius, b.borderRadius, t), - dashArray: lerpIntList(a.dashArray, b.dashArray, t), + borderDashArray: lerpIntList(a.borderDashArray, b.borderDashArray, t), borderSide: BorderSide.lerp(a.borderSide, b.borderSide, t), fromY: lerpDouble(a.fromY, b.fromY, t), toY: lerpDouble(a.toY, b.toY, t)!, @@ -430,7 +430,7 @@ class BarChartRodData with EquatableMixin { toY, width, borderRadius, - dashArray, + borderDashArray, borderSide, backDrawRodData, rodStackItems, diff --git a/lib/src/chart/bar_chart/bar_chart_painter.dart b/lib/src/chart/bar_chart/bar_chart_painter.dart index 5a8b4e097..0214682fa 100644 --- a/lib/src/chart/bar_chart/bar_chart_painter.dart +++ b/lib/src/chart/bar_chart/bar_chart_painter.dart @@ -320,7 +320,7 @@ class BarChartPainter extends AxisChartPainter { canvasWrapper.drawPath( borderPath.toDashedPath( - barRod.dashArray, + barRod.borderDashArray, ), _barStrokePaint, ); diff --git a/repo_files/documentations/bar_chart.md b/repo_files/documentations/bar_chart.md index 4dcf9a8c8..178c2f212 100644 --- a/repo_files/documentations/bar_chart.md +++ b/repo_files/documentations/bar_chart.md @@ -57,7 +57,7 @@ enum values {`start`, `end`, `center`, `spaceEvenly`, `spaceAround`, `spaceBetwe |gradient| You can use any [Gradient](https://api.flutter.dev/flutter/dart-ui/Gradient-class.html) here. such as [LinearGradient](https://api.flutter.dev/flutter/painting/LinearGradient-class.html) or [RadialGradient](https://api.flutter.dev/flutter/painting/RadialGradient-class.html)|null| |width|stroke width of the rod bar|8| |borderRadius|Determines the edge rounding of the bar corners, see [BorderRadius](https://api.flutter.dev/flutter/painting/BorderRadius-class.html). When `null`, it defaults to completely round bars. |null| -|dashArray|Determines wether the border stroke is dashed. It is a circular array of dash offsets and lengths. For example, the array `[5, 10]` would result in dashes 5 pixels long followed by blank spaces 10 pixels long. The array `[5, 10, 5]` would result in a 5 pixel dash, a 10 pixel gap, a 5 pixel dash, a 5 pixel gap, a 10 pixel dash, etc.|null| +|borderDashArray|Determines wether the border stroke is dashed. It is a circular array of dash offsets and lengths. For example, the array `[5, 10]` would result in dashes 5 pixels long followed by blank spaces 10 pixels long. The array `[5, 10, 5]` would result in a 5 pixel dash, a 10 pixel gap, a 5 pixel dash, a 5 pixel gap, a 10 pixel dash, etc.|null| |borderSide|Determines the border stroke around of the bar, see [BorderSide](https://api.flutter.dev/flutter/painting/BorderSide-class.html). When `null`, it defaults to draw no stroke. |null| |backDrawRodData|if provided, draws a rod in the background of the line bar, check the [BackgroundBarChartRodData](#BackgroundBarChartRodData)|null| |rodStackItem|if you want to have stacked bar chart, provide a list of [BarChartRodStackItem](#BarChartRodStackItem), it will draw over your rod.|[]| diff --git a/test/chart/bar_chart/bar_chart_painter_test.dart b/test/chart/bar_chart/bar_chart_painter_test.dart index 36b3da662..73f6ca733 100644 --- a/test/chart/bar_chart/bar_chart_painter_test.dart +++ b/test/chart/bar_chart/bar_chart_painter_test.dart @@ -821,7 +821,7 @@ void main() { BarChartRodData( fromY: 0, toY: 15, - dashArray: [4, 4], + borderDashArray: [4, 4], borderSide: const BorderSide( color: Colors.white, width: 2, From 0d4faea641f1bad154a85259980b3894a057320e Mon Sep 17 00:00:00 2001 From: Jani Koponen Date: Tue, 21 Nov 2023 09:05:41 +0200 Subject: [PATCH 057/149] Fix tests --- test/chart/bar_chart/bar_chart_painter_test.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/chart/bar_chart/bar_chart_painter_test.dart b/test/chart/bar_chart/bar_chart_painter_test.dart index 73f6ca733..ef7684efb 100644 --- a/test/chart/bar_chart/bar_chart_painter_test.dart +++ b/test/chart/bar_chart/bar_chart_painter_test.dart @@ -836,7 +836,8 @@ void main() { final data = BarChartData(barGroups: barGroups); final barChartPainter = BarChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); @@ -934,7 +935,8 @@ void main() { final data = BarChartData(barGroups: barGroups); final barChartPainter = BarChartPainter(); - final holder = PaintHolder(data, data, 1); + final holder = + PaintHolder(data, data, TextScaler.noScaling); final mockCanvasWrapper = MockCanvasWrapper(); when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); From c91102463188dd20379e4d355e78dc5cb9d65a6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Po=C5=82o=C5=84ski?= Date: Wed, 22 Nov 2023 19:04:07 +1100 Subject: [PATCH 058/149] chore(handle_animations.md):replace = with : Fix a typo --- repo_files/documentations/handle_animations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo_files/documentations/handle_animations.md b/repo_files/documentations/handle_animations.md index fe1519bff..6ce792268 100644 --- a/repo_files/documentations/handle_animations.md +++ b/repo_files/documentations/handle_animations.md @@ -13,7 +13,7 @@ You can change the [Duration](https://api.flutter.dev/flutter/dart-core/Duration ```dart LineChart( swapAnimationDuration: Duration(milliseconds: 150), - swapAnimationCurve = Curves.linear, + swapAnimationCurve: Curves.linear, LineChartData( isShowingMainData ? sampleData1() : sampleData2(), ), From 2b7be70d39d89ca5bb8e92e41acabec0a4c40456 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Fri, 24 Nov 2023 21:58:56 +0100 Subject: [PATCH 059/149] Allow to show single point line in LineChart, #1438 --- CHANGELOG.md | 1 + example/ios/Podfile.lock | 10 ++++++++-- example/macos/Podfile.lock | 2 +- lib/src/chart/line_chart/line_chart_painter.dart | 4 ++++ 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c1d4a0fc9..702c16144 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ * **BUGFIX** (by @imaNNeo) Fix having negative `toY` (or positive `fromY`) in BarChart's `minY` and `maxY` calculations, #1470 * **BUGFIX** (by @bobatsar) Fix bars drawn outside of diagram * **FEATURE** (by @k0psutin) Add dashed border to BarChartRodData, #1144 +* **FEATURE** (by @imaNNeo) Allow to show single point line in LineChart, #1438 ## 0.64.0 * **BUGFIX** (by @Anas35) Fix Tooltip not displaying when value from BackgroundBarChartRodData is less than zero. #1345. diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index b4b133aee..08e21c21c 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -1,5 +1,7 @@ PODS: - Flutter (1.0.0) + - package_info_plus (0.4.5): + - Flutter - path_provider_foundation (0.0.1): - Flutter - FlutterMacOS @@ -8,12 +10,15 @@ PODS: DEPENDENCIES: - Flutter (from `Flutter`) + - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) EXTERNAL SOURCES: Flutter: :path: Flutter + package_info_plus: + :path: ".symlinks/plugins/package_info_plus/ios" path_provider_foundation: :path: ".symlinks/plugins/path_provider_foundation/darwin" url_launcher_ios: @@ -21,9 +26,10 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 + package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85 path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 - url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4 + url_launcher_ios: bf5ce03e0e2088bad9cc378ea97fa0ed5b49673b PODFILE CHECKSUM: ef19549a9bc3046e7bb7d2fab4d021637c0c58a3 -COCOAPODS: 1.13.0 +COCOAPODS: 1.14.3 diff --git a/example/macos/Podfile.lock b/example/macos/Podfile.lock index 36635bacc..42e492b50 100644 --- a/example/macos/Podfile.lock +++ b/example/macos/Podfile.lock @@ -32,4 +32,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 353c8bcc5d5b0994e508d035b5431cfe18c1dea7 -COCOAPODS: 1.13.0 +COCOAPODS: 1.14.3 diff --git a/lib/src/chart/line_chart/line_chart_painter.dart b/lib/src/chart/line_chart/line_chart_painter.dart index 8623e56b4..75b4a60ec 100644 --- a/lib/src/chart/line_chart/line_chart_painter.dart +++ b/lib/src/chart/line_chart/line_chart_painter.dart @@ -489,6 +489,9 @@ class LineChartPainter extends AxisChartPainter { final y = getPixelY(barSpots[0].y, viewSize, holder); if (appendToPath == null) { path.moveTo(x, y); + if (size == 1) { + path.lineTo(x, y); + } } else { path.lineTo(x, y); } @@ -1299,6 +1302,7 @@ class LineIndexDrawingInfo { this.spotIndex, this.indicatorData, ); + final LineChartBarData line; final int lineIndex; final FlSpot spot; From 4a9bd3f2ffa77e57aec57b2695971e5e29a81baf Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Fri, 24 Nov 2023 22:31:22 +0100 Subject: [PATCH 060/149] Fix flutter version issue in gh-pages.yml --- .github/workflows/gh-pages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index 43536ae14..eac7be64e 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -15,7 +15,7 @@ jobs: - name: Set fl_chart Version run: | - VERSION=$(grep "version:" fl_chart.yaml | awk '{ print $2 }') + VERSION=$(grep "version:" pubspec.yaml | awk '{ print $2 }') echo "USING_FL_CHART_VERSION=$VERSION" >> $GITHUB_ENV - uses: bluefireteam/flutter-gh-pages@v8 From 40caf90ee2004c461c9d80ba714728d4969a3b75 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Fri, 24 Nov 2023 22:49:59 +0100 Subject: [PATCH 061/149] Change the drawer header logic to always open the landing page --- example/lib/presentation/pages/home_page.dart | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/example/lib/presentation/pages/home_page.dart b/example/lib/presentation/pages/home_page.dart index 497e098e8..d1e2b02d3 100644 --- a/example/lib/presentation/pages/home_page.dart +++ b/example/lib/presentation/pages/home_page.dart @@ -4,7 +4,6 @@ import 'package:fl_chart_app/presentation/resources/app_resources.dart'; import 'package:fl_chart_app/urls.dart'; import 'package:fl_chart_app/util/app_helper.dart'; import 'package:fl_chart_app/util/app_utils.dart'; -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; @@ -53,18 +52,7 @@ class HomePage extends StatelessWidget { Navigator.of(context).pop(); } }, - onBannerClicked: kIsWeb || needsDrawer - ? () async { - if (kIsWeb) { - await AppUtils().tryToLaunchUrl(Urls.flChartUrl); - return; - } - if (needsDrawer) { - Navigator.of(context).pop(); - return; - } - } - : null, + onBannerClicked: () => AppUtils().tryToLaunchUrl(Urls.flChartUrl), ); final samplesSectionWidget = ChartSamplesPage(chartType: showingChartType); From df87e97acd07fac50164005f2f9b60f28c933010 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Fri, 24 Nov 2023 23:04:11 +0100 Subject: [PATCH 062/149] Open flutter release page when user clicks on the fl_chart version on app_menu --- example/lib/cubits/app/app_cubit.dart | 8 ++++++++ example/lib/presentation/menu/app_menu.dart | 11 ++++++++++- example/lib/urls.dart | 7 ++++++- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/example/lib/cubits/app/app_cubit.dart b/example/lib/cubits/app/app_cubit.dart index 317f1969b..b33f89042 100644 --- a/example/lib/cubits/app/app_cubit.dart +++ b/example/lib/cubits/app/app_cubit.dart @@ -1,3 +1,5 @@ +import 'package:fl_chart_app/urls.dart'; +import 'package:fl_chart_app/util/app_utils.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:equatable/equatable.dart'; @@ -17,6 +19,12 @@ class AppCubit extends Cubit { usingFlChartVersion: BuildConstants.usingFlChartVersion, )); } + + void onVersionClicked() { + AppUtils().tryToLaunchUrl( + Urls.getVersionReleaseUrl(state.usingFlChartVersion), + ); + } } class BuildConstants { diff --git a/example/lib/presentation/menu/app_menu.dart b/example/lib/presentation/menu/app_menu.dart index f4deffdf2..51fcd2daf 100644 --- a/example/lib/presentation/menu/app_menu.dart +++ b/example/lib/presentation/menu/app_menu.dart @@ -4,6 +4,7 @@ import 'package:fl_chart_app/presentation/resources/app_resources.dart'; import 'package:fl_chart_app/urls.dart'; import 'package:fl_chart_app/util/app_helper.dart'; import 'package:fl_chart_app/util/app_utils.dart'; +import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -105,12 +106,20 @@ class _AppVersionRow extends StatelessWidget { ), ), if (state.usingFlChartVersion.isNotBlank) ...[ - const TextSpan(text: '\nfl_chart: '), + TextSpan( + text: '\nfl_chart: ', + recognizer: TapGestureRecognizer() + ..onTap = BlocProvider.of(context) + .onVersionClicked, + ), TextSpan( text: 'v${state.usingFlChartVersion}', style: const TextStyle( fontWeight: FontWeight.bold, ), + recognizer: TapGestureRecognizer() + ..onTap = BlocProvider.of(context) + .onVersionClicked, ), ] ], diff --git a/example/lib/urls.dart b/example/lib/urls.dart index 83cb6d95b..c1af6f547 100644 --- a/example/lib/urls.dart +++ b/example/lib/urls.dart @@ -2,6 +2,10 @@ import 'package:fl_chart_app/util/app_helper.dart'; class Urls { static const flChartUrl = 'https://flchart.dev'; + static const flChartGithubUrl = 'https://github.com/imaNNeo/fl_chart'; + + static String get aboutUrl => '$flChartUrl/about'; + static String getChartSourceCodeUrl(ChartType chartType, int sampleNumber) { final chartDir = chartType.name.toLowerCase(); return 'https://github.com/imaNNeo/fl_chart/blob/master/example/lib/presentation/samples/$chartDir/${chartDir}_chart_sample$sampleNumber.dart'; @@ -12,5 +16,6 @@ class Urls { return 'https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/${chartDir}_chart.md'; } - static String get aboutUrl => '$flChartUrl/about'; + static String getVersionReleaseUrl(String version) => + '$flChartGithubUrl/releases/tag/$version'; } From 98774506df4e89e546cd5aacbdd52eae6cbc5404 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Fri, 24 Nov 2023 23:07:16 +0100 Subject: [PATCH 063/149] Remove buy me a coffe button in the app --- example/web/index.html | 2 -- 1 file changed, 2 deletions(-) diff --git a/example/web/index.html b/example/web/index.html index a6950c506..42adc297e 100644 --- a/example/web/index.html +++ b/example/web/index.html @@ -107,7 +107,5 @@ }); }); - - From 803409c7c428579f968b276ad9f125ac3c7150d9 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Fri, 24 Nov 2023 23:24:19 +0100 Subject: [PATCH 064/149] Bump version to 0.65.0 --- CHANGELOG.md | 2 +- pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 702c16144..db8203acb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## nextVersion +## 0.65.0 * **FEATURE** (by @Dartek12) Added gradient to [FlLine](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#FlLine), #1197 * **BUGFIX** (by @imaNNeo) Fix bar line shadow crash when we have only one (or zero) spot, #1466 * **BUGFIX** (by @imaNNeo) Fix having negative `toY` (or positive `fromY`) in BarChart's `minY` and `maxY` calculations, #1470 diff --git a/pubspec.yaml b/pubspec.yaml index 7324dcd51..94ee5910f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: fl_chart description: A highly customizable Flutter chart library that supports Line Chart, Bar Chart, Pie Chart, Scatter Chart, and Radar Chart. -version: 0.64.0 +version: 0.65.0 homepage: https://flchart.dev/ repository: https://github.com/imaNNeo/fl_chart issue_tracker: https://github.com/imaNNeo/fl_chart/issues From 6b52a4e3d76e778e79f1ebb0daa245d3eec1982b Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Fri, 1 Dec 2023 02:28:12 +0100 Subject: [PATCH 065/149] Add pubspec constraints for newer version of flutter/dart, #1509 --- CHANGELOG.md | 3 +++ pubspec.yaml | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index db8203acb..2507639fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## newVersion +* **IMPROVEMENT** Add Flutter sdk constraints to the pubspec.yaml to force the user/developer to upgrade the Flutter version to 3.16.0 (latest), #1509 + ## 0.65.0 * **FEATURE** (by @Dartek12) Added gradient to [FlLine](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#FlLine), #1197 * **BUGFIX** (by @imaNNeo) Fix bar line shadow crash when we have only one (or zero) spot, #1466 diff --git a/pubspec.yaml b/pubspec.yaml index 94ee5910f..1d46a17f6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -7,7 +7,8 @@ issue_tracker: https://github.com/imaNNeo/fl_chart/issues documentation: https://github.com/imaNNeo/fl_chart environment: - sdk: ^3.0.0 + sdk: ^3.2.0 + flutter: ^3.16.0 funding: - https://github.com/sponsors/imaNNeo From 22b02c339493962307494254387a87796f8208de Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Sun, 3 Dec 2023 03:04:46 +0100 Subject: [PATCH 066/149] Use FlDotPainter to draw scatter spots --- .../scatter/scatter_chart_sample1.dart | 479 +++++++++++++++--- .../scatter/scatter_chart_sample2.dart | 78 +-- lib/src/chart/line_chart/line_chart_data.dart | 14 +- .../scatter_chart/scatter_chart_data.dart | 54 +- .../scatter_chart/scatter_chart_painter.dart | 54 +- 5 files changed, 521 insertions(+), 158 deletions(-) diff --git a/example/lib/presentation/samples/scatter/scatter_chart_sample1.dart b/example/lib/presentation/samples/scatter/scatter_chart_sample1.dart index 86125b19a..20e352199 100644 --- a/example/lib/presentation/samples/scatter/scatter_chart_sample1.dart +++ b/example/lib/presentation/samples/scatter/scatter_chart_sample1.dart @@ -61,114 +61,431 @@ class ScatterChartSample1State extends State { List flutterLogoData() { return [ /// section 1 - ScatterSpot(20, 14.5, color: widget.blue1, radius: radius), - ScatterSpot(22, 16.5, color: widget.blue1, radius: radius), - ScatterSpot(24, 18.5, color: widget.blue1, radius: radius), + ScatterSpot( + 20, + 14.5, + dotPainter: FlDotCirclePainter(color: widget.blue1, radius: radius), + ), + ScatterSpot( + 20, + 14.5, + dotPainter: FlDotCirclePainter(color: widget.blue1, radius: radius), + ), + ScatterSpot( + 22, + 16.5, + dotPainter: FlDotCirclePainter(color: widget.blue1, radius: radius), + ), + ScatterSpot( + 24, + 18.5, + dotPainter: FlDotCirclePainter(color: widget.blue1, radius: radius), + ), - ScatterSpot(22, 12.5, color: widget.blue1, radius: radius), - ScatterSpot(24, 14.5, color: widget.blue1, radius: radius), - ScatterSpot(26, 16.5, color: widget.blue1, radius: radius), + ScatterSpot( + 22, + 12.5, + dotPainter: FlDotCirclePainter(color: widget.blue1, radius: radius), + ), + ScatterSpot( + 24, + 14.5, + dotPainter: FlDotCirclePainter(color: widget.blue1, radius: radius), + ), + ScatterSpot( + 26, + 16.5, + dotPainter: FlDotCirclePainter(color: widget.blue1, radius: radius), + ), - ScatterSpot(24, 10.5, color: widget.blue1, radius: radius), - ScatterSpot(26, 12.5, color: widget.blue1, radius: radius), - ScatterSpot(28, 14.5, color: widget.blue1, radius: radius), + ScatterSpot( + 24, + 10.5, + dotPainter: FlDotCirclePainter(color: widget.blue1, radius: radius), + ), + ScatterSpot( + 26, + 12.5, + dotPainter: FlDotCirclePainter(color: widget.blue1, radius: radius), + ), + ScatterSpot( + 28, + 14.5, + dotPainter: FlDotCirclePainter(color: widget.blue1, radius: radius), + ), - ScatterSpot(26, 8.5, color: widget.blue1, radius: radius), - ScatterSpot(28, 10.5, color: widget.blue1, radius: radius), - ScatterSpot(30, 12.5, color: widget.blue1, radius: radius), + ScatterSpot( + 26, + 8.5, + dotPainter: FlDotCirclePainter(color: widget.blue1, radius: radius), + ), + ScatterSpot( + 28, + 10.5, + dotPainter: FlDotCirclePainter(color: widget.blue1, radius: radius), + ), + ScatterSpot( + 30, + 12.5, + dotPainter: FlDotCirclePainter(color: widget.blue1, radius: radius), + ), - ScatterSpot(28, 6.5, color: widget.blue1, radius: radius), - ScatterSpot(30, 8.5, color: widget.blue1, radius: radius), - ScatterSpot(32, 10.5, color: widget.blue1, radius: radius), + ScatterSpot( + 28, + 6.5, + dotPainter: FlDotCirclePainter(color: widget.blue1, radius: radius), + ), + ScatterSpot( + 30, + 8.5, + dotPainter: FlDotCirclePainter(color: widget.blue1, radius: radius), + ), + ScatterSpot( + 32, + 10.5, + dotPainter: FlDotCirclePainter(color: widget.blue1, radius: radius), + ), - ScatterSpot(30, 4.5, color: widget.blue1, radius: radius), - ScatterSpot(32, 6.5, color: widget.blue1, radius: radius), - ScatterSpot(34, 8.5, color: widget.blue1, radius: radius), + ScatterSpot( + 30, + 4.5, + dotPainter: FlDotCirclePainter(color: widget.blue1, radius: radius), + ), + ScatterSpot( + 32, + 6.5, + dotPainter: FlDotCirclePainter(color: widget.blue1, radius: radius), + ), + ScatterSpot( + 34, + 8.5, + dotPainter: FlDotCirclePainter(color: widget.blue1, radius: radius), + ), - ScatterSpot(34, 4.5, color: widget.blue1, radius: radius), - ScatterSpot(36, 6.5, color: widget.blue1, radius: radius), + ScatterSpot( + 34, + 4.5, + dotPainter: FlDotCirclePainter(color: widget.blue1, radius: radius), + ), + ScatterSpot( + 36, + 6.5, + dotPainter: FlDotCirclePainter(color: widget.blue1, radius: radius), + ), - ScatterSpot(38, 4.5, color: widget.blue1, radius: radius), + ScatterSpot( + 38, + 4.5, + dotPainter: FlDotCirclePainter(color: widget.blue1, radius: radius), + ), /// section 2 - ScatterSpot(20, 14.5, color: widget.blue2, radius: radius), - ScatterSpot(22, 12.5, color: widget.blue2, radius: radius), - ScatterSpot(24, 10.5, color: widget.blue2, radius: radius), + ScatterSpot( + 20, + 14.5, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 22, + 12.5, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 24, + 10.5, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), - ScatterSpot(22, 16.5, color: widget.blue2, radius: radius), - ScatterSpot(24, 14.5, color: widget.blue2, radius: radius), - ScatterSpot(26, 12.5, color: widget.blue2, radius: radius), + ScatterSpot( + 22, + 16.5, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 24, + 14.5, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 26, + 12.5, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), - ScatterSpot(24, 18.5, color: widget.blue2, radius: radius), - ScatterSpot(26, 16.5, color: widget.blue2, radius: radius), - ScatterSpot(28, 14.5, color: widget.blue2, radius: radius), + ScatterSpot( + 24, + 18.5, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 26, + 16.5, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 28, + 14.5, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), - ScatterSpot(26, 20.5, color: widget.blue2, radius: radius), - ScatterSpot(28, 18.5, color: widget.blue2, radius: radius), - ScatterSpot(30, 16.5, color: widget.blue2, radius: radius), + ScatterSpot( + 26, + 20.5, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 28, + 18.5, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 30, + 16.5, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), - ScatterSpot(28, 22.5, color: widget.blue2, radius: radius), - ScatterSpot(30, 20.5, color: widget.blue2, radius: radius), - ScatterSpot(32, 18.5, color: widget.blue2, radius: radius), + ScatterSpot( + 28, + 22.5, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 30, + 20.5, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 32, + 18.5, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), - ScatterSpot(30, 24.5, color: widget.blue2, radius: radius), - ScatterSpot(32, 22.5, color: widget.blue2, radius: radius), - ScatterSpot(34, 20.5, color: widget.blue2, radius: radius), + ScatterSpot( + 30, + 24.5, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 32, + 22.5, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 34, + 20.5, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), - ScatterSpot(34, 24.5, color: widget.blue2, radius: radius), - ScatterSpot(36, 22.5, color: widget.blue2, radius: radius), + ScatterSpot( + 34, + 24.5, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 36, + 22.5, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), - ScatterSpot(38, 24.5, color: widget.blue2, radius: radius), + ScatterSpot( + 38, + 24.5, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), /// section 3 - ScatterSpot(10, 25, color: widget.blue2, radius: radius), - ScatterSpot(12, 23, color: widget.blue2, radius: radius), - ScatterSpot(14, 21, color: widget.blue2, radius: radius), + ScatterSpot( + 10, + 25, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 12, + 23, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 14, + 21, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), - ScatterSpot(12, 27, color: widget.blue2, radius: radius), - ScatterSpot(14, 25, color: widget.blue2, radius: radius), - ScatterSpot(16, 23, color: widget.blue2, radius: radius), + ScatterSpot( + 12, + 27, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 14, + 25, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 16, + 23, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), - ScatterSpot(14, 29, color: widget.blue2, radius: radius), - ScatterSpot(16, 27, color: widget.blue2, radius: radius), - ScatterSpot(18, 25, color: widget.blue2, radius: radius), + ScatterSpot( + 14, + 29, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 16, + 27, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 18, + 25, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), - ScatterSpot(16, 31, color: widget.blue2, radius: radius), - ScatterSpot(18, 29, color: widget.blue2, radius: radius), - ScatterSpot(20, 27, color: widget.blue2, radius: radius), + ScatterSpot( + 16, + 31, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 18, + 29, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 20, + 27, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), - ScatterSpot(18, 33, color: widget.blue2, radius: radius), - ScatterSpot(20, 31, color: widget.blue2, radius: radius), - ScatterSpot(22, 29, color: widget.blue2, radius: radius), + ScatterSpot( + 18, + 33, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 20, + 31, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 22, + 29, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), - ScatterSpot(20, 35, color: widget.blue2, radius: radius), - ScatterSpot(22, 33, color: widget.blue2, radius: radius), - ScatterSpot(24, 31, color: widget.blue2, radius: radius), + ScatterSpot( + 20, + 35, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 22, + 33, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 24, + 31, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), - ScatterSpot(22, 37, color: widget.blue2, radius: radius), - ScatterSpot(24, 35, color: widget.blue2, radius: radius), - ScatterSpot(26, 33, color: widget.blue2, radius: radius), + ScatterSpot( + 22, + 37, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 24, + 35, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 26, + 33, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), - ScatterSpot(24, 39, color: widget.blue2, radius: radius), - ScatterSpot(26, 37, color: widget.blue2, radius: radius), - ScatterSpot(28, 35, color: widget.blue2, radius: radius), + ScatterSpot( + 24, + 39, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 26, + 37, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 28, + 35, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), - ScatterSpot(26, 41, color: widget.blue2, radius: radius), - ScatterSpot(28, 39, color: widget.blue2, radius: radius), - ScatterSpot(30, 37, color: widget.blue2, radius: radius), + ScatterSpot( + 26, + 41, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 28, + 39, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 30, + 37, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), - ScatterSpot(28, 43, color: widget.blue2, radius: radius), - ScatterSpot(30, 41, color: widget.blue2, radius: radius), - ScatterSpot(32, 39, color: widget.blue2, radius: radius), + ScatterSpot( + 28, + 43, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 30, + 41, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 32, + 39, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), - ScatterSpot(30, 45, color: widget.blue2, radius: radius), - ScatterSpot(32, 43, color: widget.blue2, radius: radius), - ScatterSpot(34, 41, color: widget.blue2, radius: radius), + ScatterSpot( + 30, + 45, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 32, + 43, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 34, + 41, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), - ScatterSpot(34, 45, color: widget.blue2, radius: radius), - ScatterSpot(36, 43, color: widget.blue2, radius: radius), + ScatterSpot( + 34, + 45, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), + ScatterSpot( + 36, + 43, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), - ScatterSpot(38, 45, color: widget.blue2, radius: radius), + ScatterSpot( + 38, + 45, + dotPainter: FlDotCirclePainter(color: widget.blue2, radius: radius), + ), ]; } @@ -186,8 +503,10 @@ class ScatterChartSample1State extends State { return ScatterSpot( (Random().nextDouble() * (maxX - 8)) + 4, (Random().nextDouble() * (maxY - 8)) + 4, - color: color, - radius: (Random().nextDouble() * 16) + 4, + dotPainter: FlDotCirclePainter( + color: color, + radius: (Random().nextDouble() * 16) + 4, + ), ); }); } diff --git a/example/lib/presentation/samples/scatter/scatter_chart_sample2.dart b/example/lib/presentation/samples/scatter/scatter_chart_sample2.dart index 242ce01af..c216c6fb9 100644 --- a/example/lib/presentation/samples/scatter/scatter_chart_sample2.dart +++ b/example/lib/presentation/samples/scatter/scatter_chart_sample2.dart @@ -26,65 +26,81 @@ class _ScatterChartSample2State extends State { ScatterSpot( 4, 4, - color: selectedSpots.contains(0) - ? AppColors.contentColorGreen - : AppColors.contentColorWhite.withOpacity(0.5), + dotPainter: FlDotCirclePainter( + color: selectedSpots.contains(0) + ? AppColors.contentColorGreen + : AppColors.contentColorWhite.withOpacity(0.5), + ), ), ScatterSpot( 2, 5, - color: selectedSpots.contains(1) - ? AppColors.contentColorYellow - : AppColors.contentColorWhite.withOpacity(0.5), - radius: 12, + dotPainter: FlDotCirclePainter( + color: selectedSpots.contains(1) + ? AppColors.contentColorYellow + : AppColors.contentColorWhite.withOpacity(0.5), + radius: 12, + ), ), ScatterSpot( 4, 5, - color: selectedSpots.contains(2) - ? AppColors.contentColorPink - : AppColors.contentColorWhite.withOpacity(0.5), - radius: 8, + dotPainter: FlDotCirclePainter( + color: selectedSpots.contains(2) + ? AppColors.contentColorPink + : AppColors.contentColorWhite.withOpacity(0.5), + radius: 8, + ), ), ScatterSpot( 8, 6, - color: selectedSpots.contains(3) - ? AppColors.contentColorOrange - : AppColors.contentColorWhite.withOpacity(0.5), - radius: 20, + dotPainter: FlDotCirclePainter( + color: selectedSpots.contains(3) + ? AppColors.contentColorOrange + : AppColors.contentColorWhite.withOpacity(0.5), + radius: 20, + ), ), ScatterSpot( 5, 7, - color: selectedSpots.contains(4) - ? AppColors.contentColorPurple - : AppColors.contentColorWhite.withOpacity(0.5), - radius: 14, + dotPainter: FlDotCirclePainter( + color: selectedSpots.contains(4) + ? AppColors.contentColorPurple + : AppColors.contentColorWhite.withOpacity(0.5), + radius: 14, + ), ), ScatterSpot( 7, 2, - color: selectedSpots.contains(5) - ? AppColors.contentColorBlue - : AppColors.contentColorWhite.withOpacity(0.5), - radius: 18, + dotPainter: FlDotCirclePainter( + color: selectedSpots.contains(5) + ? AppColors.contentColorBlue + : AppColors.contentColorWhite.withOpacity(0.5), + radius: 18, + ), ), ScatterSpot( 3, 2, - color: selectedSpots.contains(6) - ? AppColors.contentColorRed - : AppColors.contentColorWhite.withOpacity(0.5), - radius: 36, + dotPainter: FlDotCirclePainter( + color: selectedSpots.contains(6) + ? AppColors.contentColorRed + : AppColors.contentColorWhite.withOpacity(0.5), + radius: 36, + ), ), ScatterSpot( 2, 8, - color: selectedSpots.contains(7) - ? AppColors.contentColorCyan - : AppColors.contentColorWhite.withOpacity(0.5), - radius: 22, + dotPainter: FlDotCirclePainter( + color: selectedSpots.contains(7) + ? AppColors.contentColorCyan + : AppColors.contentColorWhite.withOpacity(0.5), + radius: 22, + ), ), ], minX: 0, diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index 3985e76eb..e1ad5ab8c 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -805,6 +805,9 @@ abstract class FlDotPainter with EquatableMixin { /// This method should be overridden to return the size of the shape. Size getSize(FlSpot spot); + + /// Used to show default UIs, for example [defaultScatterTooltipItem] + Color get mainColor; } /// This class is an implementation of a [FlDotPainter] that draws @@ -819,7 +822,7 @@ class FlDotCirclePainter extends FlDotPainter { this.color = Colors.green, double? radius, this.strokeColor = const Color.fromRGBO(76, 175, 80, 1), - this.strokeWidth = 1.0, + this.strokeWidth = 0.0, }) : radius = radius ?? 4.0; /// The fill color to use for the circle @@ -862,6 +865,9 @@ class FlDotCirclePainter extends FlDotPainter { return Size(radius * 2, radius * 2); } + @override + Color get mainColor => color; + /// Used for equality check, see [EquatableMixin]. @override List get props => [ @@ -931,6 +937,9 @@ class FlDotSquarePainter extends FlDotPainter { return Size(size, size); } + @override + Color get mainColor => color; + /// Used for equality check, see [EquatableMixin]. @override List get props => [ @@ -986,6 +995,9 @@ class FlDotCrossPainter extends FlDotPainter { return Size(size, size); } + @override + Color get mainColor => color; + /// Used for equality check, see [EquatableMixin]. @override List get props => [ diff --git a/lib/src/chart/scatter_chart/scatter_chart_data.dart b/lib/src/chart/scatter_chart/scatter_chart_data.dart index 10ef2ded7..0fe086b04 100644 --- a/lib/src/chart/scatter_chart/scatter_chart_data.dart +++ b/lib/src/chart/scatter_chart/scatter_chart_data.dart @@ -186,36 +186,43 @@ class ScatterSpot extends FlSpot with EquatableMixin { super.x, super.y, { bool? show, - double? radius, - Color? color, + FlDotPainter? dotPainter, }) : show = show ?? true, - radius = radius ?? 6, - color = color ?? - Colors.primaries[((x * y) % Colors.primaries.length).toInt()]; + dotPainter = dotPainter ?? + FlDotCirclePainter( + radius: 6, + color: + Colors.primaries[((x * y) % Colors.primaries.length).toInt()], + ); /// Determines show or hide the spot. final bool show; - /// Determines size of the spot. - final double radius; + /// Determines shape of the spot + final FlDotPainter dotPainter; - /// Determines color of the spot. - Color color; + Size get size => dotPainter.getSize(this); + + String get defaultLabel { + if (dotPainter is FlDotCirclePainter) { + return '${(dotPainter as FlDotCirclePainter).radius.toInt()}'; + } else { + return '${x.toInt()}, ${y.toInt()}'; + } + } @override ScatterSpot copyWith({ double? x, double? y, bool? show, - double? radius, - Color? color, + FlDotPainter? dotPainter, }) { return ScatterSpot( x ?? this.x, y ?? this.y, show: show ?? this.show, - radius: radius ?? this.radius, - color: color ?? this.color, + dotPainter: dotPainter ?? this.dotPainter, ); } @@ -225,8 +232,7 @@ class ScatterSpot extends FlSpot with EquatableMixin { lerpDouble(a.x, b.x, t)!, lerpDouble(a.y, b.y, t)!, show: b.show, - radius: lerpDouble(a.radius, b.radius, t), - color: Color.lerp(a.color, b.color, t), + dotPainter: b.dotPainter, ); } @@ -236,8 +242,7 @@ class ScatterSpot extends FlSpot with EquatableMixin { x, y, show, - radius, - color, + dotPainter, ]; } @@ -517,12 +522,18 @@ typedef GetScatterTooltipItems = ScatterTooltipItem? Function( /// Default implementation for [ScatterTouchTooltipData.getTooltipItems]. ScatterTooltipItem? defaultScatterTooltipItem(ScatterSpot touchedSpot) { final textStyle = TextStyle( - color: touchedSpot.color, + color: touchedSpot.dotPainter.mainColor, fontWeight: FontWeight.bold, fontSize: 14, ); + String text; + if (touchedSpot.dotPainter is FlDotCirclePainter) { + text = '${(touchedSpot.dotPainter as FlDotCirclePainter).radius.toInt()}'; + } else { + text = '${touchedSpot.x.toInt()}, ${touchedSpot.y.toInt()}'; + } return ScatterTooltipItem( - '${touchedSpot.radius.toInt()}', + text, textStyle: textStyle, ); } @@ -630,9 +641,8 @@ TextStyle? getDefaultLabelTextStyleFunction( String getDefaultLabelFunction( int spotIndex, ScatterSpot spot, -) { - return '${spot.radius}'; -} +) => + spot.defaultLabel; /// Defines information about the labels in the [ScatterChart] class ScatterLabelSettings with EquatableMixin { diff --git a/lib/src/chart/scatter_chart/scatter_chart_painter.dart b/lib/src/chart/scatter_chart/scatter_chart_painter.dart index 773ceea7a..ef8a928ad 100644 --- a/lib/src/chart/scatter_chart/scatter_chart_painter.dart +++ b/lib/src/chart/scatter_chart/scatter_chart_painter.dart @@ -16,8 +16,6 @@ class ScatterChartPainter extends AxisChartPainter { /// parent can use [MediaQuery.textScaleFactor] to respect /// the system's font size. ScatterChartPainter() : super() { - _spotsPaint = Paint()..style = PaintingStyle.fill; - _bgTouchTooltipPaint = Paint() ..style = PaintingStyle.fill ..color = Colors.white; @@ -28,8 +26,6 @@ class ScatterChartPainter extends AxisChartPainter { ..strokeWidth = 1.0; } - /// [_spotsPaint] is responsible to draw scatter spots - late Paint _spotsPaint; late Paint _bgTouchTooltipPaint; late Paint _borderTouchTooltipPaint; @@ -92,22 +88,17 @@ class ScatterChartPainter extends AxisChartPainter { canvasWrapper.clipRect(Rect.fromLTRB(left, top, right, bottom)); } - final sortedSpots = data.scatterSpots.toList() - ..sort((ScatterSpot a, ScatterSpot b) => b.radius.compareTo(a.radius)); - - for (final scatterSpot in sortedSpots) { + for (final scatterSpot in data.scatterSpots) { if (!scatterSpot.show) { continue; } final pixelX = getPixelX(scatterSpot.x, viewSize, holder); final pixelY = getPixelY(scatterSpot.y, viewSize, holder); - _spotsPaint.color = scatterSpot.color; - - canvasWrapper.drawCircle( + canvasWrapper.drawDot( + scatterSpot.dotPainter, + scatterSpot, Offset(pixelX, pixelY), - scatterSpot.radius, - _spotsPaint, ); } @@ -151,23 +142,23 @@ class ScatterChartPainter extends AxisChartPainter { final centerChartY = viewSize.height / 2; + final radius = scatterSpot.dotPainter.getSize(scatterSpot).width / 2; + /// if the spot is in the lower half of the chart, then draw the label either in the center or above the spot, /// if the spot is in upper half of the chart, then draw the label either in the center or below the spot. if (pixelY > centerChartY) { /// if either the height or the width of the spot is greater than the radius of the spot, then draw the label above the bubble, /// else draw the label inside the bubble. - final off = (scatterSpot.radius * 1.5 < tp.height || - scatterSpot.radius * 1.5 < tp.width) - ? scatterSpot.radius + tp.height + final off = (radius * 1.5 < tp.height || radius * 1.5 < tp.width) + ? radius + tp.height : tp.height / 2; newPixelY = pixelY - off; } else { /// if either the height or the width of the spot is greater than the radius of the spot, then draw the label below the bubble, /// else draw the label inside the bubble. - final off = (scatterSpot.radius * 1.5 < tp.height || - scatterSpot.radius * 1.5 < tp.width) - ? scatterSpot.radius + final off = (radius * 1.5 < tp.height || radius * 1.5 < tp.width) + ? radius : -tp.height / 2; newPixelY = pixelY + off; } @@ -262,7 +253,7 @@ class ScatterChartPainter extends AxisChartPainter { tooltipLeftPosition, mostTopOffset.dy - tooltipHeight - - showOnSpot.radius - + (showOnSpot.size.height / 2) - tooltipItem.bottomMargin, tooltipWidth, tooltipHeight, @@ -377,12 +368,27 @@ class ScatterChartPainter extends AxisChartPainter { final spotPixelX = getPixelX(spot.x, viewSize, holder); final spotPixelY = getPixelY(spot.y, viewSize, holder); + final center = Offset(spotPixelX, spotPixelY); - final distance = - (localPosition - Offset(spotPixelX, spotPixelY)).distance; + if (spot.dotPainter is FlDotCirclePainter) { + final radius = (spot.dotPainter as FlDotCirclePainter).radius; + final distance = (localPosition - center).distance.abs(); - if (distance < spot.radius + data.scatterTouchData.touchSpotThreshold) { - return ScatterTouchedSpot(spot, i); + if (distance < radius + data.scatterTouchData.touchSpotThreshold) { + return ScatterTouchedSpot(spot, i); + } + } else { + final spotRect = Rect.fromCenter( + center: center, + width: spot.size.width, + height: spot.size.height, + ); + final thresholdRect = spotRect.inflate( + data.scatterTouchData.touchSpotThreshold, + ); + if (thresholdRect.contains(localPosition)) { + return ScatterTouchedSpot(spot, i); + } } } return null; From bb7b8850a35605134e0d0c8e51a9e76d2426541f Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Sun, 3 Dec 2023 03:07:40 +0100 Subject: [PATCH 067/149] Update CHANGELOG.md --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2507639fa..ee4195509 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ ## newVersion -* **IMPROVEMENT** Add Flutter sdk constraints to the pubspec.yaml to force the user/developer to upgrade the Flutter version to 3.16.0 (latest), #1509 +* **IMPROVEMENT** (by @imaNNeo) Add Flutter sdk constraints to the pubspec.yaml to force the user/developer to upgrade the Flutter version to 3.16.0 (latest), #1509 +* **IMPROVEMENT** (by @imaNNeo) Add `dotPainter` property to ScatterSpot to allow customizing the dot painter, #568 +* **BREAKING** (by @imaNNeo) Remove `color` and `radius` properties from ScatterSpot (use `dotPainter` instead), #568 +* **BREAKING** (by @imaNNeo) Change the default value of FlDotCirclePainter.`strokeWidth` to 0.0 ## 0.65.0 * **FEATURE** (by @Dartek12) Added gradient to [FlLine](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#FlLine), #1197 From a99a3ddc3c92258def9c799a3a16e2bdea770b77 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Sun, 3 Dec 2023 20:03:37 +0100 Subject: [PATCH 068/149] Fix some test issues --- .../scatter_chart/scatter_chart_data.dart | 2 +- test/chart/data_pool.dart | 51 +++++++++++--- .../scatter_chart_data_test.dart | 44 ++++++++++--- .../scatter_chart_painter_test.dart | 66 +++++++++---------- test/utils/lerp_test.dart | 12 +++- 5 files changed, 121 insertions(+), 54 deletions(-) diff --git a/lib/src/chart/scatter_chart/scatter_chart_data.dart b/lib/src/chart/scatter_chart/scatter_chart_data.dart index 0fe086b04..ee19fd21f 100644 --- a/lib/src/chart/scatter_chart/scatter_chart_data.dart +++ b/lib/src/chart/scatter_chart/scatter_chart_data.dart @@ -232,7 +232,7 @@ class ScatterSpot extends FlSpot with EquatableMixin { lerpDouble(a.x, b.x, t)!, lerpDouble(a.y, b.y, t)!, show: b.show, - dotPainter: b.dotPainter, + dotPainter: t == 0 ? a.dotPainter : b.dotPainter, ); } diff --git a/test/chart/data_pool.dart b/test/chart/data_pool.dart index 2bb1f1315..d60bef0fa 100644 --- a/test/chart/data_pool.dart +++ b/test/chart/data_pool.dart @@ -275,11 +275,31 @@ class MockData { radius: 4, ); - static final scatterSpot0 = ScatterSpot(0, 0, color: color0); - static final scatterSpot1 = ScatterSpot(1, 1, color: color1); - static final scatterSpot2 = ScatterSpot(2, 2, color: color2); - static final scatterSpot3 = ScatterSpot(3, 3, color: color3); - static final scatterSpot4 = ScatterSpot(4, 4, color: color4); + static final scatterSpot0 = ScatterSpot( + 0, + 0, + dotPainter: FlDotCirclePainter(color: color0), + ); + static final scatterSpot1 = ScatterSpot( + 1, + 1, + dotPainter: FlDotCirclePainter(color: color1), + ); + static final scatterSpot2 = ScatterSpot( + 2, + 2, + dotPainter: FlDotCirclePainter(color: color2), + ); + static final scatterSpot3 = ScatterSpot( + 3, + 3, + dotPainter: FlDotCirclePainter(color: color3), + ); + static final scatterSpot4 = ScatterSpot( + 4, + 4, + dotPainter: FlDotCirclePainter(color: color4), + ); static final scatterTouchedSpot = ScatterTouchedSpot(scatterSpot1, 0); @@ -2251,9 +2271,24 @@ final ScatterChartData scatterChartData1 = ScatterChartData( ), ), scatterSpots: [ - ScatterSpot(0, 0, show: false, radius: 33, color: Colors.yellow), - ScatterSpot(2, 2, show: false, radius: 11, color: Colors.purple), - ScatterSpot(1, 2, show: false, radius: 11, color: Colors.white), + ScatterSpot( + 0, + 0, + show: false, + dotPainter: FlDotCirclePainter(radius: 33, color: Colors.yellow), + ), + ScatterSpot( + 2, + 2, + show: false, + dotPainter: FlDotCirclePainter(radius: 11, color: Colors.purple), + ), + ScatterSpot( + 1, + 2, + show: false, + dotPainter: FlDotCirclePainter(radius: 11, color: Colors.white), + ), ], scatterTouchData: ScatterTouchData( enabled: true, diff --git a/test/chart/scatter_chart/scatter_chart_data_test.dart b/test/chart/scatter_chart/scatter_chart_data_test.dart index 273562b46..671468402 100644 --- a/test/chart/scatter_chart/scatter_chart_data_test.dart +++ b/test/chart/scatter_chart/scatter_chart_data_test.dart @@ -45,17 +45,29 @@ void main() { 0, 0, show: false, - radius: 33, - color: Colors.yellow, + dotPainter: FlDotCirclePainter( + radius: 33, + color: Colors.yellow, + ), ), ScatterSpot( 2, 2, show: false, - radius: 11, - color: Colors.purple, + dotPainter: FlDotCirclePainter( + radius: 11, + color: Colors.purple, + ), + ), + ScatterSpot( + 1, + 2, + show: false, + dotPainter: FlDotCirclePainter( + radius: 11, + color: Colors.white, + ), ), - ScatterSpot(1, 2, show: false, radius: 11, color: Colors.white), ], ), true, @@ -68,17 +80,29 @@ void main() { 2, 2, show: false, - radius: 11, - color: Colors.purple, + dotPainter: FlDotCirclePainter( + radius: 11, + color: Colors.purple, + ), ), ScatterSpot( 0, 0, show: false, - radius: 33, - color: Colors.yellow, + dotPainter: FlDotCirclePainter( + radius: 33, + color: Colors.yellow, + ), + ), + ScatterSpot( + 1, + 2, + show: false, + dotPainter: FlDotCirclePainter( + radius: 11, + color: Colors.white, + ), ), - ScatterSpot(1, 2, show: false, radius: 11, color: Colors.white), ], ), false, diff --git a/test/chart/scatter_chart/scatter_chart_painter_test.dart b/test/chart/scatter_chart/scatter_chart_painter_test.dart index 87346c993..351f6c03e 100644 --- a/test/chart/scatter_chart/scatter_chart_painter_test.dart +++ b/test/chart/scatter_chart/scatter_chart_painter_test.dart @@ -62,7 +62,7 @@ void main() { holder, ); - verify(mockCanvasWrapper.drawCircle(any, any, any)).called(3); + verify(mockCanvasWrapper.drawDot(any, any, any)).called(3); Utils.changeInstance(utilsMainInstance); }); }); @@ -71,17 +71,20 @@ void main() { test('test 1', () { const viewSize = Size(100, 100); + final dotPainter1 = FlDotCirclePainter(radius: 18); + final dotPainter3 = FlDotCirclePainter(radius: 4); + final dotPainter4 = FlDotCirclePainter(radius: 6); + + final spot1 = ScatterSpot(1, 1, dotPainter: dotPainter1); + final spot2 = ScatterSpot(3, 9, show: false); + final spot3 = ScatterSpot(8, 2, dotPainter: dotPainter3); + final spot4 = ScatterSpot(7, 5, dotPainter: dotPainter4); final data = ScatterChartData( minY: 0, maxY: 10, minX: 0, maxX: 10, - scatterSpots: [ - ScatterSpot(1, 1, radius: 18), - ScatterSpot(3, 9, show: false), - ScatterSpot(8, 2, radius: 4), - ScatterSpot(7, 5, radius: 6), - ], + scatterSpots: [spot1, spot2, spot3, spot4], titlesData: const FlTitlesData(show: false), clipData: const FlClipData.all(), ); @@ -103,12 +106,9 @@ void main() { holder, ); - verify(mockCanvasWrapper.drawCircle(const Offset(10, 90), 18, any)) - .called(1); - verify(mockCanvasWrapper.drawCircle(const Offset(80, 80), 4, any)) - .called(1); - verify(mockCanvasWrapper.drawCircle(const Offset(70, 50), 6, any)) - .called(1); + verify(mockCanvasWrapper.drawDot(dotPainter1, spot1, const Offset(10, 90))).called(1); + verify(mockCanvasWrapper.drawDot(dotPainter3, spot3, const Offset(80, 80))).called(1); + verify(mockCanvasWrapper.drawDot(dotPainter4, spot4, const Offset(70, 50))).called(1); verifyNever(mockCanvasWrapper.drawText(any, any)); verify(mockCanvasWrapper.clipRect(any)).called(1); @@ -164,12 +164,12 @@ void main() { minX: 0, maxX: 10, scatterSpots: [ - ScatterSpot(1, 1, radius: 18), - ScatterSpot(2, 2, radius: 8), + ScatterSpot(1, 1, dotPainter: FlDotCirclePainter(radius: 18)), + ScatterSpot(2, 2, dotPainter: FlDotCirclePainter(radius: 8)), ScatterSpot(3, 9, show: false), - ScatterSpot(8, 8, radius: 4), - ScatterSpot(7, 5, radius: 20), - ScatterSpot(4, 6, radius: 24), + ScatterSpot(8, 8, dotPainter: FlDotCirclePainter(radius: 4)), + ScatterSpot(7, 5, dotPainter: FlDotCirclePainter(radius: 20)), + ScatterSpot(4, 6, dotPainter: FlDotCirclePainter(radius: 24)), ], titlesData: const FlTitlesData(show: false), clipData: const FlClipData.all(), @@ -210,15 +210,15 @@ void main() { holder, ); - verify(mockCanvasWrapper.drawCircle(const Offset(10, 90), 18, any)) + verify(mockCanvasWrapper.drawDot(any, data.scatterSpots[0], const Offset(10, 90))) .called(1); - verify(mockCanvasWrapper.drawCircle(const Offset(20, 80), 8, any)) + verify(mockCanvasWrapper.drawDot(any, data.scatterSpots[1], const Offset(20, 80))) .called(1); - verify(mockCanvasWrapper.drawCircle(const Offset(80, 20), 4, any)) + verify(mockCanvasWrapper.drawDot(any, data.scatterSpots[3], const Offset(80, 20))) .called(1); - verify(mockCanvasWrapper.drawCircle(const Offset(70, 50), 20, any)) + verify(mockCanvasWrapper.drawDot(any, data.scatterSpots[4], const Offset(70, 50))) .called(1); - verify(mockCanvasWrapper.drawCircle(const Offset(40, 40), 24, any)) + verify(mockCanvasWrapper.drawDot(any, data.scatterSpots[5], const Offset(40, 40))) .called(1); verify(mockCanvasWrapper.drawText(any, any)).called(4); @@ -237,10 +237,10 @@ void main() { minX: 0, maxX: 10, scatterSpots: [ - ScatterSpot(1, 1, radius: 18), + ScatterSpot(1, 1, dotPainter: FlDotCirclePainter(radius: 18)), ScatterSpot(3, 9, show: false), - ScatterSpot(8, 2, radius: 4), - ScatterSpot(7, 5, radius: 6), + ScatterSpot(8, 2, dotPainter: FlDotCirclePainter(radius: 4)), + ScatterSpot(7, 5, dotPainter: FlDotCirclePainter(radius: 6)), ], showingTooltipIndicators: [0, 2, 3], titlesData: const FlTitlesData(show: false), @@ -287,10 +287,10 @@ void main() { minX: 0, maxX: 10, scatterSpots: [ - ScatterSpot(1, 1, radius: 18), + ScatterSpot(1, 1, dotPainter: FlDotCirclePainter(radius: 18)), ScatterSpot(3, 9, show: false), - ScatterSpot(8, 2, radius: 4), - ScatterSpot(7, 5, radius: 6), + ScatterSpot(8, 2, dotPainter: FlDotCirclePainter(radius: 4)), + ScatterSpot(7, 5, dotPainter: FlDotCirclePainter(radius: 6)), ], showingTooltipIndicators: [0, 2, 3], scatterTouchData: ScatterTouchData( @@ -657,7 +657,7 @@ void main() { final spots = [ ScatterSpot(1, 1), ScatterSpot(2, 4), - ScatterSpot(5, 2, radius: 0.5), + ScatterSpot(5, 2, dotPainter: FlDotCirclePainter(radius: 0.5)), ScatterSpot(8, 7), ]; @@ -704,7 +704,7 @@ void main() { ); expect(touchedSpot4, null); - final radius = spots[2].radius; + final radius = spots[2].size.width / 2; final touchedSpot5 = scatterChartPainter.handleTouch( Offset( 50 + (math.cos(math.pi / 4) * radius) - 0.01, @@ -731,7 +731,7 @@ void main() { final spots = [ ScatterSpot(1, 1), ScatterSpot(2, 4), - ScatterSpot(5, 2, radius: 0.5), + ScatterSpot(5, 2, dotPainter: FlDotCirclePainter(radius: 0.5)), ScatterSpot(8, 7), ]; @@ -807,7 +807,7 @@ void main() { ); expect(touchedSpot4, null); - final radius = spots[2].radius; + final radius = spots[2].size.width / 2; final touchedSpot5 = scatterChartPainter.handleTouch( Offset( 50 + (math.cos(math.pi / 4) * radius) - 0.01, diff --git a/test/utils/lerp_test.dart b/test/utils/lerp_test.dart index 59eb947ff..c10a1124d 100644 --- a/test/utils/lerp_test.dart +++ b/test/utils/lerp_test.dart @@ -358,9 +358,17 @@ void main() { MockData.scatterSpot4, ]); expect(lerpScatterSpotList(list1, list2, 0.5), [ - ScatterSpot(0.5, 0.5, color: const Color(0x08080808)), + ScatterSpot( + 0.5, + 0.5, + dotPainter: FlDotCirclePainter(color: const Color(0x08080808)), + ), MockData.scatterSpot1, - ScatterSpot(1.5, 1.5, color: const Color(0x19191919)), + ScatterSpot( + 1.5, + 1.5, + dotPainter: FlDotCirclePainter(color: const Color(0x19191919)), + ), MockData.scatterSpot4, ]); expect(lerpScatterSpotList(list1, list2, 1), list2); From 256e2ccc97abde66c7f27c434cb5db725940af49 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Sun, 3 Dec 2023 20:24:58 +0100 Subject: [PATCH 069/149] Implement lerp method for FlDotPainter --- lib/src/chart/line_chart/line_chart_data.dart | 64 +++++++++++++++++ .../scatter_chart/scatter_chart_data.dart | 2 +- .../scatter_chart_painter_test.dart | 69 +++++++++++++++---- 3 files changed, 121 insertions(+), 14 deletions(-) diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index e1ad5ab8c..fb1fb616c 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -808,6 +808,8 @@ abstract class FlDotPainter with EquatableMixin { /// Used to show default UIs, for example [defaultScatterTooltipItem] Color get mainColor; + + FlDotPainter lerp(FlDotPainter a, FlDotPainter b, double t); } /// This class is an implementation of a [FlDotPainter] that draws @@ -876,6 +878,27 @@ class FlDotCirclePainter extends FlDotPainter { strokeColor, strokeWidth, ]; + + FlDotCirclePainter _lerp( + FlDotCirclePainter a, + FlDotCirclePainter b, + double t, + ) { + return FlDotCirclePainter( + color: Color.lerp(a.color, b.color, t)!, + radius: lerpDouble(a.radius, b.radius, t), + strokeColor: Color.lerp(a.strokeColor, b.strokeColor, t)!, + strokeWidth: lerpDouble(a.strokeWidth, b.strokeWidth, t)!, + ); + } + + @override + FlDotPainter lerp(FlDotPainter a, FlDotPainter b, double t) { + if (a is! FlDotCirclePainter || b is! FlDotCirclePainter) { + return b; + } + return _lerp(a, b, t); + } } /// This class is an implementation of a [FlDotPainter] that draws @@ -948,6 +971,27 @@ class FlDotSquarePainter extends FlDotPainter { strokeColor, strokeWidth, ]; + + FlDotSquarePainter _lerp( + FlDotSquarePainter a, + FlDotSquarePainter b, + double t, + ) { + return FlDotSquarePainter( + color: Color.lerp(a.color, b.color, t)!, + size: lerpDouble(a.size, b.size, t)!, + strokeColor: Color.lerp(a.strokeColor, b.strokeColor, t)!, + strokeWidth: lerpDouble(a.strokeWidth, b.strokeWidth, t)!, + ); + } + + @override + FlDotPainter lerp(FlDotPainter a, FlDotPainter b, double t) { + if (a is! FlDotSquarePainter || b is! FlDotSquarePainter) { + return b; + } + return _lerp(a, b, t); + } } /// This class is an implementation of a [FlDotPainter] that draws @@ -998,6 +1042,26 @@ class FlDotCrossPainter extends FlDotPainter { @override Color get mainColor => color; + FlDotCrossPainter _lerp( + FlDotCrossPainter a, + FlDotCrossPainter b, + double t, + ) { + return FlDotCrossPainter( + color: Color.lerp(a.color, b.color, t)!, + size: lerpDouble(a.size, b.size, t)!, + width: lerpDouble(a.width, b.width, t)!, + ); + } + + @override + FlDotPainter lerp(FlDotPainter a, FlDotPainter b, double t) { + if (a is! FlDotCrossPainter || b is! FlDotCrossPainter) { + return b; + } + return _lerp(a, b, t); + } + /// Used for equality check, see [EquatableMixin]. @override List get props => [ diff --git a/lib/src/chart/scatter_chart/scatter_chart_data.dart b/lib/src/chart/scatter_chart/scatter_chart_data.dart index ee19fd21f..b32f26d37 100644 --- a/lib/src/chart/scatter_chart/scatter_chart_data.dart +++ b/lib/src/chart/scatter_chart/scatter_chart_data.dart @@ -232,7 +232,7 @@ class ScatterSpot extends FlSpot with EquatableMixin { lerpDouble(a.x, b.x, t)!, lerpDouble(a.y, b.y, t)!, show: b.show, - dotPainter: t == 0 ? a.dotPainter : b.dotPainter, + dotPainter: a.dotPainter.lerp(a.dotPainter, b.dotPainter, t), ); } diff --git a/test/chart/scatter_chart/scatter_chart_painter_test.dart b/test/chart/scatter_chart/scatter_chart_painter_test.dart index 351f6c03e..3664d910d 100644 --- a/test/chart/scatter_chart/scatter_chart_painter_test.dart +++ b/test/chart/scatter_chart/scatter_chart_painter_test.dart @@ -106,9 +106,27 @@ void main() { holder, ); - verify(mockCanvasWrapper.drawDot(dotPainter1, spot1, const Offset(10, 90))).called(1); - verify(mockCanvasWrapper.drawDot(dotPainter3, spot3, const Offset(80, 80))).called(1); - verify(mockCanvasWrapper.drawDot(dotPainter4, spot4, const Offset(70, 50))).called(1); + verify( + mockCanvasWrapper.drawDot( + dotPainter1, + spot1, + const Offset(10, 90), + ), + ).called(1); + verify( + mockCanvasWrapper.drawDot( + dotPainter3, + spot3, + const Offset(80, 80), + ), + ).called(1); + verify( + mockCanvasWrapper.drawDot( + dotPainter4, + spot4, + const Offset(70, 50), + ), + ).called(1); verifyNever(mockCanvasWrapper.drawText(any, any)); verify(mockCanvasWrapper.clipRect(any)).called(1); @@ -210,16 +228,41 @@ void main() { holder, ); - verify(mockCanvasWrapper.drawDot(any, data.scatterSpots[0], const Offset(10, 90))) - .called(1); - verify(mockCanvasWrapper.drawDot(any, data.scatterSpots[1], const Offset(20, 80))) - .called(1); - verify(mockCanvasWrapper.drawDot(any, data.scatterSpots[3], const Offset(80, 20))) - .called(1); - verify(mockCanvasWrapper.drawDot(any, data.scatterSpots[4], const Offset(70, 50))) - .called(1); - verify(mockCanvasWrapper.drawDot(any, data.scatterSpots[5], const Offset(40, 40))) - .called(1); + verify( + mockCanvasWrapper.drawDot( + any, + data.scatterSpots[0], + const Offset(10, 90), + ), + ).called(1); + verify( + mockCanvasWrapper.drawDot( + any, + data.scatterSpots[1], + const Offset(20, 80), + ), + ).called(1); + verify( + mockCanvasWrapper.drawDot( + any, + data.scatterSpots[3], + const Offset(80, 20), + ), + ).called(1); + verify( + mockCanvasWrapper.drawDot( + any, + data.scatterSpots[4], + const Offset(70, 50), + ), + ).called(1); + verify( + mockCanvasWrapper.drawDot( + any, + data.scatterSpots[5], + const Offset(40, 40), + ), + ).called(1); verify(mockCanvasWrapper.drawText(any, any)).called(4); From ae7432fb3c709aec349e99ed8641345964ffb11d Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Sun, 3 Dec 2023 20:53:06 +0100 Subject: [PATCH 070/149] Define customized hitTest for different FlDotPainters --- lib/src/chart/line_chart/line_chart_data.dart | 48 +++++++++++++++---- .../scatter_chart/scatter_chart_painter.dart | 27 ++++------- 2 files changed, 47 insertions(+), 28 deletions(-) diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index fb1fb616c..407ee0cb0 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -810,6 +810,25 @@ abstract class FlDotPainter with EquatableMixin { Color get mainColor; FlDotPainter lerp(FlDotPainter a, FlDotPainter b, double t); + + /// Used to implement touch behaviour of this dot, for example, + /// it behaves like a square of [getSize] + /// Check [FlDotCirclePainter.hitTest] for an example of an implementation + bool hitTest( + FlSpot spot, + Offset touched, + Offset center, + double extraThreshold, + ) { + final size = getSize(spot); + final spotRect = Rect.fromCenter( + center: center, + width: size.width, + height: size.height, + ); + final thresholdRect = spotRect.inflate(extraThreshold); + return thresholdRect.contains(touched); + } } /// This class is an implementation of a [FlDotPainter] that draws @@ -870,15 +889,6 @@ class FlDotCirclePainter extends FlDotPainter { @override Color get mainColor => color; - /// Used for equality check, see [EquatableMixin]. - @override - List get props => [ - color, - radius, - strokeColor, - strokeWidth, - ]; - FlDotCirclePainter _lerp( FlDotCirclePainter a, FlDotCirclePainter b, @@ -899,6 +909,26 @@ class FlDotCirclePainter extends FlDotPainter { } return _lerp(a, b, t); } + + @override + bool hitTest( + FlSpot spot, + Offset touched, + Offset center, + double extraThreshold, + ) { + final distance = (touched - center).distance.abs(); + return distance < radius + extraThreshold; + } + + /// Used for equality check, see [EquatableMixin]. + @override + List get props => [ + color, + radius, + strokeColor, + strokeWidth, + ]; } /// This class is an implementation of a [FlDotPainter] that draws diff --git a/lib/src/chart/scatter_chart/scatter_chart_painter.dart b/lib/src/chart/scatter_chart/scatter_chart_painter.dart index ef8a928ad..386079d76 100644 --- a/lib/src/chart/scatter_chart/scatter_chart_painter.dart +++ b/lib/src/chart/scatter_chart/scatter_chart_painter.dart @@ -370,25 +370,14 @@ class ScatterChartPainter extends AxisChartPainter { final spotPixelY = getPixelY(spot.y, viewSize, holder); final center = Offset(spotPixelX, spotPixelY); - if (spot.dotPainter is FlDotCirclePainter) { - final radius = (spot.dotPainter as FlDotCirclePainter).radius; - final distance = (localPosition - center).distance.abs(); - - if (distance < radius + data.scatterTouchData.touchSpotThreshold) { - return ScatterTouchedSpot(spot, i); - } - } else { - final spotRect = Rect.fromCenter( - center: center, - width: spot.size.width, - height: spot.size.height, - ); - final thresholdRect = spotRect.inflate( - data.scatterTouchData.touchSpotThreshold, - ); - if (thresholdRect.contains(localPosition)) { - return ScatterTouchedSpot(spot, i); - } + final touched = spot.dotPainter.hitTest( + spot, + localPosition, + center, + data.scatterTouchData.touchSpotThreshold, + ); + if (touched) { + return ScatterTouchedSpot(spot, i); } } return null; From 9e133f142a1de29883f6e00cc85f7ab7cdcc9fff Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Sun, 3 Dec 2023 20:56:55 +0100 Subject: [PATCH 071/149] Move FlDotPainter from line_chart_data to axis_chart_data --- .../base/axis_chart/axis_chart_data.dart | 305 ++++++++++++++++++ lib/src/chart/line_chart/line_chart_data.dart | 305 ------------------ test/utils/canvas_wrapper_test.dart | 2 +- 3 files changed, 306 insertions(+), 306 deletions(-) diff --git a/lib/src/chart/base/axis_chart/axis_chart_data.dart b/lib/src/chart/base/axis_chart/axis_chart_data.dart index ee07e0621..425e351be 100644 --- a/lib/src/chart/base/axis_chart/axis_chart_data.dart +++ b/lib/src/chart/base/axis_chart/axis_chart_data.dart @@ -1312,3 +1312,308 @@ class ExtraLinesData with EquatableMixin { extraLinesOnTop, ]; } + +/// This class contains the interface that all DotPainters should conform to. +abstract class FlDotPainter with EquatableMixin { + const FlDotPainter(); + + /// This method should be overridden to draw the dot shape. + void draw(Canvas canvas, FlSpot spot, Offset offsetInCanvas); + + /// This method should be overridden to return the size of the shape. + Size getSize(FlSpot spot); + + /// Used to show default UIs, for example [defaultScatterTooltipItem] + Color get mainColor; + + FlDotPainter lerp(FlDotPainter a, FlDotPainter b, double t); + + /// Used to implement touch behaviour of this dot, for example, + /// it behaves like a square of [getSize] + /// Check [FlDotCirclePainter.hitTest] for an example of an implementation + bool hitTest( + FlSpot spot, + Offset touched, + Offset center, + double extraThreshold, + ) { + final size = getSize(spot); + final spotRect = Rect.fromCenter( + center: center, + width: size.width, + height: size.height, + ); + final thresholdRect = spotRect.inflate(extraThreshold); + return thresholdRect.contains(touched); + } +} + +/// This class is an implementation of a [FlDotPainter] that draws +/// a circled shape +class FlDotCirclePainter extends FlDotPainter { + /// The color of the circle is determined determined by [color], + /// [radius] determines the radius of the circle. + /// You can have a stroke line around the circle, + /// by setting the thickness with [strokeWidth], + /// and you can change the color of of the stroke with [strokeColor]. + FlDotCirclePainter({ + this.color = Colors.green, + double? radius, + this.strokeColor = const Color.fromRGBO(76, 175, 80, 1), + this.strokeWidth = 0.0, + }) : radius = radius ?? 4.0; + + /// The fill color to use for the circle + Color color; + + /// Customizes the radius of the circle + double radius; + + /// The stroke color to use for the circle + Color strokeColor; + + /// The stroke width to use for the circle + double strokeWidth; + + /// Implementation of the parent class to draw the circle + @override + void draw(Canvas canvas, FlSpot spot, Offset offsetInCanvas) { + if (strokeWidth != 0.0 && strokeColor.opacity != 0.0) { + canvas.drawCircle( + offsetInCanvas, + radius + (strokeWidth / 2), + Paint() + ..color = strokeColor + ..strokeWidth = strokeWidth + ..style = PaintingStyle.stroke, + ); + } + canvas.drawCircle( + offsetInCanvas, + radius, + Paint() + ..color = color + ..style = PaintingStyle.fill, + ); + } + + /// Implementation of the parent class to get the size of the circle + @override + Size getSize(FlSpot spot) { + return Size(radius * 2, radius * 2); + } + + @override + Color get mainColor => color; + + FlDotCirclePainter _lerp( + FlDotCirclePainter a, + FlDotCirclePainter b, + double t, + ) { + return FlDotCirclePainter( + color: Color.lerp(a.color, b.color, t)!, + radius: lerpDouble(a.radius, b.radius, t), + strokeColor: Color.lerp(a.strokeColor, b.strokeColor, t)!, + strokeWidth: lerpDouble(a.strokeWidth, b.strokeWidth, t)!, + ); + } + + @override + FlDotPainter lerp(FlDotPainter a, FlDotPainter b, double t) { + if (a is! FlDotCirclePainter || b is! FlDotCirclePainter) { + return b; + } + return _lerp(a, b, t); + } + + @override + bool hitTest( + FlSpot spot, + Offset touched, + Offset center, + double extraThreshold, + ) { + final distance = (touched - center).distance.abs(); + return distance < radius + extraThreshold; + } + + /// Used for equality check, see [EquatableMixin]. + @override + List get props => [ + color, + radius, + strokeColor, + strokeWidth, + ]; +} + +/// This class is an implementation of a [FlDotPainter] that draws +/// a squared shape +class FlDotSquarePainter extends FlDotPainter { + /// The color of the square is determined determined by [color], + /// [size] determines the size of the square. + /// You can have a stroke line around the square, + /// by setting the thickness with [strokeWidth], + /// and you can change the color of of the stroke with [strokeColor]. + FlDotSquarePainter({ + this.color = Colors.green, + this.size = 4.0, + this.strokeColor = const Color.fromRGBO(76, 175, 80, 1), + this.strokeWidth = 1.0, + }); + + /// The fill color to use for the square + Color color; + + /// Customizes the size of the square + double size; + + /// The stroke color to use for the square + Color strokeColor; + + /// The stroke width to use for the square + double strokeWidth; + + /// Implementation of the parent class to draw the square + @override + void draw(Canvas canvas, FlSpot spot, Offset offsetInCanvas) { + if (strokeWidth != 0.0 && strokeColor.opacity != 0.0) { + canvas.drawRect( + Rect.fromCircle( + center: offsetInCanvas, + radius: (size / 2) + (strokeWidth / 2), + ), + Paint() + ..color = strokeColor + ..strokeWidth = strokeWidth + ..style = PaintingStyle.stroke, + ); + } + canvas.drawRect( + Rect.fromCircle( + center: offsetInCanvas, + radius: size / 2, + ), + Paint() + ..color = color + ..style = PaintingStyle.fill, + ); + } + + /// Implementation of the parent class to get the size of the square + @override + Size getSize(FlSpot spot) { + return Size(size, size); + } + + @override + Color get mainColor => color; + + /// Used for equality check, see [EquatableMixin]. + @override + List get props => [ + color, + size, + strokeColor, + strokeWidth, + ]; + + FlDotSquarePainter _lerp( + FlDotSquarePainter a, + FlDotSquarePainter b, + double t, + ) { + return FlDotSquarePainter( + color: Color.lerp(a.color, b.color, t)!, + size: lerpDouble(a.size, b.size, t)!, + strokeColor: Color.lerp(a.strokeColor, b.strokeColor, t)!, + strokeWidth: lerpDouble(a.strokeWidth, b.strokeWidth, t)!, + ); + } + + @override + FlDotPainter lerp(FlDotPainter a, FlDotPainter b, double t) { + if (a is! FlDotSquarePainter || b is! FlDotSquarePainter) { + return b; + } + return _lerp(a, b, t); + } +} + +/// This class is an implementation of a [FlDotPainter] that draws +/// a cross (X mark) shape +class FlDotCrossPainter extends FlDotPainter { + /// The [color] and [width] properties determines the color and thickness of the cross shape, + /// [size] determines the width and height of the shape. + FlDotCrossPainter({ + this.color = Colors.green, + this.size = 8.0, + this.width = 2.0, + }); + + /// The fill color to use for the X mark + Color color; + + /// Determines size (width and height) of shape. + double size; + + /// Determines thickness of X mark. + double width; + + /// Implementation of the parent class to draw the cross + @override + void draw(Canvas canvas, FlSpot spot, Offset offsetInCanvas) { + final path = Path() + ..moveTo(offsetInCanvas.dx, offsetInCanvas.dy) + ..relativeMoveTo(-size / 2, -size / 2) + ..relativeLineTo(size, size) + ..moveTo(offsetInCanvas.dx, offsetInCanvas.dy) + ..relativeMoveTo(size / 2, -size / 2) + ..relativeLineTo(-size, size); + + final paint = Paint() + ..style = PaintingStyle.stroke + ..strokeWidth = width + ..color = color; + + canvas.drawPath(path, paint); + } + + /// Implementation of the parent class to get the size of the circle + @override + Size getSize(FlSpot spot) { + return Size(size, size); + } + + @override + Color get mainColor => color; + + FlDotCrossPainter _lerp( + FlDotCrossPainter a, + FlDotCrossPainter b, + double t, + ) { + return FlDotCrossPainter( + color: Color.lerp(a.color, b.color, t)!, + size: lerpDouble(a.size, b.size, t)!, + width: lerpDouble(a.width, b.width, t)!, + ); + } + + @override + FlDotPainter lerp(FlDotPainter a, FlDotPainter b, double t) { + if (a is! FlDotCrossPainter || b is! FlDotCrossPainter) { + return b; + } + return _lerp(a, b, t); + } + + /// Used for equality check, see [EquatableMixin]. + @override + List get props => [ + color, + size, + width, + ]; +} diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index 407ee0cb0..13dfc817e 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -796,311 +796,6 @@ class FlDotData with EquatableMixin { ]; } -/// This class contains the interface that all DotPainters should conform to. -abstract class FlDotPainter with EquatableMixin { - const FlDotPainter(); - - /// This method should be overridden to draw the dot shape. - void draw(Canvas canvas, FlSpot spot, Offset offsetInCanvas); - - /// This method should be overridden to return the size of the shape. - Size getSize(FlSpot spot); - - /// Used to show default UIs, for example [defaultScatterTooltipItem] - Color get mainColor; - - FlDotPainter lerp(FlDotPainter a, FlDotPainter b, double t); - - /// Used to implement touch behaviour of this dot, for example, - /// it behaves like a square of [getSize] - /// Check [FlDotCirclePainter.hitTest] for an example of an implementation - bool hitTest( - FlSpot spot, - Offset touched, - Offset center, - double extraThreshold, - ) { - final size = getSize(spot); - final spotRect = Rect.fromCenter( - center: center, - width: size.width, - height: size.height, - ); - final thresholdRect = spotRect.inflate(extraThreshold); - return thresholdRect.contains(touched); - } -} - -/// This class is an implementation of a [FlDotPainter] that draws -/// a circled shape -class FlDotCirclePainter extends FlDotPainter { - /// The color of the circle is determined determined by [color], - /// [radius] determines the radius of the circle. - /// You can have a stroke line around the circle, - /// by setting the thickness with [strokeWidth], - /// and you can change the color of of the stroke with [strokeColor]. - FlDotCirclePainter({ - this.color = Colors.green, - double? radius, - this.strokeColor = const Color.fromRGBO(76, 175, 80, 1), - this.strokeWidth = 0.0, - }) : radius = radius ?? 4.0; - - /// The fill color to use for the circle - Color color; - - /// Customizes the radius of the circle - double radius; - - /// The stroke color to use for the circle - Color strokeColor; - - /// The stroke width to use for the circle - double strokeWidth; - - /// Implementation of the parent class to draw the circle - @override - void draw(Canvas canvas, FlSpot spot, Offset offsetInCanvas) { - if (strokeWidth != 0.0 && strokeColor.opacity != 0.0) { - canvas.drawCircle( - offsetInCanvas, - radius + (strokeWidth / 2), - Paint() - ..color = strokeColor - ..strokeWidth = strokeWidth - ..style = PaintingStyle.stroke, - ); - } - canvas.drawCircle( - offsetInCanvas, - radius, - Paint() - ..color = color - ..style = PaintingStyle.fill, - ); - } - - /// Implementation of the parent class to get the size of the circle - @override - Size getSize(FlSpot spot) { - return Size(radius * 2, radius * 2); - } - - @override - Color get mainColor => color; - - FlDotCirclePainter _lerp( - FlDotCirclePainter a, - FlDotCirclePainter b, - double t, - ) { - return FlDotCirclePainter( - color: Color.lerp(a.color, b.color, t)!, - radius: lerpDouble(a.radius, b.radius, t), - strokeColor: Color.lerp(a.strokeColor, b.strokeColor, t)!, - strokeWidth: lerpDouble(a.strokeWidth, b.strokeWidth, t)!, - ); - } - - @override - FlDotPainter lerp(FlDotPainter a, FlDotPainter b, double t) { - if (a is! FlDotCirclePainter || b is! FlDotCirclePainter) { - return b; - } - return _lerp(a, b, t); - } - - @override - bool hitTest( - FlSpot spot, - Offset touched, - Offset center, - double extraThreshold, - ) { - final distance = (touched - center).distance.abs(); - return distance < radius + extraThreshold; - } - - /// Used for equality check, see [EquatableMixin]. - @override - List get props => [ - color, - radius, - strokeColor, - strokeWidth, - ]; -} - -/// This class is an implementation of a [FlDotPainter] that draws -/// a squared shape -class FlDotSquarePainter extends FlDotPainter { - /// The color of the square is determined determined by [color], - /// [size] determines the size of the square. - /// You can have a stroke line around the square, - /// by setting the thickness with [strokeWidth], - /// and you can change the color of of the stroke with [strokeColor]. - FlDotSquarePainter({ - this.color = Colors.green, - this.size = 4.0, - this.strokeColor = const Color.fromRGBO(76, 175, 80, 1), - this.strokeWidth = 1.0, - }); - - /// The fill color to use for the square - Color color; - - /// Customizes the size of the square - double size; - - /// The stroke color to use for the square - Color strokeColor; - - /// The stroke width to use for the square - double strokeWidth; - - /// Implementation of the parent class to draw the square - @override - void draw(Canvas canvas, FlSpot spot, Offset offsetInCanvas) { - if (strokeWidth != 0.0 && strokeColor.opacity != 0.0) { - canvas.drawRect( - Rect.fromCircle( - center: offsetInCanvas, - radius: (size / 2) + (strokeWidth / 2), - ), - Paint() - ..color = strokeColor - ..strokeWidth = strokeWidth - ..style = PaintingStyle.stroke, - ); - } - canvas.drawRect( - Rect.fromCircle( - center: offsetInCanvas, - radius: size / 2, - ), - Paint() - ..color = color - ..style = PaintingStyle.fill, - ); - } - - /// Implementation of the parent class to get the size of the square - @override - Size getSize(FlSpot spot) { - return Size(size, size); - } - - @override - Color get mainColor => color; - - /// Used for equality check, see [EquatableMixin]. - @override - List get props => [ - color, - size, - strokeColor, - strokeWidth, - ]; - - FlDotSquarePainter _lerp( - FlDotSquarePainter a, - FlDotSquarePainter b, - double t, - ) { - return FlDotSquarePainter( - color: Color.lerp(a.color, b.color, t)!, - size: lerpDouble(a.size, b.size, t)!, - strokeColor: Color.lerp(a.strokeColor, b.strokeColor, t)!, - strokeWidth: lerpDouble(a.strokeWidth, b.strokeWidth, t)!, - ); - } - - @override - FlDotPainter lerp(FlDotPainter a, FlDotPainter b, double t) { - if (a is! FlDotSquarePainter || b is! FlDotSquarePainter) { - return b; - } - return _lerp(a, b, t); - } -} - -/// This class is an implementation of a [FlDotPainter] that draws -/// a cross (X mark) shape -class FlDotCrossPainter extends FlDotPainter { - /// The [color] and [width] properties determines the color and thickness of the cross shape, - /// [size] determines the width and height of the shape. - FlDotCrossPainter({ - this.color = Colors.green, - this.size = 8.0, - this.width = 2.0, - }); - - /// The fill color to use for the X mark - Color color; - - /// Determines size (width and height) of shape. - double size; - - /// Determines thickness of X mark. - double width; - - /// Implementation of the parent class to draw the cross - @override - void draw(Canvas canvas, FlSpot spot, Offset offsetInCanvas) { - final path = Path() - ..moveTo(offsetInCanvas.dx, offsetInCanvas.dy) - ..relativeMoveTo(-size / 2, -size / 2) - ..relativeLineTo(size, size) - ..moveTo(offsetInCanvas.dx, offsetInCanvas.dy) - ..relativeMoveTo(size / 2, -size / 2) - ..relativeLineTo(-size, size); - - final paint = Paint() - ..style = PaintingStyle.stroke - ..strokeWidth = width - ..color = color; - - canvas.drawPath(path, paint); - } - - /// Implementation of the parent class to get the size of the circle - @override - Size getSize(FlSpot spot) { - return Size(size, size); - } - - @override - Color get mainColor => color; - - FlDotCrossPainter _lerp( - FlDotCrossPainter a, - FlDotCrossPainter b, - double t, - ) { - return FlDotCrossPainter( - color: Color.lerp(a.color, b.color, t)!, - size: lerpDouble(a.size, b.size, t)!, - width: lerpDouble(a.width, b.width, t)!, - ); - } - - @override - FlDotPainter lerp(FlDotPainter a, FlDotPainter b, double t) { - if (a is! FlDotCrossPainter || b is! FlDotCrossPainter) { - return b; - } - return _lerp(a, b, t); - } - - /// Used for equality check, see [EquatableMixin]. - @override - List get props => [ - color, - size, - width, - ]; -} - /// It determines showing or hiding [FlDotData] on the spots. /// /// It gives you the checking [FlSpot] and you should decide to diff --git a/test/utils/canvas_wrapper_test.dart b/test/utils/canvas_wrapper_test.dart index 95459740a..6fb155811 100644 --- a/test/utils/canvas_wrapper_test.dart +++ b/test/utils/canvas_wrapper_test.dart @@ -1,6 +1,6 @@ import 'dart:ui'; -import 'package:fl_chart/src/chart/line_chart/line_chart_data.dart'; +import 'package:fl_chart/src/chart/base/axis_chart/axis_chart_data.dart'; import 'package:fl_chart/src/utils/canvas_wrapper.dart'; import 'package:fl_chart/src/utils/utils.dart'; import 'package:flutter_test/flutter_test.dart'; From c1a5189216fa840c5d9c3889ae1856044ea6d95b Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Sun, 3 Dec 2023 21:03:05 +0100 Subject: [PATCH 072/149] Generate new mock files --- .../bar_chart_painter_test.mocks.dart | 17 +- .../bar_chart_renderer_test.mocks.dart | 4 +- .../line_chart_painter_test.mocks.dart | 79 ++++---- .../line_chart_renderer_test.mocks.dart | 4 +- .../pie_chart_painter_test.mocks.dart | 17 +- .../pie_chart_renderer_test.mocks.dart | 4 +- .../radar_chart_painter_test.mocks.dart | 17 +- .../radar_chart_renderer_test.mocks.dart | 4 +- .../scatter_chart_painter_test.mocks.dart | 17 +- .../scatter_chart_renderer_test.mocks.dart | 4 +- test/utils/canvas_wrapper_test.mocks.dart | 172 +++++++++++++----- test/utils/utils_test.mocks.dart | 17 +- 12 files changed, 267 insertions(+), 89 deletions(-) diff --git a/test/chart/bar_chart/bar_chart_painter_test.mocks.dart b/test/chart/bar_chart/bar_chart_painter_test.mocks.dart index 87f099ca9..7955d4248 100644 --- a/test/chart/bar_chart/bar_chart_painter_test.mocks.dart +++ b/test/chart/bar_chart/bar_chart_painter_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.2 from annotations +// Mocks generated by Mockito 5.4.3 from annotations // in fl_chart/test/chart/bar_chart/bar_chart_painter_test.dart. // Do not manually edit this file. @@ -12,11 +12,14 @@ import 'package:fl_chart/src/utils/utils.dart' as _i8; import 'package:flutter/cupertino.dart' as _i3; import 'package:flutter/foundation.dart' as _i4; import 'package:mockito/mockito.dart' as _i1; +import 'package:mockito/src/dummies.dart' as _i9; // ignore_for_file: type=lint // ignore_for_file: avoid_redundant_argument_values // ignore_for_file: avoid_setters_without_getters // ignore_for_file: comment_references +// ignore_for_file: deprecated_member_use +// ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member // ignore_for_file: prefer_const_constructors @@ -1376,7 +1379,17 @@ class MockUtils extends _i1.Mock implements _i8.Utils { axisValue, ], ), - returnValue: '', + returnValue: _i9.dummyValue( + this, + Invocation.method( + #formatNumber, + [ + axisMin, + axisMax, + axisValue, + ], + ), + ), ) as String); @override diff --git a/test/chart/bar_chart/bar_chart_renderer_test.mocks.dart b/test/chart/bar_chart/bar_chart_renderer_test.mocks.dart index ba3fc058d..363495b21 100644 --- a/test/chart/bar_chart/bar_chart_renderer_test.mocks.dart +++ b/test/chart/bar_chart/bar_chart_renderer_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.2 from annotations +// Mocks generated by Mockito 5.4.3 from annotations // in fl_chart/test/chart/bar_chart/bar_chart_renderer_test.dart. // Do not manually edit this file. @@ -23,6 +23,8 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: avoid_redundant_argument_values // ignore_for_file: avoid_setters_without_getters // ignore_for_file: comment_references +// ignore_for_file: deprecated_member_use +// ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member // ignore_for_file: prefer_const_constructors diff --git a/test/chart/line_chart/line_chart_painter_test.mocks.dart b/test/chart/line_chart/line_chart_painter_test.mocks.dart index 983ad17ee..b30a9a838 100644 --- a/test/chart/line_chart/line_chart_painter_test.mocks.dart +++ b/test/chart/line_chart/line_chart_painter_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.2 from annotations +// Mocks generated by Mockito 5.4.3 from annotations // in fl_chart/test/chart/line_chart/line_chart_painter_test.dart. // Do not manually edit this file. @@ -8,18 +8,21 @@ import 'dart:ui' as _i2; import 'package:fl_chart/fl_chart.dart' as _i7; import 'package:fl_chart/src/chart/base/base_chart/base_chart_painter.dart' - as _i10; -import 'package:fl_chart/src/chart/line_chart/line_chart_painter.dart' as _i9; + as _i11; +import 'package:fl_chart/src/chart/line_chart/line_chart_painter.dart' as _i10; import 'package:fl_chart/src/utils/canvas_wrapper.dart' as _i6; import 'package:fl_chart/src/utils/utils.dart' as _i8; import 'package:flutter/cupertino.dart' as _i3; import 'package:flutter/foundation.dart' as _i4; import 'package:mockito/mockito.dart' as _i1; +import 'package:mockito/src/dummies.dart' as _i9; // ignore_for_file: type=lint // ignore_for_file: avoid_redundant_argument_values // ignore_for_file: avoid_setters_without_getters // ignore_for_file: comment_references +// ignore_for_file: deprecated_member_use +// ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member // ignore_for_file: prefer_const_constructors @@ -1389,7 +1392,17 @@ class MockUtils extends _i1.Mock implements _i8.Utils { axisValue, ], ), - returnValue: '', + returnValue: _i9.dummyValue( + this, + Invocation.method( + #formatNumber, + [ + axisMin, + axisMax, + axisValue, + ], + ), + ), ) as String); @override @@ -1450,7 +1463,7 @@ class MockUtils extends _i1.Mock implements _i8.Utils { /// A class which mocks [LineChartPainter]. /// /// See the documentation for Mockito's code generation for more information. -class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { +class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { MockLineChartPainter() { _i1.throwOnMissingStub(this); } @@ -1459,7 +1472,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { void paint( _i3.BuildContext? context, _i6.CanvasWrapper? canvasWrapper, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i11.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1476,7 +1489,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { @override void clipToBorder( _i6.CanvasWrapper? canvasWrapper, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i11.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1493,7 +1506,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { void drawBarLine( _i6.CanvasWrapper? canvasWrapper, _i7.LineChartBarData? barData, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i11.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1512,7 +1525,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { _i6.CanvasWrapper? canvasWrapper, _i7.LineChartData? data, _i7.BetweenBarsData? betweenBarsData, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i11.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1531,7 +1544,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { void drawDots( _i6.CanvasWrapper? canvasWrapper, _i7.LineChartBarData? barData, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i11.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1548,8 +1561,8 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { @override void drawTouchedSpotsIndicator( _i6.CanvasWrapper? canvasWrapper, - List<_i9.LineIndexDrawingInfo>? lineIndexDrawingInfo, - _i10.PaintHolder<_i7.LineChartData>? holder, + List<_i10.LineIndexDrawingInfo>? lineIndexDrawingInfo, + _i11.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1568,7 +1581,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { _i2.Size? viewSize, _i7.LineChartBarData? barData, List<_i7.FlSpot>? barSpots, - _i10.PaintHolder<_i7.LineChartData>? holder, { + _i11.PaintHolder<_i7.LineChartData>? holder, { _i2.Path? appendToPath, }) => (super.noSuchMethod( @@ -1602,7 +1615,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { _i2.Size? viewSize, _i7.LineChartBarData? barData, List<_i7.FlSpot>? barSpots, - _i10.PaintHolder<_i7.LineChartData>? holder, { + _i11.PaintHolder<_i7.LineChartData>? holder, { _i2.Path? appendToPath, }) => (super.noSuchMethod( @@ -1636,7 +1649,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { _i2.Size? viewSize, _i7.LineChartBarData? barData, List<_i7.FlSpot>? barSpots, - _i10.PaintHolder<_i7.LineChartData>? holder, { + _i11.PaintHolder<_i7.LineChartData>? holder, { _i2.Path? appendToPath, }) => (super.noSuchMethod( @@ -1671,7 +1684,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { _i7.LineChartBarData? barData, _i2.Path? barPath, List<_i7.FlSpot>? barSpots, - _i10.PaintHolder<_i7.LineChartData>? holder, { + _i11.PaintHolder<_i7.LineChartData>? holder, { bool? fillCompletely = false, }) => (super.noSuchMethod( @@ -1708,7 +1721,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { _i7.LineChartBarData? barData, _i2.Path? barPath, List<_i7.FlSpot>? barSpots, - _i10.PaintHolder<_i7.LineChartData>? holder, { + _i11.PaintHolder<_i7.LineChartData>? holder, { bool? fillCompletely = false, }) => (super.noSuchMethod( @@ -1744,7 +1757,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { _i6.CanvasWrapper? canvasWrapper, _i2.Path? belowBarPath, _i2.Path? filledAboveBarPath, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i11.PaintHolder<_i7.LineChartData>? holder, _i7.LineChartBarData? barData, ) => super.noSuchMethod( @@ -1766,7 +1779,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { _i6.CanvasWrapper? canvasWrapper, _i2.Path? aboveBarPath, _i2.Path? filledBelowBarPath, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i11.PaintHolder<_i7.LineChartData>? holder, _i7.LineChartBarData? barData, ) => super.noSuchMethod( @@ -1789,7 +1802,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { _i2.Path? barPath, _i7.BetweenBarsData? betweenBarsData, _i2.Rect? aroundRect, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i11.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1828,7 +1841,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { _i6.CanvasWrapper? canvasWrapper, _i2.Path? barPath, _i7.LineChartBarData? barData, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i11.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1850,7 +1863,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { _i7.LineTouchTooltipData? tooltipData, _i7.FlSpot? showOnSpot, _i7.ShowingTooltipIndicators? showingTooltipSpots, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i11.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1871,7 +1884,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { double getBarLineXLength( _i7.LineChartBarData? barData, _i2.Size? chartUsableSize, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i11.PaintHolder<_i7.LineChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -1889,7 +1902,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { List<_i7.TouchLineBarSpot>? handleTouch( _i2.Offset? localPosition, _i2.Size? size, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i11.PaintHolder<_i7.LineChartData>? holder, ) => (super.noSuchMethod(Invocation.method( #handleTouch, @@ -1906,7 +1919,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { _i2.Offset? touchedPoint, _i7.LineChartBarData? barData, int? barDataPosition, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i11.PaintHolder<_i7.LineChartData>? holder, ) => (super.noSuchMethod(Invocation.method( #getNearestTouchedSpot, @@ -1922,7 +1935,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { @override void drawGrid( _i6.CanvasWrapper? canvasWrapper, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i11.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1938,7 +1951,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { @override void drawBackground( _i6.CanvasWrapper? canvasWrapper, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i11.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1954,7 +1967,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { @override void drawRangeAnnotation( _i6.CanvasWrapper? canvasWrapper, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i11.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1971,7 +1984,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { void drawExtraLines( _i3.BuildContext? context, _i6.CanvasWrapper? canvasWrapper, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i11.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1989,7 +2002,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { void drawHorizontalLines( _i3.BuildContext? context, _i6.CanvasWrapper? canvasWrapper, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i11.PaintHolder<_i7.LineChartData>? holder, _i2.Size? viewSize, ) => super.noSuchMethod( @@ -2009,7 +2022,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { void drawVerticalLines( _i3.BuildContext? context, _i6.CanvasWrapper? canvasWrapper, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i11.PaintHolder<_i7.LineChartData>? holder, _i2.Size? viewSize, ) => super.noSuchMethod( @@ -2029,7 +2042,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { double getPixelX( double? spotX, _i2.Size? viewSize, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i11.PaintHolder<_i7.LineChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -2047,7 +2060,7 @@ class MockLineChartPainter extends _i1.Mock implements _i9.LineChartPainter { double getPixelY( double? spotY, _i2.Size? viewSize, - _i10.PaintHolder<_i7.LineChartData>? holder, + _i11.PaintHolder<_i7.LineChartData>? holder, ) => (super.noSuchMethod( Invocation.method( diff --git a/test/chart/line_chart/line_chart_renderer_test.mocks.dart b/test/chart/line_chart/line_chart_renderer_test.mocks.dart index ac69caab3..8996944ba 100644 --- a/test/chart/line_chart/line_chart_renderer_test.mocks.dart +++ b/test/chart/line_chart/line_chart_renderer_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.2 from annotations +// Mocks generated by Mockito 5.4.3 from annotations // in fl_chart/test/chart/line_chart/line_chart_renderer_test.dart. // Do not manually edit this file. @@ -23,6 +23,8 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: avoid_redundant_argument_values // ignore_for_file: avoid_setters_without_getters // ignore_for_file: comment_references +// ignore_for_file: deprecated_member_use +// ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member // ignore_for_file: prefer_const_constructors diff --git a/test/chart/pie_chart/pie_chart_painter_test.mocks.dart b/test/chart/pie_chart/pie_chart_painter_test.mocks.dart index d469bbdca..14289e27d 100644 --- a/test/chart/pie_chart/pie_chart_painter_test.mocks.dart +++ b/test/chart/pie_chart/pie_chart_painter_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.2 from annotations +// Mocks generated by Mockito 5.4.3 from annotations // in fl_chart/test/chart/pie_chart/pie_chart_painter_test.dart. // Do not manually edit this file. @@ -12,11 +12,14 @@ import 'package:fl_chart/src/utils/utils.dart' as _i8; import 'package:flutter/cupertino.dart' as _i3; import 'package:flutter/foundation.dart' as _i4; import 'package:mockito/mockito.dart' as _i1; +import 'package:mockito/src/dummies.dart' as _i9; // ignore_for_file: type=lint // ignore_for_file: avoid_redundant_argument_values // ignore_for_file: avoid_setters_without_getters // ignore_for_file: comment_references +// ignore_for_file: deprecated_member_use +// ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member // ignore_for_file: prefer_const_constructors @@ -1376,7 +1379,17 @@ class MockUtils extends _i1.Mock implements _i8.Utils { axisValue, ], ), - returnValue: '', + returnValue: _i9.dummyValue( + this, + Invocation.method( + #formatNumber, + [ + axisMin, + axisMax, + axisValue, + ], + ), + ), ) as String); @override diff --git a/test/chart/pie_chart/pie_chart_renderer_test.mocks.dart b/test/chart/pie_chart/pie_chart_renderer_test.mocks.dart index 3cfce1762..98ce2bab9 100644 --- a/test/chart/pie_chart/pie_chart_renderer_test.mocks.dart +++ b/test/chart/pie_chart/pie_chart_renderer_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.2 from annotations +// Mocks generated by Mockito 5.4.3 from annotations // in fl_chart/test/chart/pie_chart/pie_chart_renderer_test.dart. // Do not manually edit this file. @@ -24,6 +24,8 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: avoid_redundant_argument_values // ignore_for_file: avoid_setters_without_getters // ignore_for_file: comment_references +// ignore_for_file: deprecated_member_use +// ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member // ignore_for_file: prefer_const_constructors diff --git a/test/chart/radar_chart/radar_chart_painter_test.mocks.dart b/test/chart/radar_chart/radar_chart_painter_test.mocks.dart index 6e7673931..c25bff9ce 100644 --- a/test/chart/radar_chart/radar_chart_painter_test.mocks.dart +++ b/test/chart/radar_chart/radar_chart_painter_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.2 from annotations +// Mocks generated by Mockito 5.4.3 from annotations // in fl_chart/test/chart/radar_chart/radar_chart_painter_test.dart. // Do not manually edit this file. @@ -12,11 +12,14 @@ import 'package:fl_chart/src/utils/utils.dart' as _i8; import 'package:flutter/cupertino.dart' as _i3; import 'package:flutter/foundation.dart' as _i4; import 'package:mockito/mockito.dart' as _i1; +import 'package:mockito/src/dummies.dart' as _i9; // ignore_for_file: type=lint // ignore_for_file: avoid_redundant_argument_values // ignore_for_file: avoid_setters_without_getters // ignore_for_file: comment_references +// ignore_for_file: deprecated_member_use +// ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member // ignore_for_file: prefer_const_constructors @@ -1376,7 +1379,17 @@ class MockUtils extends _i1.Mock implements _i8.Utils { axisValue, ], ), - returnValue: '', + returnValue: _i9.dummyValue( + this, + Invocation.method( + #formatNumber, + [ + axisMin, + axisMax, + axisValue, + ], + ), + ), ) as String); @override diff --git a/test/chart/radar_chart/radar_chart_renderer_test.mocks.dart b/test/chart/radar_chart/radar_chart_renderer_test.mocks.dart index a176f281b..d5559d87d 100644 --- a/test/chart/radar_chart/radar_chart_renderer_test.mocks.dart +++ b/test/chart/radar_chart/radar_chart_renderer_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.2 from annotations +// Mocks generated by Mockito 5.4.3 from annotations // in fl_chart/test/chart/radar_chart/radar_chart_renderer_test.dart. // Do not manually edit this file. @@ -24,6 +24,8 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: avoid_redundant_argument_values // ignore_for_file: avoid_setters_without_getters // ignore_for_file: comment_references +// ignore_for_file: deprecated_member_use +// ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member // ignore_for_file: prefer_const_constructors diff --git a/test/chart/scatter_chart/scatter_chart_painter_test.mocks.dart b/test/chart/scatter_chart/scatter_chart_painter_test.mocks.dart index f8e87a9b0..7ebd21827 100644 --- a/test/chart/scatter_chart/scatter_chart_painter_test.mocks.dart +++ b/test/chart/scatter_chart/scatter_chart_painter_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.2 from annotations +// Mocks generated by Mockito 5.4.3 from annotations // in fl_chart/test/chart/scatter_chart/scatter_chart_painter_test.dart. // Do not manually edit this file. @@ -12,11 +12,14 @@ import 'package:fl_chart/src/utils/utils.dart' as _i8; import 'package:flutter/cupertino.dart' as _i3; import 'package:flutter/foundation.dart' as _i4; import 'package:mockito/mockito.dart' as _i1; +import 'package:mockito/src/dummies.dart' as _i9; // ignore_for_file: type=lint // ignore_for_file: avoid_redundant_argument_values // ignore_for_file: avoid_setters_without_getters // ignore_for_file: comment_references +// ignore_for_file: deprecated_member_use +// ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member // ignore_for_file: prefer_const_constructors @@ -1376,7 +1379,17 @@ class MockUtils extends _i1.Mock implements _i8.Utils { axisValue, ], ), - returnValue: '', + returnValue: _i9.dummyValue( + this, + Invocation.method( + #formatNumber, + [ + axisMin, + axisMax, + axisValue, + ], + ), + ), ) as String); @override diff --git a/test/chart/scatter_chart/scatter_chart_renderer_test.mocks.dart b/test/chart/scatter_chart/scatter_chart_renderer_test.mocks.dart index 56fd25da9..79cd9ed5b 100644 --- a/test/chart/scatter_chart/scatter_chart_renderer_test.mocks.dart +++ b/test/chart/scatter_chart/scatter_chart_renderer_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.2 from annotations +// Mocks generated by Mockito 5.4.3 from annotations // in fl_chart/test/chart/scatter_chart/scatter_chart_renderer_test.dart. // Do not manually edit this file. @@ -24,6 +24,8 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: avoid_redundant_argument_values // ignore_for_file: avoid_setters_without_getters // ignore_for_file: comment_references +// ignore_for_file: deprecated_member_use +// ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member // ignore_for_file: prefer_const_constructors diff --git a/test/utils/canvas_wrapper_test.mocks.dart b/test/utils/canvas_wrapper_test.mocks.dart index 48153adb5..e3f4a2964 100644 --- a/test/utils/canvas_wrapper_test.mocks.dart +++ b/test/utils/canvas_wrapper_test.mocks.dart @@ -1,20 +1,23 @@ -// Mocks generated by Mockito 5.4.2 from annotations +// Mocks generated by Mockito 5.4.3 from annotations // in fl_chart/test/utils/canvas_wrapper_test.dart. // Do not manually edit this file. // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:typed_data' as _i4; +import 'dart:typed_data' as _i5; import 'dart:ui' as _i2; -import 'package:fl_chart/fl_chart.dart' as _i5; +import 'package:fl_chart/fl_chart.dart' as _i3; import 'package:fl_chart/src/utils/utils.dart' as _i6; -import 'package:flutter/material.dart' as _i3; +import 'package:flutter/material.dart' as _i4; import 'package:mockito/mockito.dart' as _i1; +import 'package:mockito/src/dummies.dart' as _i7; // ignore_for_file: type=lint // ignore_for_file: avoid_redundant_argument_values // ignore_for_file: avoid_setters_without_getters // ignore_for_file: comment_references +// ignore_for_file: deprecated_member_use +// ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member // ignore_for_file: prefer_const_constructors @@ -32,8 +35,8 @@ class _FakeRect_0 extends _i1.SmartFake implements _i2.Rect { ); } -class _FakeSize_1 extends _i1.SmartFake implements _i2.Size { - _FakeSize_1( +class _FakeColor_1 extends _i1.SmartFake implements _i2.Color { + _FakeColor_1( Object parent, Invocation parentInvocation, ) : super( @@ -42,8 +45,8 @@ class _FakeSize_1 extends _i1.SmartFake implements _i2.Size { ); } -class _FakeOffset_2 extends _i1.SmartFake implements _i2.Offset { - _FakeOffset_2( +class _FakeSize_2 extends _i1.SmartFake implements _i2.Size { + _FakeSize_2( Object parent, Invocation parentInvocation, ) : super( @@ -52,8 +55,28 @@ class _FakeOffset_2 extends _i1.SmartFake implements _i2.Offset { ); } -class _FakeBorderSide_3 extends _i1.SmartFake implements _i3.BorderSide { - _FakeBorderSide_3( +class _FakeFlDotPainter_3 extends _i1.SmartFake implements _i3.FlDotPainter { + _FakeFlDotPainter_3( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeOffset_4 extends _i1.SmartFake implements _i2.Offset { + _FakeOffset_4( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeBorderSide_5 extends _i1.SmartFake implements _i4.BorderSide { + _FakeBorderSide_5( Object parent, Invocation parentInvocation, ) : super( @@ -62,12 +85,12 @@ class _FakeBorderSide_3 extends _i1.SmartFake implements _i3.BorderSide { ); @override - String toString({_i3.DiagnosticLevel? minLevel = _i3.DiagnosticLevel.info}) => + String toString({_i4.DiagnosticLevel? minLevel = _i4.DiagnosticLevel.info}) => super.toString(); } -class _FakeTextStyle_4 extends _i1.SmartFake implements _i3.TextStyle { - _FakeTextStyle_4( +class _FakeTextStyle_6 extends _i1.SmartFake implements _i4.TextStyle { + _FakeTextStyle_6( Object parent, Invocation parentInvocation, ) : super( @@ -76,7 +99,7 @@ class _FakeTextStyle_4 extends _i1.SmartFake implements _i3.TextStyle { ); @override - String toString({_i3.DiagnosticLevel? minLevel = _i3.DiagnosticLevel.info}) => + String toString({_i4.DiagnosticLevel? minLevel = _i4.DiagnosticLevel.info}) => super.toString(); } @@ -198,7 +221,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ); @override - void transform(_i4.Float64List? matrix4) => super.noSuchMethod( + void transform(_i5.Float64List? matrix4) => super.noSuchMethod( Invocation.method( #transform, [matrix4], @@ -207,13 +230,13 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ); @override - _i4.Float64List getTransform() => (super.noSuchMethod( + _i5.Float64List getTransform() => (super.noSuchMethod( Invocation.method( #getTransform, [], ), - returnValue: _i4.Float64List(0), - ) as _i4.Float64List); + returnValue: _i5.Float64List(0), + ) as _i5.Float64List); @override void clipRect( @@ -560,7 +583,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { @override void drawRawPoints( _i2.PointMode? pointMode, - _i4.Float32List? points, + _i5.Float32List? points, _i2.Paint? paint, ) => super.noSuchMethod( @@ -622,9 +645,9 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { @override void drawRawAtlas( _i2.Image? atlas, - _i4.Float32List? rstTransforms, - _i4.Float32List? rects, - _i4.Int32List? colors, + _i5.Float32List? rstTransforms, + _i5.Float32List? rects, + _i5.Int32List? colors, _i2.BlendMode? blendMode, _i2.Rect? cullRect, _i2.Paint? paint, @@ -669,11 +692,20 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { /// A class which mocks [FlDotPainter]. /// /// See the documentation for Mockito's code generation for more information. -class MockFlDotPainter extends _i1.Mock implements _i5.FlDotPainter { +class MockFlDotPainter extends _i1.Mock implements _i3.FlDotPainter { MockFlDotPainter() { _i1.throwOnMissingStub(this); } + @override + _i2.Color get mainColor => (super.noSuchMethod( + Invocation.getter(#mainColor), + returnValue: _FakeColor_1( + this, + Invocation.getter(#mainColor), + ), + ) as _i2.Color); + @override List get props => (super.noSuchMethod( Invocation.getter(#props), @@ -683,7 +715,7 @@ class MockFlDotPainter extends _i1.Mock implements _i5.FlDotPainter { @override void draw( _i2.Canvas? canvas, - _i5.FlSpot? spot, + _i3.FlSpot? spot, _i2.Offset? offsetInCanvas, ) => super.noSuchMethod( @@ -699,12 +731,12 @@ class MockFlDotPainter extends _i1.Mock implements _i5.FlDotPainter { ); @override - _i2.Size getSize(_i5.FlSpot? spot) => (super.noSuchMethod( + _i2.Size getSize(_i3.FlSpot? spot) => (super.noSuchMethod( Invocation.method( #getSize, [spot], ), - returnValue: _FakeSize_1( + returnValue: _FakeSize_2( this, Invocation.method( #getSize, @@ -712,6 +744,54 @@ class MockFlDotPainter extends _i1.Mock implements _i5.FlDotPainter { ), ), ) as _i2.Size); + + @override + _i3.FlDotPainter lerp( + _i3.FlDotPainter? a, + _i3.FlDotPainter? b, + double? t, + ) => + (super.noSuchMethod( + Invocation.method( + #lerp, + [ + a, + b, + t, + ], + ), + returnValue: _FakeFlDotPainter_3( + this, + Invocation.method( + #lerp, + [ + a, + b, + t, + ], + ), + ), + ) as _i3.FlDotPainter); + + @override + bool hitTest( + _i3.FlSpot? spot, + _i2.Offset? touched, + _i2.Offset? center, + double? extraThreshold, + ) => + (super.noSuchMethod( + Invocation.method( + #hitTest, + [ + spot, + touched, + center, + extraThreshold, + ], + ), + returnValue: false, + ) as bool); } /// A class which mocks [Utils]. @@ -746,7 +826,7 @@ class MockUtils extends _i1.Mock implements _i6.Utils { #getDefaultSize, [screenSize], ), - returnValue: _FakeSize_1( + returnValue: _FakeSize_2( this, Invocation.method( #getDefaultSize, @@ -784,7 +864,7 @@ class MockUtils extends _i1.Mock implements _i6.Utils { degree, ], ), - returnValue: _FakeOffset_2( + returnValue: _FakeOffset_4( this, Invocation.method( #calculateRotationOffset, @@ -797,8 +877,8 @@ class MockUtils extends _i1.Mock implements _i6.Utils { ) as _i2.Offset); @override - _i3.BorderRadius? normalizeBorderRadius( - _i3.BorderRadius? borderRadius, + _i4.BorderRadius? normalizeBorderRadius( + _i4.BorderRadius? borderRadius, double? width, ) => (super.noSuchMethod(Invocation.method( @@ -807,11 +887,11 @@ class MockUtils extends _i1.Mock implements _i6.Utils { borderRadius, width, ], - )) as _i3.BorderRadius?); + )) as _i4.BorderRadius?); @override - _i3.BorderSide normalizeBorderSide( - _i3.BorderSide? borderSide, + _i4.BorderSide normalizeBorderSide( + _i4.BorderSide? borderSide, double? width, ) => (super.noSuchMethod( @@ -822,7 +902,7 @@ class MockUtils extends _i1.Mock implements _i6.Utils { width, ], ), - returnValue: _FakeBorderSide_3( + returnValue: _FakeBorderSide_5( this, Invocation.method( #normalizeBorderSide, @@ -832,7 +912,7 @@ class MockUtils extends _i1.Mock implements _i6.Utils { ], ), ), - ) as _i3.BorderSide); + ) as _i4.BorderSide); @override double getEfficientInterval( @@ -885,13 +965,23 @@ class MockUtils extends _i1.Mock implements _i6.Utils { axisValue, ], ), - returnValue: '', + returnValue: _i7.dummyValue( + this, + Invocation.method( + #formatNumber, + [ + axisMin, + axisMax, + axisValue, + ], + ), + ), ) as String); @override - _i3.TextStyle getThemeAwareTextStyle( - _i3.BuildContext? context, - _i3.TextStyle? providedStyle, + _i4.TextStyle getThemeAwareTextStyle( + _i4.BuildContext? context, + _i4.TextStyle? providedStyle, ) => (super.noSuchMethod( Invocation.method( @@ -901,7 +991,7 @@ class MockUtils extends _i1.Mock implements _i6.Utils { providedStyle, ], ), - returnValue: _FakeTextStyle_4( + returnValue: _FakeTextStyle_6( this, Invocation.method( #getThemeAwareTextStyle, @@ -911,7 +1001,7 @@ class MockUtils extends _i1.Mock implements _i6.Utils { ], ), ), - ) as _i3.TextStyle); + ) as _i4.TextStyle); @override double getBestInitialIntervalValue( diff --git a/test/utils/utils_test.mocks.dart b/test/utils/utils_test.mocks.dart index 952e998a8..90fcd8b7a 100644 --- a/test/utils/utils_test.mocks.dart +++ b/test/utils/utils_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.2 from annotations +// Mocks generated by Mockito 5.4.3 from annotations // in fl_chart/test/utils/utils_test.dart. // Do not manually edit this file. @@ -9,11 +9,14 @@ import 'package:fl_chart/src/utils/utils.dart' as _i5; import 'package:flutter/foundation.dart' as _i4; import 'package:flutter/material.dart' as _i3; import 'package:mockito/mockito.dart' as _i1; +import 'package:mockito/src/dummies.dart' as _i6; // ignore_for_file: type=lint // ignore_for_file: avoid_redundant_argument_values // ignore_for_file: avoid_setters_without_getters // ignore_for_file: comment_references +// ignore_for_file: deprecated_member_use +// ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member // ignore_for_file: prefer_const_constructors @@ -287,7 +290,17 @@ class MockUtils extends _i1.Mock implements _i5.Utils { axisValue, ], ), - returnValue: '', + returnValue: _i6.dummyValue( + this, + Invocation.method( + #formatNumber, + [ + axisMin, + axisMax, + axisValue, + ], + ), + ), ) as String); @override From 2f6a0e1931cdd39246952f8019fadc2c4be2f9a2 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Sun, 3 Dec 2023 21:16:25 +0100 Subject: [PATCH 073/149] Update CHANGELOG.md to add migration guide --- CHANGELOG.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee4195509..c96450cb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,26 @@ * **IMPROVEMENT** (by @imaNNeo) Add `dotPainter` property to ScatterSpot to allow customizing the dot painter, #568 * **BREAKING** (by @imaNNeo) Remove `color` and `radius` properties from ScatterSpot (use `dotPainter` instead), #568 * **BREAKING** (by @imaNNeo) Change the default value of FlDotCirclePainter.`strokeWidth` to 0.0 +```dart +/// Migration guide: +/// This is the old way: +ScatterSpot( + 2, + 5, + color: Colors.red, + radius: 12, +) + +/// This is the new way: +ScatterSpot( + 2, + 8, + dotPainter: FlDotCirclePainter( + color: Colors.red, + radius: 22, + ), +), +``` ## 0.65.0 * **FEATURE** (by @Dartek12) Added gradient to [FlLine](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#FlLine), #1197 From 2bb9c81ebae26d117f3d41d9df6c70a76da3214f Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Sun, 3 Dec 2023 21:45:03 +0100 Subject: [PATCH 074/149] Add a feature to allow user to select a painterType in ScatterChartSample2 --- .../scatter/scatter_chart_sample2.dart | 348 +++++++++--------- 1 file changed, 183 insertions(+), 165 deletions(-) diff --git a/example/lib/presentation/samples/scatter/scatter_chart_sample2.dart b/example/lib/presentation/samples/scatter/scatter_chart_sample2.dart index c216c6fb9..0a1db8f5c 100644 --- a/example/lib/presentation/samples/scatter/scatter_chart_sample2.dart +++ b/example/lib/presentation/samples/scatter/scatter_chart_sample2.dart @@ -1,3 +1,5 @@ +import 'dart:math'; + import 'package:fl_chart_app/presentation/resources/app_resources.dart'; import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; @@ -13,188 +15,204 @@ class _ScatterChartSample2State extends State { int touchedIndex = -1; Color greyColor = Colors.grey; + final _availableColors = [ + AppColors.contentColorGreen, + AppColors.contentColorYellow, + AppColors.contentColorPink, + AppColors.contentColorOrange, + AppColors.contentColorPurple, + AppColors.contentColorBlue, + AppColors.contentColorRed, + AppColors.contentColorCyan, + AppColors.contentColorBlue, + AppColors.contentColorGreen, + AppColors.contentColorPink, + ]; List selectedSpots = []; + PainterType _currentPaintType = PainterType.circle; + + static FlDotPainter _getPaint(PainterType type, double size, Color color) { + switch (type) { + case PainterType.circle: + return FlDotCirclePainter( + color: color, + radius: size, + ); + case PainterType.square: + return FlDotSquarePainter( + color: color, + size: size * 2, + strokeWidth: 0, + ); + case PainterType.cross: + return FlDotCrossPainter( + color: color, + size: size * 2, + width: max(size / 5, 2), + ); + } + } + @override Widget build(BuildContext context) { + // (x, y, size) + final data = [ + (4.0, 4.0, 4.0), + (2.0, 5.0, 12.0), + (4.0, 5.0, 8.0), + (8.0, 6.0, 20.0), + (5.0, 7.0, 14.0), + (7.0, 2.0, 18.0), + (3.0, 2.0, 36.0), + (2.0, 8.0, 22.0), + (8.0, 8.0, 32.0), + (5.0, 2.5, 24.0), + (3.0, 7.0, 18.0), + ]; return AspectRatio( aspectRatio: 1, - child: ScatterChart( - ScatterChartData( - scatterSpots: [ - ScatterSpot( - 4, - 4, - dotPainter: FlDotCirclePainter( - color: selectedSpots.contains(0) - ? AppColors.contentColorGreen - : AppColors.contentColorWhite.withOpacity(0.5), - ), - ), - ScatterSpot( - 2, - 5, - dotPainter: FlDotCirclePainter( - color: selectedSpots.contains(1) - ? AppColors.contentColorYellow - : AppColors.contentColorWhite.withOpacity(0.5), - radius: 12, - ), - ), - ScatterSpot( - 4, - 5, - dotPainter: FlDotCirclePainter( - color: selectedSpots.contains(2) - ? AppColors.contentColorPink - : AppColors.contentColorWhite.withOpacity(0.5), - radius: 8, - ), - ), - ScatterSpot( - 8, - 6, - dotPainter: FlDotCirclePainter( - color: selectedSpots.contains(3) - ? AppColors.contentColorOrange - : AppColors.contentColorWhite.withOpacity(0.5), - radius: 20, - ), - ), - ScatterSpot( - 5, - 7, - dotPainter: FlDotCirclePainter( - color: selectedSpots.contains(4) - ? AppColors.contentColorPurple - : AppColors.contentColorWhite.withOpacity(0.5), - radius: 14, - ), - ), - ScatterSpot( - 7, - 2, - dotPainter: FlDotCirclePainter( - color: selectedSpots.contains(5) - ? AppColors.contentColorBlue - : AppColors.contentColorWhite.withOpacity(0.5), - radius: 18, + child: Stack( + children: [ + ScatterChart( + ScatterChartData( + scatterSpots: data.asMap().entries.map((e) { + final index = e.key; + final (double x, double y, double size) = e.value; + return ScatterSpot( + x, + y, + dotPainter: _getPaint( + _currentPaintType, + size, + selectedSpots.contains(index) + ? _availableColors[index % _availableColors.length] + : AppColors.contentColorWhite.withOpacity(0.5), + ), + ); + }).toList(), + minX: 0, + maxX: 10, + minY: 0, + maxY: 10, + borderData: FlBorderData( + show: false, ), - ), - ScatterSpot( - 3, - 2, - dotPainter: FlDotCirclePainter( - color: selectedSpots.contains(6) - ? AppColors.contentColorRed - : AppColors.contentColorWhite.withOpacity(0.5), - radius: 36, + gridData: FlGridData( + show: true, + drawHorizontalLine: true, + checkToShowHorizontalLine: (value) => true, + getDrawingHorizontalLine: (value) => const FlLine( + color: AppColors.gridLinesColor, + ), + drawVerticalLine: true, + checkToShowVerticalLine: (value) => true, + getDrawingVerticalLine: (value) => const FlLine( + color: AppColors.gridLinesColor, + ), ), - ), - ScatterSpot( - 2, - 8, - dotPainter: FlDotCirclePainter( - color: selectedSpots.contains(7) - ? AppColors.contentColorCyan - : AppColors.contentColorWhite.withOpacity(0.5), - radius: 22, + titlesData: const FlTitlesData( + show: false, ), - ), - ], - minX: 0, - maxX: 10, - minY: 0, - maxY: 10, - borderData: FlBorderData( - show: false, - ), - gridData: FlGridData( - show: true, - drawHorizontalLine: true, - checkToShowHorizontalLine: (value) => true, - getDrawingHorizontalLine: (value) => const FlLine( - color: AppColors.gridLinesColor, - ), - drawVerticalLine: true, - checkToShowVerticalLine: (value) => true, - getDrawingVerticalLine: (value) => const FlLine( - color: AppColors.gridLinesColor, - ), - ), - titlesData: const FlTitlesData( - show: false, - ), - showingTooltipIndicators: selectedSpots, - scatterTouchData: ScatterTouchData( - enabled: true, - handleBuiltInTouches: false, - mouseCursorResolver: - (FlTouchEvent touchEvent, ScatterTouchResponse? response) { - return response == null || response.touchedSpot == null - ? MouseCursor.defer - : SystemMouseCursors.click; - }, - touchTooltipData: ScatterTouchTooltipData( - tooltipBgColor: Colors.black, - getTooltipItems: (ScatterSpot touchedBarSpot) { - return ScatterTooltipItem( - 'X: ', - textStyle: TextStyle( - height: 1.2, - color: Colors.grey[100], - fontStyle: FontStyle.italic, - ), - bottomMargin: 10, - children: [ - TextSpan( - text: '${touchedBarSpot.x.toInt()} \n', - style: const TextStyle( - color: Colors.white, - fontStyle: FontStyle.normal, - fontWeight: FontWeight.bold, - ), - ), - TextSpan( - text: 'Y: ', - style: TextStyle( + showingTooltipIndicators: selectedSpots, + scatterTouchData: ScatterTouchData( + enabled: true, + handleBuiltInTouches: false, + mouseCursorResolver: + (FlTouchEvent touchEvent, ScatterTouchResponse? response) { + return response == null || response.touchedSpot == null + ? MouseCursor.defer + : SystemMouseCursors.click; + }, + touchTooltipData: ScatterTouchTooltipData( + tooltipBgColor: Colors.black, + getTooltipItems: (ScatterSpot touchedBarSpot) { + return ScatterTooltipItem( + 'X: ', + textStyle: TextStyle( height: 1.2, color: Colors.grey[100], fontStyle: FontStyle.italic, ), - ), - TextSpan( - text: touchedBarSpot.y.toInt().toString(), - style: const TextStyle( - color: Colors.white, - fontStyle: FontStyle.normal, - fontWeight: FontWeight.bold, - ), - ), - ], - ); - }, - ), - touchCallback: - (FlTouchEvent event, ScatterTouchResponse? touchResponse) { - if (touchResponse == null || touchResponse.touchedSpot == null) { - return; - } - if (event is FlTapUpEvent) { - final sectionIndex = touchResponse.touchedSpot!.spotIndex; - setState(() { - if (selectedSpots.contains(sectionIndex)) { - selectedSpots.remove(sectionIndex); - } else { - selectedSpots.add(sectionIndex); + bottomMargin: 10, + children: [ + TextSpan( + text: '${touchedBarSpot.x.toInt()} \n', + style: const TextStyle( + color: Colors.white, + fontStyle: FontStyle.normal, + fontWeight: FontWeight.bold, + ), + ), + TextSpan( + text: 'Y: ', + style: TextStyle( + height: 1.2, + color: Colors.grey[100], + fontStyle: FontStyle.italic, + ), + ), + TextSpan( + text: touchedBarSpot.y.toInt().toString(), + style: const TextStyle( + color: Colors.white, + fontStyle: FontStyle.normal, + fontWeight: FontWeight.bold, + ), + ), + ], + ); + }, + ), + touchCallback: + (FlTouchEvent event, ScatterTouchResponse? touchResponse) { + if (touchResponse == null || + touchResponse.touchedSpot == null) { + return; + } + if (event is FlTapUpEvent) { + final sectionIndex = touchResponse.touchedSpot!.spotIndex; + setState(() { + if (selectedSpots.contains(sectionIndex)) { + selectedSpots.remove(sectionIndex); + } else { + selectedSpots.add(sectionIndex); + } + }); } - }); - } - }, + }, + ), + ), ), - ), + Align( + alignment: Alignment.topLeft, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: DropdownButton( + value: _currentPaintType, + items: PainterType.values + .map((e) => DropdownMenuItem( + value: e, + child: Text(e.name), + )) + .toList(), + onChanged: (PainterType? value) { + setState(() { + _currentPaintType = value!; + }); + }, + ), + ), + ), + ], ), ); } } + +enum PainterType { + circle, + square, + cross, +} From e9ab49378ecc1b226b4d6dfd90a5907c012763fb Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Mon, 4 Dec 2023 00:23:02 +0100 Subject: [PATCH 075/149] Fix barChart tooltip for values below or above the 0 point, #1462 --- CHANGELOG.md | 1 + lib/src/chart/bar_chart/bar_chart_painter.dart | 14 +++++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c96450cb0..4b739482a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ ScatterSpot( ), ), ``` +* **BUGFIX** (by @imaNNeo) Fix barChart tooltip for values below or above the 0 point, #1462 ## 0.65.0 * **FEATURE** (by @Dartek12) Added gradient to [FlLine](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#FlLine), #1197 diff --git a/lib/src/chart/bar_chart/bar_chart_painter.dart b/lib/src/chart/bar_chart/bar_chart_painter.dart index 0214682fa..ff7a41347 100644 --- a/lib/src/chart/bar_chart/bar_chart_painter.dart +++ b/lib/src/chart/bar_chart/bar_chart_painter.dart @@ -386,17 +386,21 @@ class BarChartPainter extends AxisChartPainter { /// if we have multiple bar lines, /// there are more than one FlCandidate on touch area, /// we should get the most top FlSpot Offset to draw the tooltip on top of it - final barOffset = Offset( + final barToYPixel = Offset( groupPositions[barGroupIndex].barsX[barRodIndex], getPixelY(showOnRodData.toY, viewSize, holder), ); + final barFromYPixel = Offset( + groupPositions[barGroupIndex].barsX[barRodIndex], + getPixelY(showOnRodData.fromY, viewSize, holder), + ); + final tooltipWidth = textWidth + tooltipData.tooltipPadding.horizontal; final tooltipHeight = textHeight + tooltipData.tooltipPadding.vertical; - final zeroY = getPixelY(0, viewSize, holder); - final barTopY = min(zeroY, barOffset.dy); - final barBottomY = max(zeroY, barOffset.dy); + final barTopY = min(barToYPixel.dy, barFromYPixel.dy); + final barBottomY = max(barToYPixel.dy, barFromYPixel.dy); final drawTooltipOnTop = tooltipData.direction == TooltipDirection.top || (tooltipData.direction == TooltipDirection.auto && showOnRodData.isUpward()); @@ -405,7 +409,7 @@ class BarChartPainter extends AxisChartPainter { : barBottomY + tooltipData.tooltipMargin; final tooltipLeft = getTooltipLeft( - barOffset.dx, + barToYPixel.dx, tooltipWidth, tooltipData.tooltipHorizontalAlignment, tooltipData.tooltipHorizontalOffset, From 68cf161f2623cedda2bf1b51bef758cf62beb812 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Fri, 15 Dec 2023 22:11:53 +0100 Subject: [PATCH 076/149] Fix pieChart drawing single section on iPhone, #1515 --- CHANGELOG.md | 1 + .../chart/pie_chart/pie_chart_painter.dart | 27 ++++++++++++++----- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b739482a..7a80f51e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ ScatterSpot( ), ``` * **BUGFIX** (by @imaNNeo) Fix barChart tooltip for values below or above the 0 point, #1462 +* **BUGFIX** (by @imaNNeo) Fix pieChart drawing single section on iPhone, #1515 ## 0.65.0 * **FEATURE** (by @Dartek12) Added gradient to [FlLine](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#FlLine), #1197 diff --git a/lib/src/chart/pie_chart/pie_chart_painter.dart b/lib/src/chart/pie_chart/pie_chart_painter.dart index 8f73cdced..ef1081a48 100644 --- a/lib/src/chart/pie_chart/pie_chart_painter.dart +++ b/lib/src/chart/pie_chart/pie_chart_painter.dart @@ -21,11 +21,15 @@ class PieChartPainter extends BaseChartPainter { PieChartPainter() : super() { _sectionPaint = Paint()..style = PaintingStyle.stroke; + _sectionSaveLayerPaint = Paint(); + _sectionStrokePaint = Paint()..style = PaintingStyle.stroke; _centerSpacePaint = Paint()..style = PaintingStyle.fill; } + late Paint _sectionPaint; + late Paint _sectionSaveLayerPaint; late Paint _sectionStrokePaint; late Paint _centerSpacePaint; @@ -100,13 +104,24 @@ class PieChartPainter extends BaseChartPainter { if (sectionDegree == 360) { _sectionPaint ..color = section.color - ..strokeWidth = section.radius - ..style = PaintingStyle.stroke; - canvasWrapper.drawCircle( - center, - centerRadius + section.radius / 2, - _sectionPaint, + ..style = PaintingStyle.fill; + final bounds = Rect.fromCircle( + center: center, + radius: centerRadius + section.radius, ); + canvasWrapper + ..saveLayer(bounds, _sectionSaveLayerPaint) + ..drawCircle( + center, + centerRadius + section.radius, + _sectionPaint..blendMode = BlendMode.srcOver, + ) + ..drawCircle( + center, + centerRadius, + _sectionPaint..blendMode = BlendMode.srcOut, + ) + ..restore(); if (section.borderSide.width != 0.0 && section.borderSide.color.opacity != 0.0) { _sectionStrokePaint From 08107bf5aa0a1e87d62ec48f846458cbb32b41a7 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Fri, 15 Dec 2023 22:25:20 +0100 Subject: [PATCH 077/149] Fix test fail issue --- .../pie_chart/pie_chart_painter_test.dart | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/test/chart/pie_chart/pie_chart_painter_test.dart b/test/chart/pie_chart/pie_chart_painter_test.dart index b92cdf6d8..7f82288ce 100644 --- a/test/chart/pie_chart/pie_chart_painter_test.dart +++ b/test/chart/pie_chart/pie_chart_painter_test.dart @@ -117,10 +117,12 @@ void main() { test('test 1', () { const viewSize = Size(200, 200); + const radius = 30.0; + const centerSpace = 10.0; final sections = [ PieChartSectionData( color: MockData.color2, - radius: 30, + radius: radius, value: 10, borderSide: const BorderSide( color: MockData.color3, @@ -141,17 +143,31 @@ void main() { when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); barChartPainter.drawSections(mockCanvasWrapper, [360], 10, holder); - final result = verify( + final rect = Rect.fromCircle( + center: viewSize.center(Offset.zero), + radius: radius + centerSpace, + ); + final results = verifyInOrder([ + mockCanvasWrapper.saveLayer( + rect, + any, + ), mockCanvasWrapper.drawCircle( const Offset(100, 100), - 10 + 15, + 10 + 30, captureAny, ), - ); + mockCanvasWrapper.drawCircle( + const Offset(100, 100), + 10, + captureAny, + ), + mockCanvasWrapper.restore(), + ]); + final result = results[1]; expect(result.callCount, 1); expect((result.captured.single as Paint).color, MockData.color2); - expect((result.captured.single as Paint).strokeWidth, 30); - expect((result.captured.single as Paint).style, PaintingStyle.stroke); + expect((result.captured.single as Paint).style, PaintingStyle.fill); final result2 = verify( mockCanvasWrapper.drawCircle( From bcd4aefc39eb84933ff5a763373b5556ac74a572 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Mon, 25 Dec 2023 12:03:36 +0100 Subject: [PATCH 078/149] Add gradient property to the HorizontalLine and VerticalLine, #1525 --- .../base/axis_chart/axis_chart_data.dart | 28 ++++++++----------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/lib/src/chart/base/axis_chart/axis_chart_data.dart b/lib/src/chart/base/axis_chart/axis_chart_data.dart index 425e351be..f793b14b4 100644 --- a/lib/src/chart/base/axis_chart/axis_chart_data.dart +++ b/lib/src/chart/base/axis_chart/axis_chart_data.dart @@ -963,17 +963,14 @@ class HorizontalLine extends FlLine with EquatableMixin { HorizontalLine({ required this.y, HorizontalLineLabel? label, - Color? color, - double? strokeWidth, + super.color, + super.gradient, + super.strokeWidth, super.dashArray, this.image, this.sizedPicture, this.strokeCap = StrokeCap.butt, - }) : label = label ?? HorizontalLineLabel(), - super( - color: color ?? Colors.black, - strokeWidth: strokeWidth ?? 2, - ); + }) : label = label ?? HorizontalLineLabel(); /// Draws from left to right of the chart using the [y] value. final double y; @@ -997,7 +994,8 @@ class HorizontalLine extends FlLine with EquatableMixin { y: lerpDouble(a.y, b.y, t)!, label: HorizontalLineLabel.lerp(a.label, b.label, t), color: Color.lerp(a.color, b.color, t), - strokeWidth: lerpDouble(a.strokeWidth, b.strokeWidth, t), + gradient: Gradient.lerp(a.gradient, b.gradient, t), + strokeWidth: lerpDouble(a.strokeWidth, b.strokeWidth, t)!, dashArray: lerpIntList(a.dashArray, b.dashArray, t), image: b.image, sizedPicture: b.sizedPicture, @@ -1037,17 +1035,14 @@ class VerticalLine extends FlLine with EquatableMixin { VerticalLine({ required this.x, VerticalLineLabel? label, - Color? color, - double? strokeWidth, + super.color, + super.gradient, + super.strokeWidth, super.dashArray, this.image, this.sizedPicture, this.strokeCap = StrokeCap.butt, - }) : label = label ?? VerticalLineLabel(), - super( - color: color ?? Colors.black, - strokeWidth: strokeWidth ?? 2, - ); + }) : label = label ?? VerticalLineLabel(); /// Draws from bottom to top of the chart using the [x] value. final double x; @@ -1071,7 +1066,8 @@ class VerticalLine extends FlLine with EquatableMixin { x: lerpDouble(a.x, b.x, t)!, label: VerticalLineLabel.lerp(a.label, b.label, t), color: Color.lerp(a.color, b.color, t), - strokeWidth: lerpDouble(a.strokeWidth, b.strokeWidth, t), + gradient: Gradient.lerp(a.gradient, b.gradient, t), + strokeWidth: lerpDouble(a.strokeWidth, b.strokeWidth, t)!, dashArray: lerpIntList(a.dashArray, b.dashArray, t), image: b.image, sizedPicture: b.sizedPicture, From bee1cf3f16ff0ea72e46221728b848fdca580c9e Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Mon, 25 Dec 2023 12:06:03 +0100 Subject: [PATCH 079/149] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a80f51e8..b5d1af4de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ ScatterSpot( ``` * **BUGFIX** (by @imaNNeo) Fix barChart tooltip for values below or above the 0 point, #1462 * **BUGFIX** (by @imaNNeo) Fix pieChart drawing single section on iPhone, #1515 +* **IMPROVEMENT** (by @imaNNeo) Add gradient property to the [HorizontalLine](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#horizontalline) and [VerticalLine](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#verticalline), #1525 ## 0.65.0 * **FEATURE** (by @Dartek12) Added gradient to [FlLine](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#FlLine), #1197 From 6f9c8599d1a83c24ff8f0df0c1f52e34bb754a25 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Mon, 25 Dec 2023 12:07:52 +0100 Subject: [PATCH 080/149] Fix format issue --- lib/src/chart/base/axis_chart/axis_chart_data.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/chart/base/axis_chart/axis_chart_data.dart b/lib/src/chart/base/axis_chart/axis_chart_data.dart index f793b14b4..a5cddae35 100644 --- a/lib/src/chart/base/axis_chart/axis_chart_data.dart +++ b/lib/src/chart/base/axis_chart/axis_chart_data.dart @@ -1042,7 +1042,7 @@ class VerticalLine extends FlLine with EquatableMixin { this.image, this.sizedPicture, this.strokeCap = StrokeCap.butt, - }) : label = label ?? VerticalLineLabel(); + }) : label = label ?? VerticalLineLabel(); /// Draws from bottom to top of the chart using the [x] value. final double x; From 950ac7f647631cabd18747f1ef3f0f4b72459374 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Mon, 25 Dec 2023 12:13:17 +0100 Subject: [PATCH 081/149] Update base_chart.md docs --- repo_files/documentations/base_chart.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/repo_files/documentations/base_chart.md b/repo_files/documentations/base_chart.md index c41ed5c50..5f9f95361 100644 --- a/repo_files/documentations/base_chart.md +++ b/repo_files/documentations/base_chart.md @@ -67,7 +67,7 @@ |propName|Description|default value| |:-------|:----------|:------------| |color|determines the color of line|Colors.black| -|gradient|gradient of the line|null| +|gradient|gradient of the line (you have to provide either `color` or `gradient`|null| |strokeWidth|determines the stroke width of the line|2| |dashArray|A circular array of dash offsets and lengths. For example, the array `[5, 10]` would result in dashes 5 pixels long followed by blank spaces 10 pixels long. The array `[5, 10, 5]` would result in a 5 pixel dash, a 10 pixel gap, a 5 pixel dash, a 5 pixel gap, a 10 pixel dash, etc.|null| @@ -135,6 +135,7 @@ Base class for all supported touch/pointer events. |:-------|:----------|:------------| |y|draw straight line from left to right of the chart with dynamic y value|null| |color|color of the line|Colors.black| +|gradient|gradient of the line (you have to provide either `color` or `gradient`|null| |strokeWidth|strokeWidth of the line|2| |strokeCap|strokeCap of the line,e.g. Setting to StrokeCap.round will draw the tow ends of line rounded. NOTE: this might not work on dash lines.|StrokeCap.butt| |image|image to annotate the line. the Future must be complete at the time this is received by the chart|null| @@ -146,6 +147,7 @@ Base class for all supported touch/pointer events. |:-------|:----------|:------------| |x|draw straight line from bottom to top of the chart with dynamic x value|null| |color|color of the line|Colors.black| +|gradient|gradient of the line (you have to provide either `color` or `gradient`|null| |strokeWidth|strokeWidth of the line|2| |strokeCap|strokeCap of the line,e.g. Setting to StrokeCap.round will draw the tow ends of line rounded. NOTE: this might not work on dash lines.|StrokeCap.butt| |image|image to annotate the line. the Future must be complete at the time this is received by the chart|null| From 2482719f187759fe18e5d0655e5f9db5f14b9ff8 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Mon, 25 Dec 2023 12:19:37 +0100 Subject: [PATCH 082/149] Rename all /master to /main --- CHANGELOG.md | 206 +++++++++--------- CONTRIBUTING.md | 4 +- README.md | 20 +- example/lib/urls.dart | 4 +- example/lib/util/device_info.dart | 2 +- lib/src/chart/bar_chart/bar_chart_data.dart | 2 +- .../base/base_chart/base_chart_data.dart | 2 +- lib/src/chart/line_chart/line_chart_data.dart | 2 +- lib/src/chart/pie_chart/pie_chart_data.dart | 2 +- .../chart/radar_chart/radar_chart_data.dart | 2 +- .../scatter_chart/scatter_chart_data.dart | 2 +- repo_files/documentations/bar_chart.md | 22 +- .../documentations/handle_animations.md | 2 +- repo_files/documentations/handle_touches.md | 4 +- repo_files/documentations/line_chart.md | 30 +-- .../0.50.0/MIGRATION_00_50_00.md | 22 +- .../0.55.0/MIGRATION_00_55_00.md | 8 +- .../documentations/migration_guides/INDEX.md | 4 +- repo_files/documentations/pie_chart.md | 12 +- repo_files/documentations/radar_chart.md | 8 +- repo_files/documentations/scatter_chart.md | 10 +- 21 files changed, 185 insertions(+), 185 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b5d1af4de..313479b2d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,10 +25,10 @@ ScatterSpot( ``` * **BUGFIX** (by @imaNNeo) Fix barChart tooltip for values below or above the 0 point, #1462 * **BUGFIX** (by @imaNNeo) Fix pieChart drawing single section on iPhone, #1515 -* **IMPROVEMENT** (by @imaNNeo) Add gradient property to the [HorizontalLine](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#horizontalline) and [VerticalLine](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#verticalline), #1525 +* **IMPROVEMENT** (by @imaNNeo) Add gradient property to the [HorizontalLine](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#horizontalline) and [VerticalLine](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#verticalline), #1525 ## 0.65.0 -* **FEATURE** (by @Dartek12) Added gradient to [FlLine](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#FlLine), #1197 +* **FEATURE** (by @Dartek12) Added gradient to [FlLine](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#FlLine), #1197 * **BUGFIX** (by @imaNNeo) Fix bar line shadow crash when we have only one (or zero) spot, #1466 * **BUGFIX** (by @imaNNeo) Fix having negative `toY` (or positive `fromY`) in BarChart's `minY` and `maxY` calculations, #1470 * **BUGFIX** (by @bobatsar) Fix bars drawn outside of diagram @@ -49,7 +49,7 @@ ScatterSpot( ## 0.62.0 * **BUGFIX** (by @JoshMart) Fix extra lines not painting when at chart min or max, #1255. * **BUGFIX** (by @imaNNeo) Check if mounted before calling setState in _handleBuiltInTouch methods in bar, line and scatter charts, #1101 -* **FEATURE** (by @MagdyYacoub1): Added gradient color to [RangeAnnotations](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#rangeannotations) by adding gradient attribute to [horizontalRangeAnnotations](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#horizontalrangeannotation) and [VerticalRangeAnnotation](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#verticalrangeannotation), #1195. +* **FEATURE** (by @MagdyYacoub1): Added gradient color to [RangeAnnotations](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#rangeannotations) by adding gradient attribute to [horizontalRangeAnnotations](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#horizontalrangeannotation) and [VerticalRangeAnnotation](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#verticalrangeannotation), #1195. * **BUGFIX** (by @Motionz-Von)Fix windows build for example app * **FEATURE** (by @Motionz-Von)BarChart groupSpace also takes effect when alignment is BarChartAlignment.end or BarChartAlignment.start. * **FEATURE** (by @Motionz-Von) supports setting line StrokeCap on HorizontalLine/VerticalLine @@ -57,8 +57,8 @@ ScatterSpot( * **IMPROVEMENT** (by @imaNNeo) Update LineChartSample5 to demonstrate click to toggle show/hide tooltip, #118 ## 0.61.0 -* **IMPROVEMENT** (by @imaNNeo) Remove assertion to check to provide only one of `color` or `gradient` property in the [BarChartRodData](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/bar_chart.md#barchartroddata) and [BackgroundBarChartRodData](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/bar_chart.md#backgroundbarchartroddata), #1121. -* **IMPROVEMENT** (by @imaNNeo) Make `drawBehindEverything` property default to `true` in [AxisTitles](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#axistitle) class, #1097. +* **IMPROVEMENT** (by @imaNNeo) Remove assertion to check to provide only one of `color` or `gradient` property in the [BarChartRodData](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/bar_chart.md#barchartroddata) and [BackgroundBarChartRodData](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/bar_chart.md#backgroundbarchartroddata), #1121. +* **IMPROVEMENT** (by @imaNNeo) Make `drawBehindEverything` property default to `true` in [AxisTitles](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#axistitle) class, #1097. * **BUGFIX** (by @imaNNeo) Show `0` instead of `-0` in some edge-cases in the default titles * **FEATURE** (by @tamasapps): Add `tooltipHorizontalAlignment` and `tooltipHorizontalOffset` property in [LineTouchTooltipData], [BarTouchTooltipData], [ScatterTouchTooltipData]. * **FEATURE** (by @dhiyaaulauliyaa) Add ability to force SideTitle to be placed inside its corresponding axis bounding box, #603. @@ -74,13 +74,13 @@ ScatterSpot( * **FEATURE** (by @soraef) Add a `positionPercentageOffset` optional property to RadarChartTitle to allow individual title positioning * **BUGFIX** (by @imaNNeo) Allow to draw empty radarChart (with all zero values), #1217 * **IMPORTANT** **IRAN NEEDS YOU. SPREAD THE NEWS.** - + ## 0.55.2 * **BUGFIX** (by @imaNNeo): Fix inner border of pieChart with single section, #1089 * **IMPORTANT** **IRAN NEEDS HELP** - + As you might know, Islamic Republic of Iran is murdering people in silence right now in Iran They shut the Internet down to do that. That’s why I cannot maintain this library for a while. @@ -106,7 +106,7 @@ Also, [this article](https://www.bbc.com/news/world-middle-east-62984076) might * **FEATURE** (by @FlorianArnould) Add the ability to select the RadarChart shape (circle or polygon), #1047. * **BUGFIX** (by @imaNNeo): Fix LineChart titles problem with single FlSpot, #1053. * **FEATURE** (by @FlorianArnould) Add the ability to rotate the RadarChar titles, #883. -* **BREAKING** (by @FlorianArnould) [RadarChartData.getTitle](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/radar_chart.md#RadarChartData) have a new parameter `angle` and now returns a [RadarChartTitle](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/radar_chart.md#RadarChartTitle) instead of a simple `string`. (Read our [Migration Guide](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/migration_guides/0.55.0/MIGRATION_00_55_00.md) to learn more about it) +* **BREAKING** (by @FlorianArnould) [RadarChartData.getTitle](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/radar_chart.md#RadarChartData) have a new parameter `angle` and now returns a [RadarChartTitle](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/radar_chart.md#RadarChartTitle) instead of a simple `string`. (Read our [Migration Guide](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/migration_guides/0.55.0/MIGRATION_00_55_00.md) to learn more about it) ## 0.51.0 * **FEATURE** (by @imaNNeo): Add `SideTitleWidget` to help you use it in [SideTitles.getTitlesWidget]. It's a wrapper around your widget. It keeps your provided `child` widget close to the chart. It has `angle` and `space` properties to handle margin and rotation. There is a `axisSide` property that you should fill, it has provided to you in the MetaData object. Check the below sample: @@ -133,30 +133,30 @@ getTitlesWidget: (double value, TitleMeta meta) { ## 0.50.3 * **IMPROVEMENT** Fix order of drawing lineChart bar indicator problem, #198. -* **FEATURE** Add `isStrokeJoinRound` property in [LineChartBarData](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/line_chart.md#linechartbardata). +* **FEATURE** Add `isStrokeJoinRound` property in [LineChartBarData](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/line_chart.md#linechartbardata). * **IMPROVEMENT** Upgrade to Flutter 3, #997. -* **FEATURE** Add `chartRendererKey` property to the [LineChart](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/line_chart.md), [BarChart](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/bar_chart.md), and [ScatterChart](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/scatter_chart.md). We pass it directly to our chart renderers that are responsible to render the chart itself (without anything around it like titles), #987. +* **FEATURE** Add `chartRendererKey` property to the [LineChart](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/line_chart.md), [BarChart](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/bar_chart.md), and [ScatterChart](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/scatter_chart.md). We pass it directly to our chart renderers that are responsible to render the chart itself (without anything around it like titles), #987. ## 0.50.1 * **BUGFIX** Allow to show axisTitle without sideTitles, #963 ## 0.50.0 -**This release has some breaking changes. So please check out the migration guide [here](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/migration_guides/0.50.0/MIGRATION_00_50_00.md)** -* **IMPROVEMENT** Allow to return a Widget in [SideTitles.getTitlesWidget](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#sidetitles) instead of a `String`. For example, you can pass an [Icon](https://api.flutter.dev/flutter/widgets/Icon-class.html) widget as a title, #183. Check below samples: -> **LineChartSample 8** ([Source Code](https://github.com/imaNNeo/fl_chart/blob/master/example/lib/presentation/samples/line/line_chart_sample8.dart)) -> +**This release has some breaking changes. So please check out the migration guide [here](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/migration_guides/0.50.0/MIGRATION_00_50_00.md)** +* **IMPROVEMENT** Allow to return a Widget in [SideTitles.getTitlesWidget](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#sidetitles) instead of a `String`. For example, you can pass an [Icon](https://api.flutter.dev/flutter/widgets/Icon-class.html) widget as a title, #183. Check below samples: +> **LineChartSample 8** ([Source Code](https://github.com/imaNNeo/fl_chart/blob/main/example/lib/presentation/samples/line/line_chart_sample8.dart)) +> > -> **BarChartSample 7** ([Source Code](https://github.com/imaNNeo/fl_chart/blob/master/example/lib/presentation/samples/bar/bar_chart_sample7.dart)) +> **BarChartSample 7** ([Source Code](https://github.com/imaNNeo/fl_chart/blob/main/example/lib/presentation/samples/bar/bar_chart_sample7.dart)) > -> -* **BREAKING** Structure of `FlTitlesData`, `AxisTitles`, and `SideTitles` are changed. Because we are using a new system which allows you to pass any [Flutter Widget](https://docs.flutter.dev/development/ui/widgets) as a title instead of passing `string`, `textStyle`, `textAlign`, `rotation`, ... (Read our [Migration Guide](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/migration_guides/0.50.0/MIGRATION_00_50_00.md)) +> +* **BREAKING** Structure of `FlTitlesData`, `AxisTitles`, and `SideTitles` are changed. Because we are using a new system which allows you to pass any [Flutter Widget](https://docs.flutter.dev/development/ui/widgets) as a title instead of passing `string`, `textStyle`, `textAlign`, `rotation`, ... (Read our [Migration Guide](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/migration_guides/0.50.0/MIGRATION_00_50_00.md)) * **FEATURE** Now we can use any [Gradient](https://api.flutter.dev/flutter/dart-ui/Gradient-class.html) such as [LinearGradient](https://api.flutter.dev/flutter/painting/LinearGradient-class.html) and [RadialGradient](https://api.flutter.dev/flutter/painting/RadialGradient-class.html) everywhere we have gradient. * **BUGFIX** Fix BarChart rods gradient problem, #703. -* **BREAKING** `colors` property renamed to `color` to keep only one solid color. And now we have a `gradient` field instead of `colorStops`, `gradientFrom` and `gradientTo` in following classes: [BarChartRodData](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/bar_chart.md#barchartroddata), [BackgroundBarChartRodData](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/bar_chart.md#backgroundbarchartroddata), [BarAreaData](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/line_chart.md#BarAreaData), [BetweenBarsData](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/line_chart.md#betweenbarsdata), [LineChartBarData](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/line_chart.md#linechartbardata). (Read our [Migration Guide](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/migration_guides/0.50.0/MIGRATION_00_50_00.md) to learn more about it) +* **BREAKING** `colors` property renamed to `color` to keep only one solid color. And now we have a `gradient` field instead of `colorStops`, `gradientFrom` and `gradientTo` in following classes: [BarChartRodData](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/bar_chart.md#barchartroddata), [BackgroundBarChartRodData](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/bar_chart.md#backgroundbarchartroddata), [BarAreaData](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/line_chart.md#BarAreaData), [BetweenBarsData](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/line_chart.md#betweenbarsdata), [LineChartBarData](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/line_chart.md#linechartbardata). (Read our [Migration Guide](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/migration_guides/0.50.0/MIGRATION_00_50_00.md) to learn more about it) ## 0.46.0 * **BUGFIX** Fix drawing BetweenBarsArea problem when there are `nullSpots` in fromLine and toLine, #912. -* **FEATURE** Allow to have vertically grouped BarChart using `fromY` and `toY` properties in [BarChartRodData](https://github.com/imaNNeo/fl_chart/blob/feature/multi-rods-on-bar-chart/repo_files/documentations/bar_chart.md#BarChartRodData) It means you can have a negative and a positive bar chart at the same X location. #334, #875. Check [BarChartSample5](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/bar_chart.md#sample-5-source-code) and [BarChartSample6](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/bar_chart.md#sample-6-source-code. +* **FEATURE** Allow to have vertically grouped BarChart using `fromY` and `toY` properties in [BarChartRodData](https://github.com/imaNNeo/fl_chart/blob/feature/multi-rods-on-bar-chart/repo_files/documentations/bar_chart.md#BarChartRodData) It means you can have a negative and a positive bar chart at the same X location. #334, #875. Check [BarChartSample5](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/bar_chart.md#sample-5-source-code) and [BarChartSample6](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/bar_chart.md#sample-6-source-code. * **BREAKING** Renamed `y` property to `toY` in [BarChartRodData](https://github.com/imaNNeo/fl_chart/blob/feature/multi-rods-on-bar-chart/repo_files/documentations/bar_chart.md#BarChartRodData) and [BackgroundBarChartRodData](https://github.com/imaNNeo/fl_chart/blob/feature/multi-rods-on-bar-chart/repo_files/documentations/bar_chart.md#backgroundbarchartroddata) due to the above feature. * **BUGFIX** Fix smaller radius bubble hiding behind bigger radius bubble in ScatterChart, #930. * **BUGFIX** Fix tooltip text alignment and direction in line chart, #927. @@ -164,7 +164,7 @@ getTitlesWidget: (double value, TitleMeta meta) { ## 0.45.1 * **IMPORTANT** **Fuck Vladimir Putin** * **BUGFIX** Fix `FlSpot.nullSpot` at the first of list bug, #912. -* **FEATURE** Add `scatterLabelSettings` property in [ScatterChart](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/scatter_chart.md) which lets you to add titles on the spots, #902. +* **FEATURE** Add `scatterLabelSettings` property in [ScatterChart](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/scatter_chart.md) which lets you to add titles on the spots, #902. ## 0.45.0 * **BUGFIX** Fix `clipData` implementation in ScatterChart and LineChart, #897. @@ -172,13 +172,13 @@ getTitlesWidget: (double value, TitleMeta meta) { * **BUGFIX** Fix LineChart width smaller width or height lower than 40, #869, #857. * **BUGFIX** Allow to show title when axis diff is zero, #842, #879. * **IMPROVEMENT** Improve iteration over axis values logic (it solves some minor problems on showing titles when min, max values are below than 1.0). -* **IMPROVEMENT** Add `baselineX` and `baselineY` property in our axis-based charts, It fixes a problem about `interval` which mentioned in #893 (check [this sample](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/line_chart.md#gist---baselinex-baseliney-sample-source-code). +* **IMPROVEMENT** Add `baselineX` and `baselineY` property in our axis-based charts, It fixes a problem about `interval` which mentioned in #893 (check [this sample](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/line_chart.md#gist---baselinex-baseliney-sample-source-code). * **IMPROVEMENT** Added `distanceCalculator` to `LineTouchData` which is used to calculate the distance between spots and touch events, #716, #261, #892 * **BREAKING** `LineTouchResponse` response now contains a list of `TouchLineBarSpot` instead of `LineBarSpot`. They are ordered based on their distance to the touch event and also contain that distance. ## 0.41.0 * **BUGFIX** Fix getNearestTouchedSpot. Previously it returned the first occurrence of a spot within the threshold, and not the nearest, #641, #645. -* **FEATURE** Add `textAlign` property in the [SideTitles](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#sidetitles), #784. +* **FEATURE** Add `textAlign` property in the [SideTitles](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#sidetitles), #784. * **IMPROVEMENT** Write some unit-tests and enable code coverage reports in our CI ## 0.40.6 @@ -202,34 +202,34 @@ getTitlesWidget: (double value, TitleMeta meta) { ## 0.40.0 * **BUGFIX** Fixed pieChart `centerRadius = double.infinity` problem, #747.c -* **BREAKING** Charts touchCallback signature has changed to `(FlTouchEvent event, BaseTouchResponse? response)` which [FlTouchEvent](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#fltouchevent) determines which touch/pointer event happened (such as `FlTapUpEvent`, `FlPanUpdateEvent`, ...), and BaseTouchResponse gives us the chart response. -* **BREAKING** Chart touchResponse classes don't have `touchInput` and `clickHappened` properties anymore. Use [FlTouchEvent](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#fltouchevent) provided in the callback instead of `touchInput`. Check `event is FlTapUpEvent` to detect touch events instead of checking `clickHappened`; -* **IMPROVEMENT** Again we support `longPress` touch events. check [FlTouchEvent](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#fltouchevent) to see all kind of supported touch/pointer events (which can be `FlLongPressStart`, `FlLongPressMoveUpdate`, `FlLongPressEnd`, ...). Also you can check out [touch handling doc](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/handle_touches.md), #649. -* **IMPROVEMENT** Added `mouseCursorResolver` callback in touchData classes such as [LineTouchData](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/line_chart.md#linetouchdata-read-about-touch-handling) and [BarTouchData](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/bar_chart.md#bartouchdata-read-about-touch-handling). You can change the [MouseCursor](https://api.flutter.dev/flutter/services/MouseCursor-class.html) based on the provided [FlTouchEvent](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#fltouchevent) and touchResponse using this callback. (We have used this feature in [PieChartSample2](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/scatter_chart.md#sample-2-source-code)) +* **BREAKING** Charts touchCallback signature has changed to `(FlTouchEvent event, BaseTouchResponse? response)` which [FlTouchEvent](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#fltouchevent) determines which touch/pointer event happened (such as `FlTapUpEvent`, `FlPanUpdateEvent`, ...), and BaseTouchResponse gives us the chart response. +* **BREAKING** Chart touchResponse classes don't have `touchInput` and `clickHappened` properties anymore. Use [FlTouchEvent](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#fltouchevent) provided in the callback instead of `touchInput`. Check `event is FlTapUpEvent` to detect touch events instead of checking `clickHappened`; +* **IMPROVEMENT** Again we support `longPress` touch events. check [FlTouchEvent](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#fltouchevent) to see all kind of supported touch/pointer events (which can be `FlLongPressStart`, `FlLongPressMoveUpdate`, `FlLongPressEnd`, ...). Also you can check out [touch handling doc](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/handle_touches.md), #649. +* **IMPROVEMENT** Added `mouseCursorResolver` callback in touchData classes such as [LineTouchData](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/line_chart.md#linetouchdata-read-about-touch-handling) and [BarTouchData](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/bar_chart.md#bartouchdata-read-about-touch-handling). You can change the [MouseCursor](https://api.flutter.dev/flutter/services/MouseCursor-class.html) based on the provided [FlTouchEvent](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#fltouchevent) and touchResponse using this callback. (We have used this feature in [PieChartSample2](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/scatter_chart.md#sample-2-source-code)) * **BUGFIX** Fixed `ScatterChart` default touchHandling crash * **BUGFIX** Fix text styles when updating the theme. Check this [theme-aware-sample](https://gist.github.com/imaNNeo/bf95e720621d799ab980a7a3287c56e2). * **IMPROVEMENT** Show narrow horizontal and vertical grid lines by default. * **IMPROVEMENT** Show all left, top (except BarChart), right, bottom titles in Axis based charts by default. -* **IMPROVEMENT** Set `BarChartAlignment.spaceEvenly` as `alignment` property of [BarChartData](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/bar_chart.md#barchartdata) by default -* **IMPROVEMENT** Allow [BarChart](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/bar_chart.md) and [LineChart](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md) have empty values instead of throwing exception (we don't show anything if there is nothing provided) -* **BREAKING** `textStyle` of [ScatterTooltipItem](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/scatter_chart.md#ScatterTooltipItem) is now nullable and optional. `bottomMargin` is also optional (default is zero). So both are named parameters now. +* **IMPROVEMENT** Set `BarChartAlignment.spaceEvenly` as `alignment` property of [BarChartData](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/bar_chart.md#barchartdata) by default +* **IMPROVEMENT** Allow [BarChart](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/bar_chart.md) and [LineChart](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md) have empty values instead of throwing exception (we don't show anything if there is nothing provided) +* **BREAKING** `textStyle` of [ScatterTooltipItem](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/scatter_chart.md#ScatterTooltipItem) is now nullable and optional. `bottomMargin` is also optional (default is zero). So both are named parameters now. * **IMPROVEMENT** We improved touch precision of `ScatterChart`. * **BUGFIX** Fix overlapping last gridlines on border lines problem. * **NEWS** Your donation **motivates** me to work more on the `fl_chart` and resolve more issues. Now you can [buy me a coffee](https://www.buymeacoffee.com/fl_chart)! ## 0.36.4 -* **IMPROVEMENT** Added `borderSide` property in [BarChartRodData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/bar_chart.md#BarChartRodData) and [BarChartRodStackItem](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/bar_chart.md#BarChartRodStackItem) to draw strokes around each bar and rod stack items, #714. +* **IMPROVEMENT** Added `borderSide` property in [BarChartRodData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/bar_chart.md#BarChartRodData) and [BarChartRodStackItem](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/bar_chart.md#BarChartRodStackItem) to draw strokes around each bar and rod stack items, #714. * **IMPROVEMENT** Now all textStyles are nullable and theme-aware by default, #269. * **BREAKING** All `getTextStyles` callback now give you a `context` and `value` (previously it was only a `value`). * **BUGFIX** Fixed `colorStops` calculation which used in gradient colors, #732. ## 0.36.3 -* **IMPROVEMENT** Show proper error message when there is less than 3 [RadarEntry](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/radar_chart.md#radarentry) in [RadarChart](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/radar_chart.md), #694. -* **IMPROVEMENT** Added `borderSide` property in [PieChartSectionData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/pie_chart.md#piechartsectiondata) to draw strokes around each section, #606. +* **IMPROVEMENT** Show proper error message when there is less than 3 [RadarEntry](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/radar_chart.md#radarentry) in [RadarChart](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/radar_chart.md), #694. +* **IMPROVEMENT** Added `borderSide` property in [PieChartSectionData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/pie_chart.md#piechartsectiondata) to draw strokes around each section, #606. ## 0.36.2 * **IMPROVEMENT** Support `onMouseExit` event in all charts. -* **IMPROVEMENT** Add `rotateAngle` property in [LineTouchTooltipData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#linetouchtooltipdata), [BarTouchTooltipData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/bar_chart.md#bartouchtooltipdata), [ScatterTouchTooltipData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/scatter_chart.md#scattertouchtooltipdata), #260, #679. +* **IMPROVEMENT** Add `rotateAngle` property in [LineTouchTooltipData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#linetouchtooltipdata), [BarTouchTooltipData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/bar_chart.md#bartouchtooltipdata), [ScatterTouchTooltipData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/scatter_chart.md#scattertouchtooltipdata), #260, #679. * **BUGFIX** Fix PieChart section index problem, when there is a section with 0 value, #697. @@ -237,28 +237,28 @@ getTitlesWidget: (double value, TitleMeta meta) { * **IMPROVEMENT** Allow to set zero value on PieChartSectionData (we remove zero sections instead of crashing), #640. * **BUGFIX** Fix NPE crash in our renderers touchCallback, #651. * **BUGFIX** Fix line index problem in LineChart, #665. (It has appeared in `0.36.0`, we had to revert 2nd change of `0.36.0`) -* **BREAKING** Remove unused `lineIndex` property from (ShowingTooltipIndicators)[https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#showingtooltipindicators]. +* **BREAKING** Remove unused `lineIndex` property from (ShowingTooltipIndicators)[https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#showingtooltipindicators]. ## 0.36.0 * **BUGFIX** Fixed bug of lerping FlSpot.nullSpot, #487. * **BUGFIX** Fixed showing tooltip problem when animating chart, #647. * **BUGFIX** Fixed RadarChart drawing problem, #627. -* **IMPROVEMENT** Now [SideTitles](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/base_chart.md#SideTitles).`interval` is working correctly in bottomTitles in the BarChart, #648. -* **BREAKING** You should provide `spotsIndices` instead of `showingSpots` in [ShowingTooltipIndicators](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#showingtooltipindicators). +* **IMPROVEMENT** Now [SideTitles](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/base_chart.md#SideTitles).`interval` is working correctly in bottomTitles in the BarChart, #648. +* **BREAKING** You should provide `spotsIndices` instead of `showingSpots` in [ShowingTooltipIndicators](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#showingtooltipindicators). ## 0.35.0 -* **IMPROVEMENT** Added `children` property in the [LineTooltipItem](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#linetooltipitem), [BarTooltipItem](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/bar_chart.md#bartooltipitem) and [ScatterTooltipItem](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/scatter_chart.md#scattertooltipitem) which accepts a list of [TextSpan](https://api.flutter.dev/flutter/painting/TextSpan-class.html). It allows you to have more customized texts inside the tooltip. See [BarChartSample1](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/bar_chart.md#sample-1-source-code) and [ScatterSample2](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/scatter_chart.md#sample-2-source-code), #72, #294. -* **IMPROVEMENT** Added `getTouchLineStart` and `getTouchLineEnd` in [LineTouchData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#linetouchdata-read-about-touch-handling) to give more customizability over showing the touch lines. see [SampleLineChart9](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#sample-8-source-code). +* **IMPROVEMENT** Added `children` property in the [LineTooltipItem](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#linetooltipitem), [BarTooltipItem](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/bar_chart.md#bartooltipitem) and [ScatterTooltipItem](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/scatter_chart.md#scattertooltipitem) which accepts a list of [TextSpan](https://api.flutter.dev/flutter/painting/TextSpan-class.html). It allows you to have more customized texts inside the tooltip. See [BarChartSample1](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/bar_chart.md#sample-1-source-code) and [ScatterSample2](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/scatter_chart.md#sample-2-source-code), #72, #294. +* **IMPROVEMENT** Added `getTouchLineStart` and `getTouchLineEnd` in [LineTouchData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#linetouchdata-read-about-touch-handling) to give more customizability over showing the touch lines. see [SampleLineChart9](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#sample-8-source-code). * **IMPROVEMENT** Enabled `sectionsSpace` in PieChart for the web. -* **IMPROVEMENT** Added [Makefile](https://makefiletutorial.com) commands which makes it comfortable for verifying your code before push (It is related to contributors, red more about it in [CONTRIBUTING.md](https://github.com/imaNNeoFighT/fl_chart/blob/master/CONTRIBUTING.md)). +* **IMPROVEMENT** Added [Makefile](https://makefiletutorial.com) commands which makes it comfortable for verifying your code before push (It is related to contributors, red more about it in [CONTRIBUTING.md](https://github.com/imaNNeoFighT/fl_chart/blob/main/CONTRIBUTING.md)). * **IMPROVEMENT** Added `FlDotCrossPainter` which extends `FlDotPainter` to paint X marks on line chart spots. -* **IMPROVEMENT** Added `textDirection` property in [LineTooltipItem](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#linetooltipitem), [BarTooltipItem](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/bar_chart.md#bartooltipitem) and [ScatterTooltipItem](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/scatter_chart.md#scattertooltipitem). It allows you to support rtl languages in tooltips. -* **IMPROVEMENT** Added `textDirection` property in [SideTitles](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/base_chart.md#sidetitles) class, #531. It allows you to support rtl languages in side titles. -* **IMPROVEMENT** Added `textDirection` property in [AxisTitles](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/base_chart.md#AxisTitle) class. It allows you to support rtl languages in axis titles. +* **IMPROVEMENT** Added `textDirection` property in [LineTooltipItem](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#linetooltipitem), [BarTooltipItem](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/bar_chart.md#bartooltipitem) and [ScatterTooltipItem](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/scatter_chart.md#scattertooltipitem). It allows you to support rtl languages in tooltips. +* **IMPROVEMENT** Added `textDirection` property in [SideTitles](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/base_chart.md#sidetitles) class, #531. It allows you to support rtl languages in side titles. +* **IMPROVEMENT** Added `textDirection` property in [AxisTitles](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/base_chart.md#AxisTitle) class. It allows you to support rtl languages in axis titles. * **BUGFIX** Fixed some bugs on drawing PieChart (for example when we have only one section), #582, * **BREAKING** Border of pieChart now is hide by default (you can show it using `borderData: FlBorderData(show: true)`. -* **BREAKING** You cannot set `0` value on [PieChartSectionData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/pie_chart.md#piechartsectiondata).value anymore, instead remove it from list. -* **BREAKING** Removed `fullHeightTouchLine` property from [LineTouchData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#linetouchdata-read-about-touch-handling). Now you can have a full line with following snippet: +* **BREAKING** You cannot set `0` value on [PieChartSectionData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/pie_chart.md#piechartsectiondata).value anymore, instead remove it from list. +* **BREAKING** Removed `fullHeightTouchLine` property from [LineTouchData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#linetouchdata-read-about-touch-handling). Now you can have a full line with following snippet: ```dart LineTouchData( ... @@ -270,19 +270,19 @@ LineTouchData( ## 0.30.0 * [IMPROVEMENT] We now use [RenderObject](https://api.flutter.dev/flutter/rendering/RenderObject-class.html) as our default drawing system. It brings a lot of stability. Such as size handling, hitTest handling (touches), and It makes us possible to paint Widgets inside our chart (It might fix #383, #556, #582, #584, #591). -* [IMPROVEMENT] Added [Radar Chart Documentations](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/radar_chart.md) -* [IMPROVEMENT] Added `textAlign` property in the [BarTooltipItem](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/bar_chart.md#bartooltipitem), [LineTooltipItem](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#linetooltipitem), and [ScatterTooltipItem](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/scatter_chart.md#scattertooltipitem), default is `TextAlign.center`. -* [IMPROVEMENT] Added `direction` property in the [BarTouchTooltipData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/bar_chart.md#bartouchtooltipdata), and [LineTouchTooltipData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#linetouchtooltipdata) to specify the position of the tooltip (can be `auto`, `top`, `bottom`), default is `auto`. +* [IMPROVEMENT] Added [Radar Chart Documentations](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/radar_chart.md) +* [IMPROVEMENT] Added `textAlign` property in the [BarTooltipItem](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/bar_chart.md#bartooltipitem), [LineTooltipItem](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#linetooltipitem), and [ScatterTooltipItem](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/scatter_chart.md#scattertooltipitem), default is `TextAlign.center`. +* [IMPROVEMENT] Added `direction` property in the [BarTouchTooltipData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/bar_chart.md#bartouchtooltipdata), and [LineTouchTooltipData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#linetouchtooltipdata) to specify the position of the tooltip (can be `auto`, `top`, `bottom`), default is `auto`. * [IMPROVEMENT] Updated touch flow, we now use [hitTest](https://api.flutter.dev/flutter/rendering/RenderProxyBoxWithHitTestBehavior/hitTest.html) for handling touch and interactions. -* [IMPROVEMENT] Added 'clickHappened' property in all of our TouchResponses (such as [LineTouchResponse](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#LineTouchResponse), [BarTouchResponse](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/bar_chart.md#bartouchresponse), ...), #210. +* [IMPROVEMENT] Added 'clickHappened' property in all of our TouchResponses (such as [LineTouchResponse](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#LineTouchResponse), [BarTouchResponse](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/bar_chart.md#bartouchresponse), ...), #210. * [IMPROVEMENT] Added `swapAnimationCurve` property to all chart widgets which handles the built-in animation [Curve](https://api.flutter.dev/flutter/animation/Curves-class.html), #436. -* [BREAKING] Some properties in [ScatterTouchResponse](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/scatter_chart.md#scattertouchresponse), and [PieTouchResponse](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/pie_chart.md#pietouchresponse) moved to a wrapper class, you need to access them through that wrapper class. -* [BREAKING] Renamed `tooltipBottomMargin` to `tooltipMargin` property in the [BarTouchTooltipData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/bar_chart.md#bartouchtooltipdata), and [LineTouchTooltipData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#linetouchtooltipdata) -* [Bugfix] Fixed `double.infinity` in [PieChartData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/pie_chart.md#piechartdata) .centerSpaceRadius, #584. +* [BREAKING] Some properties in [ScatterTouchResponse](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/scatter_chart.md#scattertouchresponse), and [PieTouchResponse](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/pie_chart.md#pietouchresponse) moved to a wrapper class, you need to access them through that wrapper class. +* [BREAKING] Renamed `tooltipBottomMargin` to `tooltipMargin` property in the [BarTouchTooltipData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/bar_chart.md#bartouchtooltipdata), and [LineTouchTooltipData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#linetouchtooltipdata) +* [Bugfix] Fixed `double.infinity` in [PieChartData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/pie_chart.md#piechartdata) .centerSpaceRadius, #584. ## 0.20.1 * [BREAKING] We now support flutter version 2.0 (null-safety), check out the [migration guide](https://dart.dev/null-safety/migration-guide). -* [NEW_CHART] We have added [RadarChart](https://github.com/payam-zahedi/fl_chart/blob/master/repo_files/documentations/radar_chart.md). Thanks to [Payam Zahedi](https://github.com/payam-zahedi)! +* [NEW_CHART] We have added [RadarChart](https://github.com/payam-zahedi/fl_chart/blob/main/repo_files/documentations/radar_chart.md). Thanks to [Payam Zahedi](https://github.com/payam-zahedi)! ## 0.20.0-nullsafety1 * [BREAKING] **We have migrated our project to null-safety. You may need to change your source-code to compile**. check [migration guide](https://dart.dev/null-safety/migration-guide). @@ -303,12 +303,12 @@ LineTouchData( * [Bugfix] Fixed PieChart badges bug with re-implementing the solution, #507 * [Bugfix] Fix the setState issue using PieChart in the ListView, #467 * [Bugfix] Fixed formatNumber bug for negative numbers, #486. -* [Improvement] Added applyCutOffY property in [BarAreaSpotsLine](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#barareaspotsline) to inherit cutOffY property of its parent, #478. +* [Improvement] Added applyCutOffY property in [BarAreaSpotsLine](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#barareaspotsline) to inherit cutOffY property of its parent, #478. ## 0.12.0 -* [Improvement] [BREAKING] Replaced `color` property with `colors` in [BarChartRodData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/bar_chart.md#barchartroddata), and [BackgroundBarChartRodData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/bar_chart.md#backgroundbarchartroddata) to support gradient in BarChart, instead of solid color, #166. Check [BarChartSample3](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/bar_chart.md#sample-3-source-code) +* [Improvement] [BREAKING] Replaced `color` property with `colors` in [BarChartRodData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/bar_chart.md#barchartroddata), and [BackgroundBarChartRodData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/bar_chart.md#backgroundbarchartroddata) to support gradient in BarChart, instead of solid color, #166. Check [BarChartSample3](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/bar_chart.md#sample-3-source-code) * [Improvement] Improved gradient stops calculating algorithm. -* [Improvement] [BREAKING] Changed SideTitle's `textStyle` property to `getTextStyles` getter (it gives you the axis value, and you must return a TextStyle based on it), It helps you to have a different style for specific text, #439. Check it here [LineChartSample3](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#sample-3-source-code) +* [Improvement] [BREAKING] Changed SideTitle's `textStyle` property to `getTextStyles` getter (it gives you the axis value, and you must return a TextStyle based on it), It helps you to have a different style for specific text, #439. Check it here [LineChartSample3](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#sample-3-source-code) * [Improvement] Added `badgeWidget`, and `badgePositionPercentageOffset` in each [PieChartSectionData](https://github.com/imaNNeoFighT/fl_chart/blob/dev/repo_files/documentations/pie_chart.md#piechartsectiondata) to provide a widget to show in the chart, see [this sample](https://github.com/imaNNeoFighT/fl_chart/blob/dev/repo_files/documentations/pie_chart.md#sample-3-source-code), #443. Providing a widget is an important step in our library, if it works perfectly, we will aplly this solution on other parts. Then I appreciate any feedback. * [Bugfix] Fixed aboveBarArea flickers after setState, #440. @@ -318,24 +318,24 @@ LineTouchData( ## 0.11.0 * [Bugfix] Prevent show ScatterSpot if show is false, #385. -* [Improvement] Set default centerSpaceRadius to double.infinity in [PieChartData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/pie_chart.md#piechartdata), #384. -* [Improvement] Allowed to have topTitles in the [BarChart](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/bar_chart.md), see [BarChartSample5](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/bar_chart.md#sample-5-source-code), #394. -* [Improvement] Added `touchedStackItem` and `touchedStackItemIndex` properties in the [BarTouchedSpot](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/bar_chart.md#bartouchedspot) to determine in which [BarChartRodStackItem](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/bar_chart.md#barchartrodstackitem) click happened, #393. -* [Improvement] [BREAKING] Renamed `rodStackItem` to `rodStackItems` in [BarChartRodData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/bar_chart.md#barchartroddata). +* [Improvement] Set default centerSpaceRadius to double.infinity in [PieChartData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/pie_chart.md#piechartdata), #384. +* [Improvement] Allowed to have topTitles in the [BarChart](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/bar_chart.md), see [BarChartSample5](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/bar_chart.md#sample-5-source-code), #394. +* [Improvement] Added `touchedStackItem` and `touchedStackItemIndex` properties in the [BarTouchedSpot](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/bar_chart.md#bartouchedspot) to determine in which [BarChartRodStackItem](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/bar_chart.md#barchartrodstackitem) click happened, #393. +* [Improvement] [BREAKING] Renamed `rodStackItem` to `rodStackItems` in [BarChartRodData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/bar_chart.md#barchartroddata). ## 0.10.1 * [Improvement] Show barGroups `x` value instead of `index` in bottom titles, #342. -* [Improvement] [BREAKING] Use `double.infinity` instead of `double.nan` for letting `enterSpaceRadius` be as large as possible in the (PieChartData)[https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/pie_chart.md#piechartdata], #377. +* [Improvement] [BREAKING] Use `double.infinity` instead of `double.nan` for letting `enterSpaceRadius` be as large as possible in the (PieChartData)[https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/pie_chart.md#piechartdata], #377. * [Bugfix] Fixed PieChart bug with 1 section, #368. ## 0.10.0 * [IMPORTANT] **BLACK LIVES MATTER** -* [Improvement] Auto calculate interval in [SideTitles](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/base_chart.md#sidetitles) and [FlGridData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/base_chart.md#flgriddata), instead of hard coding 1, to prevent some performance issues like #101, #322. see [BarChartSample4](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/bar_chart.md#sample-4-source-code). +* [Improvement] Auto calculate interval in [SideTitles](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/base_chart.md#sidetitles) and [FlGridData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/base_chart.md#flgriddata), instead of hard coding 1, to prevent some performance issues like #101, #322. see [BarChartSample4](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/bar_chart.md#sample-4-source-code). * [Bugfix] drawing dot on null spots * [Bugfix] Fixed LineChart have multiple NULL spot bug. -* [Feature] Added `checkToShowTitle` property to the [SideTitles](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/base_chart.md#sidetitles), for checking show or not show titles in the provided value, #331. see [LineChartSample8](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#sample-8-source-code). -* [Feature] Added compatibily to have customized shapes for [FlDotData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#fldotdata), just override `FlDotData.etDotPainter` and pass your own painter or use built-in ones, see this [sample](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#sample-3-source-code). -* [Improvement] [BREAKING] Replaced `clipToBorder` with `clipData` in [LineChartData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#linechartdata) to support clipping 4 sides of a chart separately. +* [Feature] Added `checkToShowTitle` property to the [SideTitles](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/base_chart.md#sidetitles), for checking show or not show titles in the provided value, #331. see [LineChartSample8](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#sample-8-source-code). +* [Feature] Added compatibily to have customized shapes for [FlDotData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#fldotdata), just override `FlDotData.etDotPainter` and pass your own painter or use built-in ones, see this [sample](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#sample-3-source-code). +* [Improvement] [BREAKING] Replaced `clipToBorder` with `clipData` in [LineChartData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#linechartdata) to support clipping 4 sides of a chart separately. ## 0.9.4 * [Bugfix] Fixed showing PieChart on web (we've ignored `groupSpace` on web, because some BlendModes are [not working](https://github.com/flutter/flutter/issues/56071) yet) @@ -345,20 +345,20 @@ LineTouchData( * [Improvement] Shadows default off, #316. ## 0.9.2 -* [Feature] Added `shadow` property in [LineChartData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#linechartdata) to have shadow effect in our [LineChart](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md), take a look at [LineChartSampl5](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#sample-5-source-code), #304. -* [Feature] Added `isStepLineChart`, and `lineChartStepData` in the [LineChartData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#linechartdata) to support Step Line Chart, take a look at [lineChartSample3](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#sample-3-source-code), #303. -* [Improvement] Added `barData` parameter to checkToShowDot Function in the [FlDotData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#fldotdata). +* [Feature] Added `shadow` property in [LineChartData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#linechartdata) to have shadow effect in our [LineChart](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md), take a look at [LineChartSampl5](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#sample-5-source-code), #304. +* [Feature] Added `isStepLineChart`, and `lineChartStepData` in the [LineChartData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#linechartdata) to support Step Line Chart, take a look at [lineChartSample3](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#sample-3-source-code), #303. +* [Improvement] Added `barData` parameter to checkToShowDot Function in the [FlDotData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#fldotdata). ## 0.9.0 -* Added `strokeWidth`, `getStrokeColor`, `getDotColor` in the [FlDotData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#fldotdata), also removed `dotColor` from it (you should use `getDotColor` instead, it gives you more customizability), now we have more customizability on [FlDotData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#fldotdata), check [line_chart_sample3](https://github.com/imaNNeoFighT/fl_chart/blob/dev/repo_files/documentations/line_chart.md#sample-3-source-code), and [line_chart_sample5](https://github.com/imaNNeoFighT/fl_chart/blob/dev/repo_files/documentations/line_chart.md#sample-5-source-code), #233, #99, #274. +* Added `strokeWidth`, `getStrokeColor`, `getDotColor` in the [FlDotData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#fldotdata), also removed `dotColor` from it (you should use `getDotColor` instead, it gives you more customizability), now we have more customizability on [FlDotData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#fldotdata), check [line_chart_sample3](https://github.com/imaNNeoFighT/fl_chart/blob/dev/repo_files/documentations/line_chart.md#sample-3-source-code), and [line_chart_sample5](https://github.com/imaNNeoFighT/fl_chart/blob/dev/repo_files/documentations/line_chart.md#sample-5-source-code), #233, #99, #274. * Added `equatable` library to solve some equation issues. * Implemented negative values feature for the BarChart, #106, #103. * add Equatable for all models, it leads to have a better performance. -* Fixed a minor touch bug in the [BarChart](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/bar_chart.md). +* Fixed a minor touch bug in the [BarChart](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/bar_chart.md). * Fixed ScatterChart built-in touch behaviour. * Fixed drawing grid lines bug, #280. -* Implemented [FlDotData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#fldotdata).`getDotColor` in a proper way, it returns a color based on the [LineChartBarData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#linechartbardata) color, #274, #282. -* Updated [LineChartData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#linechartdata).`showingTooltipIndicators` field type to list of [ShowingTooltipIndicators](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#showingtoltipindicators) to have a clean naming. +* Implemented [FlDotData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#fldotdata).`getDotColor` in a proper way, it returns a color based on the [LineChartBarData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#linechartbardata) color, #274, #282. +* Updated [LineChartData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#linechartdata).`showingTooltipIndicators` field type to list of [ShowingTooltipIndicators](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#showingtoltipindicators) to have a clean naming. ## 0.8.7 * Added `show` property in the `VerticalLineLabel` and set default to `false`, #256. @@ -370,7 +370,7 @@ LineTouchData( * Implemented multi-section lines in LineChart, check this issue (#26) and this merge request (#252) ## 0.8.5 -* Added `fitInsideHorizontally` and `fitInsideVertically` in [ScatterTouchTooltipData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/scatter_chart.md#scattertouchtooltipdata) +* Added `fitInsideHorizontally` and `fitInsideVertically` in [ScatterTouchTooltipData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/scatter_chart.md#scattertouchtooltipdata) * Fixed `clipToBorder` functionality basdd on the border sides. ## 0.8.4-test1 @@ -378,9 +378,9 @@ LineTouchData( ## 0.8.4 * Added `preventCurveOvershootingThreshold` in `LineChartBarData` for applying prevent overshooting algorithm, #193. -* Fixed `clipToBorder` bug in the [LineChartData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#linechartdata), #228, #214. +* Fixed `clipToBorder` bug in the [LineChartData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#linechartdata), #228, #214. * Removed unused `enableNormalTouch` property from all charts TouchData. -* Implemented ImageAnnotations feature (added `image`, and `sizedPicture` in the [VerticalLine](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#verticalline), and the [HorizontalLine](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#horizontalline), check [this sample](https://github.com/imaNNeoFighT/fl_chart/blob/dev/repo_files/documentations/line_chart.md#sample-8-source-code) for more information. +* Implemented ImageAnnotations feature (added `image`, and `sizedPicture` in the [VerticalLine](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#verticalline), and the [HorizontalLine](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#horizontalline), check [this sample](https://github.com/imaNNeoFighT/fl_chart/blob/dev/repo_files/documentations/line_chart.md#sample-8-source-code) for more information. * Enable 'fitInsideTheChart' to support vertical tooltip overflow as well, #225. * BREAKING CHANGE-> changed `fitInsideTheChart` to `fitInsideHorizontally` and added `fitInsideVertically` to support both sides, #225. @@ -389,8 +389,8 @@ LineTouchData( * added `fitInsideTheChart` property inside `BarTouchTooltipData` and `LineTouchTooltipData` to force tooltip draw inside the chart (shift it to the chart), fixed #159. ## 0.8.2 -* added `fullHeightTouchLine` in [LineTouchData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#linetouchdata-read-about-touch-handling) to show a full height touch line, see sample in merge request #208. -* added `label` ([HorizontalLineLabel](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#horizontallinelabel)) inside [HorizontalLine](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#horizontalline) and [VerticalLine](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#verticalline) to show a lable text on the lines. +* added `fullHeightTouchLine` in [LineTouchData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#linetouchdata-read-about-touch-handling) to show a full height touch line, see sample in merge request #208. +* added `label` ([HorizontalLineLabel](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#horizontallinelabel)) inside [HorizontalLine](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#horizontalline) and [VerticalLine](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#verticalline) to show a lable text on the lines. ## 0.8.1 * yaaay, added some basic unit tests @@ -400,14 +400,14 @@ LineTouchData( * added possibility to set `double.nan` in `centerSpaceRadius` for the PieChart to let it to be calculated according to the view size, fixed #179. ## 0.8.0 -* added functionallity to have dashed lines, in everywhere we draw line, there should be a property called `dashArray` (for example check [LineChartBarData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#linechartbardata), and see [LineChartSample8](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#sample-8-source-code)) +* added functionallity to have dashed lines, in everywhere we draw line, there should be a property called `dashArray` (for example check [LineChartBarData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#linechartbardata), and see [LineChartSample8](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#sample-8-source-code)) * BREAKING CHANGE: -* swapped [HorizontalExtraLines](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#horizontalline), and [VerticalExtraLines](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#verticalline) functionalities (now it has a well definition) -* and also removed `showVerticalLines`, and `showHorizontalLines` from [ExtraLinesData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#ExtraLinesData), if the `horizontalLines`, or `verticalLines` is empty we don't show them +* swapped [HorizontalExtraLines](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#horizontalline), and [VerticalExtraLines](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#verticalline) functionalities (now it has a well definition) +* and also removed `showVerticalLines`, and `showHorizontalLines` from [ExtraLinesData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#ExtraLinesData), if the `horizontalLines`, or `verticalLines` is empty we don't show them ## 0.7.0 -* added rangeAnnotations in the [LineChartData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#linechartdata) to show range annotations, #163. -* removed `isRound` fiend in the [BarChartRodData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/bar_chart.md#barchartroddata) to add more customizability, and fixed #147 bug. +* added rangeAnnotations in the [LineChartData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#linechartdata) to show range annotations, #163. +* removed `isRound` fiend in the [BarChartRodData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/bar_chart.md#barchartroddata) to add more customizability, and fixed #147 bug. * fixed sever bug of click on pie chart, #146. ## 0.6.3 @@ -415,16 +415,16 @@ LineTouchData( * Respect text scale factor when drawing text. ## 0.6.2 -* added `axisTitleData` field to all axis base charts (Line, Bar, Scatter) to show the axes titles, see [LineChartSample4](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#sample-4-source-code) and [LineChartSample5](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#sample-5-source-code). +* added `axisTitleData` field to all axis base charts (Line, Bar, Scatter) to show the axes titles, see [LineChartSample4](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#sample-4-source-code) and [LineChartSample5](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#sample-5-source-code). ## 0.6.1 -* added `betweenBarsData` property in [LineChartData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#linechartdata), fixed #93. +* added `betweenBarsData` property in [LineChartData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#linechartdata), fixed #93. ## 0.6.0 * fixed calculating size for handling touches bug, #126 -* added `rotateAngle` property to rotate the [SideTitles](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/base_chart.md#sidetitles), fixed issue [#75](https://github.com/imaNNeoFighT/fl_chart/issues/75) , see in this [sample](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/bar_chart.md#sample-5-source-code) +* added `rotateAngle` property to rotate the [SideTitles](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/base_chart.md#sidetitles), fixed issue [#75](https://github.com/imaNNeoFighT/fl_chart/issues/75) , see in this [sample](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/bar_chart.md#sample-5-source-code) * BREAKING CHANGES: -* some property names updated in the [FlGridData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/base_chart.md#flgriddata): `drawHorizontalGrid` -> `drawHorizontalLine`, `getDrawingHorizontalGridLine` -> `getDrawingHorizontalLine`, `checkToShowHorizontalGrid` -> `checkToShowHorizontalLine` (and same for vertical properties), fixed issue [#92](https://github.com/imaNNeoFighT/fl_chart/issues/92) +* some property names updated in the [FlGridData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/base_chart.md#flgriddata): `drawHorizontalGrid` -> `drawHorizontalLine`, `getDrawingHorizontalGridLine` -> `getDrawingHorizontalLine`, `checkToShowHorizontalGrid` -> `checkToShowHorizontalLine` (and same for vertical properties), fixed issue [#92](https://github.com/imaNNeoFighT/fl_chart/issues/92) ## 0.5.2 * drawing titles using targetData instead of animating data, fixed issue #130. @@ -438,11 +438,11 @@ LineTouchData( ## 0.4.3 * fixed a size bug, #100. -* direction support for gradient on the LineChart (added `gradientFrom` and `gradientTo` in the [LineChartBarData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#linechartbardata)). +* direction support for gradient on the LineChart (added `gradientFrom` and `gradientTo` in the [LineChartBarData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#linechartbardata)). ## 0.4.2 -* implemented stacked bar chart, check the [samples](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/bar_chart.md#sample-5-source-code) -* added `groupSpace in [BarChartData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/bar_chart.md#barchartdata) to apply space between bar groups +* implemented stacked bar chart, check the [samples](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/bar_chart.md#sample-5-source-code) +* added `groupSpace in [BarChartData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/bar_chart.md#barchartdata) to apply space between bar groups * fixed drawing left and right titles of the BarChart * fixed showing gridLines bug (the grid line of exact max value of each direction doesn't show) @@ -451,39 +451,39 @@ LineTouchData( ## 0.4.0 * BIG BREAKING CHANGES -* There is no `FlChart` class anymore, instead use [LineChart](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md), [BarChart](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/bar_chart.md), and [PieChart](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/pie_chart.md) directly as a widget. -* Touch handling system is improved and for sure we have some changes, there is no `touchedResultSink` anymore and use `touchCallback` function which is added to each TouchData like ([LineTouchData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#linetouchdata-read-about-touch-handling)), [read more](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/handle_touches.md). +* There is no `FlChart` class anymore, instead use [LineChart](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md), [BarChart](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/bar_chart.md), and [PieChart](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/pie_chart.md) directly as a widget. +* Touch handling system is improved and for sure we have some changes, there is no `touchedResultSink` anymore and use `touchCallback` function which is added to each TouchData like ([LineTouchData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#linetouchdata-read-about-touch-handling)), [read more](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/handle_touches.md). * `TouchTooltipData` class inside `LineTouchData` and `BarTouchData` renamed to `LineTouchTooltipData` and `BarTouchTooltipData` respectively, and also `TooltipItem` class renamed to `LineTooltipItem` and `BarTooltipItem`. * `spots` inside `LineTouchResponse` renamed to `lineBarSpots` and type changed from `LineTouchedSpot` to `LineBarSpot`. * `FlTouchNormapInput` renamed to `FlTouchNormalInput` (fixed typo) -* added `showingTooltipIndicators` in [LineChartData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#linechartdata) to show manually tooltips in `LineChart`. -* added `showingIndicators` in [LineChartBarData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#linechartbardata) to show manually indicators in `LineChart`. -* added `showingTooltipIndicators` in [BarChartGroupData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/bar_chart.md#barchartgroupdata) to show manually tooltips in `BarChart`. +* added `showingTooltipIndicators` in [LineChartData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#linechartdata) to show manually tooltips in `LineChart`. +* added `showingIndicators` in [LineChartBarData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#linechartbardata) to show manually indicators in `LineChart`. +* added `showingTooltipIndicators` in [BarChartGroupData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/bar_chart.md#barchartgroupdata) to show manually tooltips in `BarChart`. ## 0.3.4 * BREAKING CHANGES -* swapped horizontal and vertical semantics in [FlGridData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/base_chart.md#FlGridData), fixed this [issue](https://github.com/imaNNeoFighT/fl_chart/issues/85). +* swapped horizontal and vertical semantics in [FlGridData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/base_chart.md#FlGridData), fixed this [issue](https://github.com/imaNNeoFighT/fl_chart/issues/85). ## 0.3.3 * BREAKING CHANGES * added support for drawing below and above areas separately in LineChart * added cutOffY feature in LineChart, see this [issue](https://github.com/imaNNeoFighT/fl_chart/issues/62) -* added `aboveBarData` in [LineChartBarData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#linechartbardata) -* `BelowBarData` class renamed to [BarAreaData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#barareadata) to reuse for both above and below areas -* `belowSpotsLine` renamed to `spotsLine` in [BarAreaData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#barareadata) -* `cutOffY` and `applyCutOffY` fields are added in [BarAreaData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#barareadata) to handle cutting of drawing below or above area -* `BelowSpotsLine` renamed to [BarAreaSpotsLine](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#barareaspotsline), and inside it `checkToShowSpotBelowLine` renamed to `checkToShowSpotLine` +* added `aboveBarData` in [LineChartBarData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#linechartbardata) +* `BelowBarData` class renamed to [BarAreaData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#barareadata) to reuse for both above and below areas +* `belowSpotsLine` renamed to `spotsLine` in [BarAreaData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#barareadata) +* `cutOffY` and `applyCutOffY` fields are added in [BarAreaData](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#barareadata) to handle cutting of drawing below or above area +* `BelowSpotsLine` renamed to [BarAreaSpotsLine](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#barareaspotsline), and inside it `checkToShowSpotBelowLine` renamed to `checkToShowSpotLine` ## 0.3.2 * provided default size (square with 30% smaller than screen) for the FLChart, fixed this [issue](https://github.com/imaNNeoFighT/fl_chart/issues/74). ## 0.3.1 -* added `interval` field in [SideTitles](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/base_chart.md#sidetitles), fixed this [issue](https://github.com/imaNNeoFighT/fl_chart/issues/67) +* added `interval` field in [SideTitles](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/base_chart.md#sidetitles), fixed this [issue](https://github.com/imaNNeoFighT/fl_chart/issues/67) ## 0.3.0 -* 💥 Added Animations 💥, [read about it](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/handle_animations.md). +* 💥 Added Animations 💥, [read about it](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/handle_animations.md). ## 0.2.2 * fixed a typo on CHANGELOG @@ -507,7 +507,7 @@ LineTouchData( * bugfix -> fixed draw bug on BarChart when y value is very low in high scale y values (#43). ## 0.1.3 -* added `SideTitles` class to hold titles representation data, and used in `FlTitlesData` to show left, top, right, bottom titles, instead of legacy direct parameters, and implemented a reversed chart [sample](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#sample-6-source-code) using this update. +* added `SideTitles` class to hold titles representation data, and used in `FlTitlesData` to show left, top, right, bottom titles, instead of legacy direct parameters, and implemented a reversed chart [sample](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/line_chart.md#sample-6-source-code) using this update. ## 0.1.2 * added `preventCurveOverShooting` on BarData, check this [issue](https://github.com/imaNNeoFighT/fl_chart/issues/25) @@ -516,7 +516,7 @@ LineTouchData( * nothing important ## 0.1.0 -* added **Touch Interactivity**, read more about it [here](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/handle_touches.md) +* added **Touch Interactivity**, read more about it [here](https://github.com/imaNNeoFighT/fl_chart/blob/main/repo_files/documentations/handle_touches.md) ## 0.0.8 * added backgroundColor to axis based charts (LineChart, BarChart) to draw a solid background color behind the chart diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2b3c529f6..1c5e7991d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -42,7 +42,7 @@ CanvasWrapper class holds a canvas and all draw functions proxies through it. You should use it for drawing on the canvas, Instead of direct accessing to canvas. It makes draw functions testable. - + (made with [draw.io](https://drive.google.com/file/d/1bj-2TqTRUh80dRKJk10drPNeA3fp3EA8/view)) @@ -78,7 +78,7 @@ We should write unit-test for our written code. If you are not familiar with uni [Mockito](https://pub.dev/packages/mockito) is the library that we use to mock our classes, please read more about it from their docs [here](https://github.com/dart-lang/mockito#lets-create-mocks). -Our code coverage is calculated by [Codecov](https://app.codecov.io/gh/imaNNeo/fl_chart) (Our coverage is [![codecov](https://codecov.io/gh/imaNNeo/fl_chart/branch/master/graph/badge.svg?token=XBhsIZBbZG)](https://codecov.io/gh/imaNNeo/fl_chart) +Our code coverage is calculated by [Codecov](https://app.codecov.io/gh/imaNNeo/fl_chart) (Our coverage is [![codecov](https://codecov.io/gh/imaNNeo/fl_chart/branch/main/graph/badge.svg?token=XBhsIZBbZG)](https://codecov.io/gh/imaNNeo/fl_chart) at the moment) When you push something in your PR (after approving your PR by one of us), you see a coverage report which describes how much coverage is increased or decreased by your code (You can check the details to see which part of your code made the change). diff --git a/README.md b/README.md index a19ccbe3d..3966902ca 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,10 @@ ✅ Do you want to **motivate me to work more on fl_chart?** You can **[donate me](https://github.com/imaNNeo/fl_chart#donation)** ;) -![FL Chart Logo](https://github.com/imaNNeo/fl_chart/raw/master/repo_files/images/landing_logo.jpg) +![FL Chart Logo](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/landing_logo.jpg) [![pub package](https://img.shields.io/pub/v/fl_chart.svg)](https://pub.dartlang.org/packages/fl_chart) -[![codecov](https://codecov.io/gh/imaNNeo/fl_chart/branch/master/graph/badge.svg?token=XBhsIZBbZG)](https://codecov.io/gh/imaNNeo/fl_chart) +[![codecov](https://codecov.io/gh/imaNNeo/fl_chart/branch/main/graph/badge.svg?token=XBhsIZBbZG)](https://codecov.io/gh/imaNNeo/fl_chart) Awesome Flutter GitHub Repo stars GitHub contributors @@ -19,13 +19,13 @@ |LineChart |BarChart |PieChart | |:------------:|:------------:|:-------------:| -| [![](https://github.com/imaNNeo/fl_chart/raw/master/repo_files/images/line_chart/line_chart_sample_1.gif)](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/line_chart.md#sample-1-source-code) [![](https://github.com/imaNNeo/fl_chart/raw/master/repo_files/images/line_chart/line_chart_sample_2.gif)](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/line_chart.md#sample-2-source-code) | [![](https://github.com/imaNNeo/fl_chart/raw/master/repo_files/images/bar_chart/bar_chart_sample_1.gif)](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/bar_chart.md#sample-1-source-code) [![](https://github.com/imaNNeo/fl_chart/raw/master/repo_files/images/bar_chart/bar_chart_sample_2.gif)](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/bar_chart.md#sample-2-source-code) | [![](https://github.com/imaNNeo/fl_chart/raw/master/repo_files/images/pie_chart/pie_chart_sample_1.gif)](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/pie_chart.md#sample-1-source-code) [![](https://github.com/imaNNeo/fl_chart/raw/master/repo_files/images/pie_chart/pie_chart_sample_2.gif)](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/pie_chart.md#sample-2-source-code) | -|[Read More](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/line_chart.md)|[Read More](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/bar_chart.md)|[Read More](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/pie_chart.md)| +| [![](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/line_chart/line_chart_sample_1.gif)](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/line_chart.md#sample-1-source-code) [![](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/line_chart/line_chart_sample_2.gif)](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/line_chart.md#sample-2-source-code) | [![](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/bar_chart/bar_chart_sample_1.gif)](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/bar_chart.md#sample-1-source-code) [![](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/bar_chart/bar_chart_sample_2.gif)](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/bar_chart.md#sample-2-source-code) | [![](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/pie_chart/pie_chart_sample_1.gif)](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/pie_chart.md#sample-1-source-code) [![](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/pie_chart/pie_chart_sample_2.gif)](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/pie_chart.md#sample-2-source-code) | +|[Read More](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/line_chart.md)|[Read More](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/bar_chart.md)|[Read More](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/pie_chart.md)| |ScatterChart |RadarChart| Coming Soon| |:------------:|:------------:|:-------------:| -| [![](https://github.com/imaNNeo/fl_chart/raw/master/repo_files/images/scatter_chart/scatter_chart_sample_1.gif)](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/scatter_chart.md#sample-1-source-code) [![](https://github.com/imaNNeo/fl_chart/raw/master/repo_files/images/scatter_chart/scatter_chart_sample_2.gif)](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/scatter_chart.md#sample-2-source-code) | ![](https://github.com/imaNNeo/fl_chart/raw/master/repo_files/images/radar_chart/radar_chart_sample_1.jpg) ![](https://github.com/imaNNeo/fl_chart/raw/master/repo_files/images/blank.jpg)|![](https://github.com/imaNNeo/fl_chart/raw/master/repo_files/images/blank.jpg) ![](https://github.com/imaNNeo/fl_chart/raw/master/repo_files/images/blank.jpg)| -|[Read More](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/scatter_chart.md)|[Read More](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/radar_chart.md)|| +| [![](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/scatter_chart/scatter_chart_sample_1.gif)](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/scatter_chart.md#sample-1-source-code) [![](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/scatter_chart/scatter_chart_sample_2.gif)](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/scatter_chart.md#sample-2-source-code) | ![](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/radar_chart/radar_chart_sample_1.jpg) ![](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/blank.jpg)|![](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/blank.jpg) ![](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/blank.jpg)| +|[Read More](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/scatter_chart.md)|[Read More](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/radar_chart.md)|| Banner designed by [Soheil Saffar](https://www.linkedin.com/in/soheilsaffar), and samples inspired from @@ -42,14 +42,14 @@ Thank you all! First of all you need to add the `fl_chart` in your project. In order to do that, follow [this guide](https://pub.dev/packages/fl_chart/install). -Then you need to read the docs. Start from [here](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/index.md). +Then you need to read the docs. Start from [here](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/index.md). We suggest you to check samples source code. -##### - You can read about the animation handling [here](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/handle_animations.md) +##### - You can read about the animation handling [here](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/handle_animations.md) |Sample1 |Sample2 |Sample3 | |:------------:|:------------:|:-------------:| -| [![](https://github.com/imaNNeo/fl_chart/raw/master/repo_files/images/line_chart/line_chart_sample_1_anim.gif)](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/line_chart.md#sample-1-source-code) | [![](https://github.com/imaNNeo/fl_chart/raw/master/repo_files/images/line_chart/line_chart_sample_2_anim.gif)](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/line_chart.md#sample-2-source-code) | [![](https://github.com/imaNNeo/fl_chart/raw/master/repo_files/images/bar_chart/bar_chart_sample_1_anim.gif)](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/bar_chart.md#sample-1-source-code) | +| [![](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/line_chart/line_chart_sample_1_anim.gif)](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/line_chart.md#sample-1-source-code) | [![](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/line_chart/line_chart_sample_2_anim.gif)](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/line_chart.md#sample-2-source-code) | [![](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/bar_chart/bar_chart_sample_1_anim.gif)](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/bar_chart.md#sample-1-source-code) | ### Donation @@ -66,7 +66,7 @@ Don't forget that `open-source` makes no sense without contributors. No matter h There might be a lot of grammar issues in the docs. It's a big help to us to fix them if you are fluent in English. -Check out [CONTRIBUTING.md](https://github.com/imaNNeo/fl_chart/blob/master/CONTRIBUTING.md), which contains a guide for those who want to contribute to the FL Chart. +Check out [CONTRIBUTING.md](https://github.com/imaNNeo/fl_chart/blob/main/CONTRIBUTING.md), which contains a guide for those who want to contribute to the FL Chart. Reporting bugs and issues are contribution too, yes it is. diff --git a/example/lib/urls.dart b/example/lib/urls.dart index c1af6f547..89d8dd999 100644 --- a/example/lib/urls.dart +++ b/example/lib/urls.dart @@ -8,12 +8,12 @@ class Urls { static String getChartSourceCodeUrl(ChartType chartType, int sampleNumber) { final chartDir = chartType.name.toLowerCase(); - return 'https://github.com/imaNNeo/fl_chart/blob/master/example/lib/presentation/samples/$chartDir/${chartDir}_chart_sample$sampleNumber.dart'; + return 'https://github.com/imaNNeo/fl_chart/blob/main/example/lib/presentation/samples/$chartDir/${chartDir}_chart_sample$sampleNumber.dart'; } static String getChartDocumentationUrl(ChartType chartType) { final chartDir = chartType.name.toLowerCase(); - return 'https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/${chartDir}_chart.md'; + return 'https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/${chartDir}_chart.md'; } static String getVersionReleaseUrl(String version) => diff --git a/example/lib/util/device_info.dart b/example/lib/util/device_info.dart index 169aca0e9..1a714950d 100644 --- a/example/lib/util/device_info.dart +++ b/example/lib/util/device_info.dart @@ -4,7 +4,7 @@ import 'package:universal_platform/universal_platform.dart'; enum FormFactorType { monitor, smallPhone, largePhone, tablet } -// Copied from https://github.com/gskinnerTeam/flutter-folio/blob/master/lib/_utils/device_info.dart +// Copied from https://github.com/gskinnerTeam/flutter-folio/blob/main/lib/_utils/device_info.dart class DeviceOS { // Syntax sugar, proxy the UniversalPlatform methods so our views can reference a single class static bool isIOS = UniversalPlatform.isIOS; diff --git a/lib/src/chart/bar_chart/bar_chart_data.dart b/lib/src/chart/bar_chart/bar_chart_data.dart index c0207de66..fd2b24e40 100644 --- a/lib/src/chart/bar_chart/bar_chart_data.dart +++ b/lib/src/chart/bar_chart/bar_chart_data.dart @@ -581,7 +581,7 @@ class BackgroundBarChartRodData with EquatableMixin { /// Holds data to handle touch events, and touch responses in the [BarChart]. /// -/// There is a touch flow, explained [here](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/handle_touches.md) +/// There is a touch flow, explained [here](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/handle_touches.md) /// in a simple way, each chart's renderer captures the touch events, and passes the pointerEvent /// to the painter, and gets touched spot, and wraps it into a concrete [BarTouchResponse]. class BarTouchData extends FlTouchData with EquatableMixin { diff --git a/lib/src/chart/base/base_chart/base_chart_data.dart b/lib/src/chart/base/base_chart/base_chart_data.dart index ebb522a7b..5bcc39d84 100644 --- a/lib/src/chart/base/base_chart/base_chart_data.dart +++ b/lib/src/chart/base/base_chart/base_chart_data.dart @@ -80,7 +80,7 @@ class FlBorderData with EquatableMixin { /// Holds data to handle touch events, and touch responses in abstract way. /// -/// There is a touch flow, explained [here](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/handle_touches.md) +/// There is a touch flow, explained [here](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/handle_touches.md) /// in a simple way, each chart's renderer captures the touch events, and passes the pointerEvent /// to the painter, and gets touched spot, and wraps it into a concrete [BaseTouchResponse]. abstract class FlTouchData with EquatableMixin { diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index 13dfc817e..968785691 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -844,7 +844,7 @@ abstract class FlLineLabel with EquatableMixin { /// Holds data to handle touch events, and touch responses in the [LineChart]. /// -/// There is a touch flow, explained [here](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/handle_touches.md) +/// There is a touch flow, explained [here](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/handle_touches.md) /// in a simple way, each chart's renderer captures the touch events, and passes the pointerEvent /// to the painter, and gets touched spot, and wraps it into a concrete [LineTouchResponse]. class LineTouchData extends FlTouchData with EquatableMixin { diff --git a/lib/src/chart/pie_chart/pie_chart_data.dart b/lib/src/chart/pie_chart/pie_chart_data.dart index 7de534b0c..2d4fd1cae 100644 --- a/lib/src/chart/pie_chart/pie_chart_data.dart +++ b/lib/src/chart/pie_chart/pie_chart_data.dart @@ -274,7 +274,7 @@ class PieChartSectionData { /// Holds data to handle touch events, and touch responses in the [PieChart]. /// -/// There is a touch flow, explained [here](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/handle_touches.md) +/// There is a touch flow, explained [here](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/handle_touches.md) /// in a simple way, each chart's renderer captures the touch events, and passes the pointerEvent /// to the painter, and gets touched spot, and wraps it into a concrete [PieTouchResponse]. class PieTouchData extends FlTouchData with EquatableMixin { diff --git a/lib/src/chart/radar_chart/radar_chart_data.dart b/lib/src/chart/radar_chart/radar_chart_data.dart index d737b9349..02664dd7b 100644 --- a/lib/src/chart/radar_chart/radar_chart_data.dart +++ b/lib/src/chart/radar_chart/radar_chart_data.dart @@ -375,7 +375,7 @@ class RadarEntry with EquatableMixin { /// Holds data to handle touch events, and touch responses in the [RadarChart]. /// -/// There is a touch flow, explained [here](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/handle_touches.md) +/// There is a touch flow, explained [here](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/handle_touches.md) /// in a simple way, each chart's renderer captures the touch events, and passes the pointerEvent /// to the painter, and gets touched spot, and wraps it into a concrete [RadarTouchResponse]. class RadarTouchData extends FlTouchData diff --git a/lib/src/chart/scatter_chart/scatter_chart_data.dart b/lib/src/chart/scatter_chart/scatter_chart_data.dart index b32f26d37..5bb9c9d81 100644 --- a/lib/src/chart/scatter_chart/scatter_chart_data.dart +++ b/lib/src/chart/scatter_chart/scatter_chart_data.dart @@ -248,7 +248,7 @@ class ScatterSpot extends FlSpot with EquatableMixin { /// Holds data to handle touch events, and touch responses in the [ScatterChart]. /// -/// There is a touch flow, explained [here](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/handle_touches.md) +/// There is a touch flow, explained [here](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/handle_touches.md) /// in a simple way, each chart's renderer captures the touch events, and passes the pointerEvent /// to the painter, and gets touched spot, and wraps it into a concrete [ScatterTouchResponse]. class ScatterTouchData extends FlTouchData diff --git a/repo_files/documentations/bar_chart.md b/repo_files/documentations/bar_chart.md index 178c2f212..1c0751ed7 100644 --- a/repo_files/documentations/bar_chart.md +++ b/repo_files/documentations/bar_chart.md @@ -1,6 +1,6 @@ # BarChart - + ### How to use ```dart @@ -84,12 +84,12 @@ enum values {`start`, `end`, `center`, `spaceEvenly`, `spaceAround`, `spaceBetwe |PropName|Description|default value| |:-------|:----------|:------------| |enabled|determines to enable or disable touch behaviors|true| -|mouseCursorResolver|you can change the mouse cursor based on the provided [FlTouchEvent](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#fltouchevent) and [BarTouchResponse](#BarTouchResponse)|MouseCursor.defer| +|mouseCursorResolver|you can change the mouse cursor based on the provided [FlTouchEvent](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#fltouchevent) and [BarTouchResponse](#BarTouchResponse)|MouseCursor.defer| |touchTooltipData|a [BarTouchTooltipData](#BarTouchTooltipData), that determines how show the tooltip on top of touched spots (appearance of the showing tooltip bubble)|BarTouchTooltipData()| |touchExtraThreshold|an [EdgeInsets](https://api.flutter.dev/flutter/painting/EdgeInsets-class.html) class to hold a bounding threshold of touch accuracy|EdgeInsets.all(4)| |allowTouchBarBackDraw| if sets true, touch works on backdraw bar line| false | |handleBuiltInTouches| set this true if you want the built in touch handling (show a tooltip bubble and an indicator on touched spots) | true| -|touchCallback| listen to this callback to retrieve touch/pointer events and responses, it gives you a [FlTouchEvent](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#fltouchevent) and [BarTouchResponse](#BarTouchResponse)| null| +|touchCallback| listen to this callback to retrieve touch/pointer events and responses, it gives you a [FlTouchEvent](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#fltouchevent) and [BarTouchResponse](#BarTouchResponse)| null| |longPressDuration| allows to customize the duration of the longPress gesture. If null, the duration of the longPressGesture is [kLongPressTimeout](https://api.flutter.dev/flutter/gestures/kLongPressTimeout-constant.html)| null| ### BarTouchTooltipData @@ -137,29 +137,29 @@ enum values {`start`, `end`, `center`, `spaceEvenly`, `spaceAround`, `spaceBetwe ### Some Samples ---- ##### Sample 1 ([Source Code](/example/lib/presentation/samples/bar/bar_chart_sample1.dart)) - + - + ##### Sample 2 ([Source Code](/example/lib/presentation/samples/bar/bar_chart_sample2.dart)) - + ##### Sample 3 ([Source Code](/example/lib/presentation/samples/bar/bar_chart_sample3.dart)) - + ##### Sample 4 ([Source Code](/example/lib/presentation/samples/bar/bar_chart_sample4.dart)) - + ##### Sample 5 ([Source Code](/example/lib/presentation/samples/bar/bar_chart_sample5.dart)) - + ##### Sample 6 ([Source Code](/example/lib/presentation/samples/bar/bar_chart_sample6.dart)) - + ##### Sample 7 ([Source Code](/example/lib/presentation/samples/bar/bar_chart_sample7.dart)) - + ##### Gist - Toggleable Tooltip ([Source Code](https://gist.github.com/imaNNeo/bce3f0169ff3fd6c3f137cdeb5005c0e)) https://user-images.githubusercontent.com/7009300/156784816-53f95dd9-f387-4600-8a92-d05b1aeea3da.mov diff --git a/repo_files/documentations/handle_animations.md b/repo_files/documentations/handle_animations.md index 6ce792268..d7dca0c01 100644 --- a/repo_files/documentations/handle_animations.md +++ b/repo_files/documentations/handle_animations.md @@ -1,7 +1,7 @@ ### Animations |Sample1 |Sample2 |Sample3 | |:------------:|:------------:|:-------------:| -| [![](https://github.com/imaNNeo/fl_chart/raw/master/repo_files/images/line_chart/line_chart_sample_1_anim.gif)](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/line_chart.md#sample-1-source-code) | [![](https://github.com/imaNNeo/fl_chart/raw/master/repo_files/images/line_chart/line_chart_sample_2_anim.gif)](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/line_chart.md#sample-2-source-code) | [![](https://github.com/imaNNeo/fl_chart/raw/master/repo_files/images/bar_chart/bar_chart_sample_1_anim.gif)](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/bar_chart.md#sample-1-source-code) | +| [![](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/line_chart/line_chart_sample_1_anim.gif)](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/line_chart.md#sample-1-source-code) | [![](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/line_chart/line_chart_sample_2_anim.gif)](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/line_chart.md#sample-2-source-code) | [![](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/bar_chart/bar_chart_sample_1_anim.gif)](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/bar_chart.md#sample-1-source-code) | ##### How? We handle all animations Implicitly, This is power of the [ImplicitlyAnimatedWidget](https://api.flutter.dev/flutter/widgets/ImplicitlyAnimatedWidget-class.html), just like [AnimatedContainer](https://api.flutter.dev/flutter/widgets/AnimatedContainer-class.html). It means you don't need to do anything, just change any value and the animation is handled under the hood, if you are curious about it, check the source code, reading the source code is the best way to learn things. diff --git a/repo_files/documentations/handle_touches.md b/repo_files/documentations/handle_touches.md index fb2959166..0ed86f8f5 100644 --- a/repo_files/documentations/handle_touches.md +++ b/repo_files/documentations/handle_touches.md @@ -2,12 +2,12 @@ |LineChart |BarChart |PieChart | |:------------:|:------------:|:-------------:| -| [![](https://github.com/imaNNeo/fl_chart/raw/master/repo_files/images/line_chart/line_chart_sample_1.gif)](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/line_chart.md#sample-1-source-code) [![](https://github.com/imaNNeo/fl_chart/raw/master/repo_files/images/line_chart/line_chart_sample_2.gif)](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/line_chart.md#sample-2-source-code) | [![](https://github.com/imaNNeo/fl_chart/raw/master/repo_files/images/bar_chart/bar_chart_sample_1.gif)](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/bar_chart.md#sample-1-source-code) [![](https://github.com/imaNNeo/fl_chart/raw/master/repo_files/images/bar_chart/bar_chart_sample_2.gif)](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/bar_chart.md#sample-2-source-code) | [![](https://github.com/imaNNeo/fl_chart/raw/master/repo_files/images/pie_chart/pie_chart_sample_1.gif)](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/pie_chart.md#sample-1-source-code) [![](https://github.com/imaNNeo/fl_chart/raw/master/repo_files/images/pie_chart/pie_chart_sample_2.gif)](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/pie_chart.md#sample-2-source-code) | +| [![](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/line_chart/line_chart_sample_1.gif)](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/line_chart.md#sample-1-source-code) [![](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/line_chart/line_chart_sample_2.gif)](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/line_chart.md#sample-2-source-code) | [![](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/bar_chart/bar_chart_sample_1.gif)](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/bar_chart.md#sample-1-source-code) [![](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/bar_chart/bar_chart_sample_2.gif)](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/bar_chart.md#sample-2-source-code) | [![](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/pie_chart/pie_chart_sample_1.gif)](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/pie_chart.md#sample-1-source-code) [![](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/pie_chart/pie_chart_sample_2.gif)](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/pie_chart.md#sample-2-source-code) | #### The Interaction Flow -When an interaction happens, our renderers give us a [FlTouchEvent](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#fltouchevent). +When an interaction happens, our renderers give us a [FlTouchEvent](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#fltouchevent). We pass it to correspond painter class. Then it calculates and gives us a TouchResponse (per interaction). Then we call the touchCallback function that provided through the chart's data. diff --git a/repo_files/documentations/line_chart.md b/repo_files/documentations/line_chart.md index 7a0f41cd9..00bc36973 100644 --- a/repo_files/documentations/line_chart.md +++ b/repo_files/documentations/line_chart.md @@ -1,6 +1,6 @@ # LineChart - + ### How to use ```dart @@ -104,7 +104,7 @@ When you change the chart's state, it animates to the new state internally (usin |PropName|Description|default value| |:-------|:----------|:------------| |enabled|determines to enable or disable touch behaviors|true| -|mouseCursorResolver|you can change the mouse cursor based on the provided [FlTouchEvent](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#fltouchevent) and [LineTouchResponse](#LineTouchResponse)|MouseCursor.defer| +|mouseCursorResolver|you can change the mouse cursor based on the provided [FlTouchEvent](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#fltouchevent) and [LineTouchResponse](#LineTouchResponse)|MouseCursor.defer| |touchTooltipData|a [LineTouchTooltipData](#LineTouchTooltipData), that determines how show the tooltip on top of touched spots (appearance of the showing tooltip bubble)|LineTouchTooltipData| |getTouchedSpotIndicator| a callback that retrieves list of [TouchedSpotIndicatorData](#TouchedSpotIndicatorData) by the given list of [LineBarSpot](#LineBarSpot) for showing the indicators on touched spots|defaultTouchedIndicators| |touchSpotThreshold|the threshold of the touch accuracy|10| @@ -112,7 +112,7 @@ When you change the chart's state, it animates to the new state internally (usin |handleBuiltInTouches| set this true if you want the built in touch handling (show a tooltip bubble and an indicator on touched spots) | true| |getTouchLineStart| controls where the line starts, default is bottom of the chart| defaultGetTouchLineStart| |getTouchLineEnd| controls where the line ends, default is the touch point| defaultGetTouchLineEnd| -|touchCallback| listen to this callback to retrieve touch/pointer events and responses, it gives you a [FlTouchEvent](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#fltouchevent) and [LineTouchResponse](#LineTouchResponse)| null| +|touchCallback| listen to this callback to retrieve touch/pointer events and responses, it gives you a [FlTouchEvent](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#fltouchevent) and [LineTouchResponse](#LineTouchResponse)| null| |longPressDuration| allows to customize the duration of the longPress gesture. If null, the duration of the longPressGesture is [kLongPressTimeout](https://api.flutter.dev/flutter/gestures/kLongPressTimeout-constant.html)| null| @@ -179,45 +179,45 @@ When you change the chart's state, it animates to the new state internally (usin ### some samples ---- ##### Sample 1 ([Source Code](/example/lib/presentation/samples/line/line_chart_sample1.dart)) - + - + ##### Sample 2 ([Source Code](/example/lib/presentation/samples/line/line_chart_sample2.dart)) - + - + ##### Sample 3 ([Source Code](/example/lib/presentation/samples/line/line_chart_sample3.dart)) - + ##### Sample 4 ([Source Code](/example/lib/presentation/samples/line/line_chart_sample4.dart)) - + ##### Sample 5 ([Source Code](/example/lib/presentation/samples/line/line_chart_sample5.dart)) - + ##### Sample 6 - Reversed ([Source Code](/example/lib/presentation/samples/line/line_chart_sample6.dart)) - + ##### Sample 7 ([Source Code](/example/lib/presentation/samples/line/line_chart_sample7.dart)) - + ##### Sample 8 ([Source Code](/example/lib/presentation/samples/line/line_chart_sample8.dart)) - + ##### Sample 9 ([Source Code](/example/lib/presentation/samples/line/line_chart_sample9.dart)) - + ##### Sample 10 ([Source Code](/example/lib/presentation/samples/line/line_chart_sample10.dart)) - + ##### Sample 11 ([Source Code](/example/lib/presentation/samples/line/line_chart_sample11.dart)) https://user-images.githubusercontent.com/7009300/152555425-3b53ac8c-257f-49b0-8d75-1a878c03ccaa.mp4 diff --git a/repo_files/documentations/migration_guides/0.50.0/MIGRATION_00_50_00.md b/repo_files/documentations/migration_guides/0.50.0/MIGRATION_00_50_00.md index 23103549d..515909a89 100644 --- a/repo_files/documentations/migration_guides/0.50.0/MIGRATION_00_50_00.md +++ b/repo_files/documentations/migration_guides/0.50.0/MIGRATION_00_50_00.md @@ -5,17 +5,17 @@ We did a lot of hard-work to bring widgets to our titles around the axis-based c It means that you can now put a widget as a title instead of a string. Look at the below samples: -**LineChartSample 8** ([Source Code](https://github.com/imaNNeo/fl_chart/blob/master/example/lib/presentation/samples/line/line_chart_sample8.dart)) +**LineChartSample 8** ([Source Code](https://github.com/imaNNeo/fl_chart/blob/main/example/lib/presentation/samples/line/line_chart_sample8.dart)) - + -**BarChartSample 7** ([Source Code](https://github.com/imaNNeo/fl_chart/blob/master/example/lib/presentation/samples/bar/bar_chart_sample7.dart)) +**BarChartSample 7** ([Source Code](https://github.com/imaNNeo/fl_chart/blob/main/example/lib/presentation/samples/bar/bar_chart_sample7.dart)) - + **Breaking:** -Previously in [FlTitlesData](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#FlTitlesData), there were four [SideTitles](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#sidetitles). Now we have four [AxisTitle](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#axistitle) instead and [SideTitles](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#sidetitles) can be placed inside [AxisTitle](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#AxisTitle). -In fact, we removed `AxisTitlesData` class (which used to hold four `AxisTitle`). Now you can put them in [FlTitlesData](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#fltitlesdata). +Previously in [FlTitlesData](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#FlTitlesData), there were four [SideTitles](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#sidetitles). Now we have four [AxisTitle](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#axistitle) instead and [SideTitles](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#sidetitles) can be placed inside [AxisTitle](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#AxisTitle). +In fact, we removed `AxisTitlesData` class (which used to hold four `AxisTitle`). Now you can put them in [FlTitlesData](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#fltitlesdata). bool? showTitle, String? titleText, @@ -121,11 +121,11 @@ Gradient? gradient, * You need to fill one of them. These are the affected classes: -* [BarChartRodData](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/bar_chart.md#barchartroddata) -* [BackgroundBarChartRodData](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/bar_chart.md#backgroundbarchartroddata) -* [BarAreaData](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/line_chart.md#BarAreaData) -* [BetweenBarsData](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/line_chart.md#betweenbarsdata) -* [LineChartBarData](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/line_chart.md#linechartbardata) +* [BarChartRodData](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/bar_chart.md#barchartroddata) +* [BackgroundBarChartRodData](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/bar_chart.md#backgroundbarchartroddata) +* [BarAreaData](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/line_chart.md#BarAreaData) +* [BetweenBarsData](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/line_chart.md#betweenbarsdata) +* [LineChartBarData](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/line_chart.md#linechartbardata) Check the below sample: diff --git a/repo_files/documentations/migration_guides/0.55.0/MIGRATION_00_55_00.md b/repo_files/documentations/migration_guides/0.55.0/MIGRATION_00_55_00.md index 3bfc02fcf..670cca24e 100644 --- a/repo_files/documentations/migration_guides/0.55.0/MIGRATION_00_55_00.md +++ b/repo_files/documentations/migration_guides/0.55.0/MIGRATION_00_55_00.md @@ -5,11 +5,11 @@ We added the ability to customize the rotation angles of the RadarChart titles. To do that we add to break one thing and added a new type. - + **Breaking:** -We only changed [RadarChartData.getTitle](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/radar_chart.md#RadarChartData). +We only changed [RadarChartData.getTitle](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/radar_chart.md#RadarChartData). Its type [GetTitleByIndexFunction] changed from `string Function(int index)` to `RadarChartTitle Function(int index, double angle)`. To reuse the example from the code: @@ -51,7 +51,7 @@ If you take the provided `angle` and forward it to the [RadarChartTitle] it will But you can now render all the titles horizontally by avoiding the [RadarChartTitle.angle] prop (`0` by default). Apply a relative angle, for example: `RadarChartTitle(text: 'Desktop', angle: angle + 90);` - + or an absolute angle, for example: `RadarChartTitle(text: 'Desktop', angle: 90);` - \ No newline at end of file + \ No newline at end of file diff --git a/repo_files/documentations/migration_guides/INDEX.md b/repo_files/documentations/migration_guides/INDEX.md index f05914444..c9a6df6c8 100644 --- a/repo_files/documentations/migration_guides/INDEX.md +++ b/repo_files/documentations/migration_guides/INDEX.md @@ -1,5 +1,5 @@ Here are fl_chart's migration guides: -#### [Migrate to 0.50.0](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/migration_guides/0.50.0/MIGRATION_00_50_00.md) +#### [Migrate to 0.50.0](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/migration_guides/0.50.0/MIGRATION_00_50_00.md) -#### [Migrate to 0.55.0](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/migration_guides/0.55.0/MIGRATION_00_55_00.md) \ No newline at end of file +#### [Migrate to 0.55.0](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/migration_guides/0.55.0/MIGRATION_00_55_00.md) \ No newline at end of file diff --git a/repo_files/documentations/pie_chart.md b/repo_files/documentations/pie_chart.md index a551d3c3a..8117a0390 100644 --- a/repo_files/documentations/pie_chart.md +++ b/repo_files/documentations/pie_chart.md @@ -1,6 +1,6 @@ # PieChart - + ### How to use ```dart @@ -50,8 +50,8 @@ When you change the chart's state, it animates to the new state internally (usin |PropName|Description|default value| |:-------|:----------|:------------| |enabled|determines to enable or disable touch behaviors|true| -|mouseCursorResolver|you can change the mouse cursor based on the provided [FlTouchEvent](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#fltouchevent) and [PieTouchResponse](#PieTouchResponse)|MouseCursor.defer| -|touchCallback| listen to this callback to retrieve touch/pointer events and responses, it gives you a [FlTouchEvent](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#fltouchevent) and [PieTouchResponse](#PieTouchResponse)| null| +|mouseCursorResolver|you can change the mouse cursor based on the provided [FlTouchEvent](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#fltouchevent) and [PieTouchResponse](#PieTouchResponse)|MouseCursor.defer| +|touchCallback| listen to this callback to retrieve touch/pointer events and responses, it gives you a [FlTouchEvent](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#fltouchevent) and [PieTouchResponse](#PieTouchResponse)| null| |longPressDuration| allows to customize the duration of the longPress gesture. If null, the duration of the longPressGesture is [kLongPressTimeout](https://api.flutter.dev/flutter/gestures/kLongPressTimeout-constant.html)| null| ### PieTouchResponse @@ -70,12 +70,12 @@ When you change the chart's state, it animates to the new state internally (usin ### some samples ---- ##### Sample 1 ([Source Code](/example/lib/presentation/samples/pie/pie_chart_sample1.dart)) - + ##### Sample 2 ([Source Code](/example/lib/presentation/samples/pie/pie_chart_sample2.dart)) - + ##### Sample 3 ([Source Code](/example/lib/presentation/samples/pie/pie_chart_sample3.dart)) - + diff --git a/repo_files/documentations/radar_chart.md b/repo_files/documentations/radar_chart.md index ba0406580..5905340a4 100644 --- a/repo_files/documentations/radar_chart.md +++ b/repo_files/documentations/radar_chart.md @@ -1,5 +1,5 @@ # RadarChart - + ### How to use ```dart @@ -50,8 +50,8 @@ When you change the chart's state, it animates to the new state internally (usin |PropName|Description|default value| |:-------|:----------|:------------| |enabled|determines to enable or disable touch behaviors|true| -|mouseCursorResolver|you can change the mouse cursor based on the provided [FlTouchEvent](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#fltouchevent) and [RadarTouchResponse](#RadarTouchResponse)|MouseCursor.defer| -|touchCallback| listen to this callback to retrieve touch/pointer events and responses, it gives you a [FlTouchEvent](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#fltouchevent) and [RadarTouchResponse](#RadarTouchResponse)| null| +|mouseCursorResolver|you can change the mouse cursor based on the provided [FlTouchEvent](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#fltouchevent) and [RadarTouchResponse](#RadarTouchResponse)|MouseCursor.defer| +|touchCallback| listen to this callback to retrieve touch/pointer events and responses, it gives you a [FlTouchEvent](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#fltouchevent) and [RadarTouchResponse](#RadarTouchResponse)| null| |longPressDuration| allows to customize the duration of the longPress gesture. If null, the duration of the longPressGesture is [kLongPressTimeout](https://api.flutter.dev/flutter/gestures/kLongPressTimeout-constant.html)| null| |touchSpotThreshold|the threshold of the touch accuracy. we find the nearest spots on touched position based on this field.|10| @@ -79,4 +79,4 @@ When you change the chart's state, it animates to the new state internally (usin ### some samples ---- ##### Sample 1 ([Source Code](/example/lib/presentation/samples/radar/radar_chart_sample1.dart)) - + diff --git a/repo_files/documentations/scatter_chart.md b/repo_files/documentations/scatter_chart.md index fef371f61..084ee49ff 100644 --- a/repo_files/documentations/scatter_chart.md +++ b/repo_files/documentations/scatter_chart.md @@ -1,6 +1,6 @@ # ScatterChart - + ### How to use ```dart @@ -39,11 +39,11 @@ When you change the chart's state, it animates to the new state internally (usin |PropName|Description|default value| |:-------|:----------|:------------| |enabled|determines to enable or disable touch behaviors|true| -|mouseCursorResolver|you can change the mouse cursor based on the provided [FlTouchEvent](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#fltouchevent) and [ScatterTouchResponse](#ScatterTouchResponse)|MouseCursor.defer| +|mouseCursorResolver|you can change the mouse cursor based on the provided [FlTouchEvent](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#fltouchevent) and [ScatterTouchResponse](#ScatterTouchResponse)|MouseCursor.defer| |touchTooltipData|a [ScatterTouchTooltipData](#ScatterTouchTooltipData), that determines how show the tooltip on top of touched spot (appearance of the showing tooltip bubble)|ScatterTouchTooltipData()| |touchSpotThreshold|the threshold of the touch accuracy|0| |handleBuiltInTouches| set this true if you want the built in touch handling (show a tooltip bubble and an indicator on touched spots) | true| -|touchCallback| listen to this callback to retrieve touch/pointer events and responses, it gives you a [FlTouchEvent](https://github.com/imaNNeo/fl_chart/blob/master/repo_files/documentations/base_chart.md#fltouchevent) and [ScatterTouchResponse](#ScatterTouchResponse)| null| +|touchCallback| listen to this callback to retrieve touch/pointer events and responses, it gives you a [FlTouchEvent](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#fltouchevent) and [ScatterTouchResponse](#ScatterTouchResponse)| null| |longPressDuration| allows to customize the duration of the longPress gesture. If null, the duration of the longPressGesture is [kLongPressTimeout](https://api.flutter.dev/flutter/gestures/kLongPressTimeout-constant.html)| null| ### ScatterTouchTooltipData @@ -93,8 +93,8 @@ When you change the chart's state, it animates to the new state internally (usin ### some samples ---- ##### Sample 1 ([Source Code](/example/lib/presentation/samples/scatter/scatter_chart_sample1.dart)) - + ##### Sample 2 ([Source Code](/example/lib/presentation/samples/scatter/scatter_chart_sample2.dart)) - + From 4c1c27abb766a29525494d720fd0ab6ed13afcaa Mon Sep 17 00:00:00 2001 From: LIZA1608 <78140921+LIZA1608@users.noreply.github.com> Date: Sun, 24 Dec 2023 22:41:15 +0530 Subject: [PATCH 083/149] Update handle_animations.md --- repo_files/documentations/handle_animations.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/repo_files/documentations/handle_animations.md b/repo_files/documentations/handle_animations.md index d7dca0c01..7f3519d18 100644 --- a/repo_files/documentations/handle_animations.md +++ b/repo_files/documentations/handle_animations.md @@ -23,3 +23,11 @@ LineChart( ##### How to disable If you want to disable the animations, you can set `Duration.zero` as `swapAnimationDuration`. +```dart +LineChart( + swapAnimationDuration: Duration.zero, + LineChartData( + // Your chart data here + ), +) + From 944bef4f733d09b45ff1c94000e51c6eb02f119a Mon Sep 17 00:00:00 2001 From: Rami AlDhafeeri Date: Mon, 18 Dec 2023 03:27:58 +0300 Subject: [PATCH 084/149] Add gradient for PieChart --- lib/src/chart/pie_chart/pie_chart_data.dart | 7 +++++++ lib/src/chart/pie_chart/pie_chart_painter.dart | 17 +++++++++++++++-- .../chart/pie_chart/pie_chart_painter_test.dart | 14 +------------- 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/lib/src/chart/pie_chart/pie_chart_data.dart b/lib/src/chart/pie_chart/pie_chart_data.dart index 2d4fd1cae..14be2d03c 100644 --- a/lib/src/chart/pie_chart/pie_chart_data.dart +++ b/lib/src/chart/pie_chart/pie_chart_data.dart @@ -150,6 +150,7 @@ class PieChartSectionData { PieChartSectionData({ double? value, Color? color, + this.gradient, double? radius, bool? showTitle, this.titleStyle, @@ -178,6 +179,9 @@ class PieChartSectionData { /// Defines the color of section. final Color color; + /// Defines the gradient of section. If specified, overrides the color setting. + final Gradient? gradient; + /// Defines the radius of section. final double radius; @@ -218,6 +222,7 @@ class PieChartSectionData { PieChartSectionData copyWith({ double? value, Color? color, + Gradient? gradient, double? radius, bool? showTitle, TextStyle? titleStyle, @@ -230,6 +235,7 @@ class PieChartSectionData { return PieChartSectionData( value: value ?? this.value, color: color ?? this.color, + gradient: gradient ?? this.gradient, radius: radius ?? this.radius, showTitle: showTitle ?? this.showTitle, titleStyle: titleStyle ?? this.titleStyle, @@ -252,6 +258,7 @@ class PieChartSectionData { return PieChartSectionData( value: lerpDouble(a.value, b.value, t), color: Color.lerp(a.color, b.color, t), + gradient: Gradient.lerp(a.gradient, b.gradient, t), radius: lerpDouble(a.radius, b.radius, t), showTitle: b.showTitle, titleStyle: TextStyle.lerp(a.titleStyle, b.titleStyle, t), diff --git a/lib/src/chart/pie_chart/pie_chart_painter.dart b/lib/src/chart/pie_chart/pie_chart_painter.dart index ef1081a48..bded582d6 100644 --- a/lib/src/chart/pie_chart/pie_chart_painter.dart +++ b/lib/src/chart/pie_chart/pie_chart_painter.dart @@ -4,6 +4,7 @@ import 'package:fl_chart/fl_chart.dart'; import 'package:fl_chart/src/chart/base/base_chart/base_chart_painter.dart'; import 'package:fl_chart/src/chart/base/line.dart'; import 'package:fl_chart/src/chart/pie_chart/pie_chart_data.dart'; +import 'package:fl_chart/src/extensions/paint_extension.dart'; import 'package:fl_chart/src/utils/canvas_wrapper.dart'; import 'package:fl_chart/src/utils/utils.dart'; import 'package:flutter/material.dart'; @@ -102,9 +103,17 @@ class PieChartPainter extends BaseChartPainter { final sectionDegree = sectionsAngle[i]; if (sectionDegree == 360) { + final radius = centerRadius + section.radius / 2; + final rect = Rect.fromCircle(center: center, radius: radius); _sectionPaint - ..color = section.color + ..setColorOrGradient( + section.color, + section.gradient, + rect, + ) + ..strokeWidth = section.radius ..style = PaintingStyle.fill; + final bounds = Rect.fromCircle( center: center, radius: centerRadius + section.radius, @@ -293,7 +302,11 @@ class PieChartPainter extends BaseChartPainter { CanvasWrapper canvasWrapper, ) { _sectionPaint - ..color = section.color + ..setColorOrGradient( + section.color, + section.gradient, + sectionPath.getBounds(), + ) ..style = PaintingStyle.fill; canvasWrapper.drawPath(sectionPath, _sectionPaint); } diff --git a/test/chart/pie_chart/pie_chart_painter_test.dart b/test/chart/pie_chart/pie_chart_painter_test.dart index 7f82288ce..f1127f168 100644 --- a/test/chart/pie_chart/pie_chart_painter_test.dart +++ b/test/chart/pie_chart/pie_chart_painter_test.dart @@ -172,7 +172,7 @@ void main() { final result2 = verify( mockCanvasWrapper.drawCircle( const Offset(100, 100), - 10 + 30 - (3 / 2), + 10 + (3 / 2), captureAny, ), ); @@ -180,18 +180,6 @@ void main() { expect((result2.captured.single as Paint).color, MockData.color3); expect((result2.captured.single as Paint).strokeWidth, 3); expect((result2.captured.single as Paint).style, PaintingStyle.stroke); - - final result3 = verify( - mockCanvasWrapper.drawCircle( - const Offset(100, 100), - 10 + (3 / 2), - captureAny, - ), - ); - expect(result3.callCount, 1); - expect((result3.captured.single as Paint).color, MockData.color3); - expect((result3.captured.single as Paint).strokeWidth, 3); - expect((result3.captured.single as Paint).style, PaintingStyle.stroke); }); test('test 2', () { From d3d06d109c2af1188c5d7daf87cc658f0d5c3f68 Mon Sep 17 00:00:00 2001 From: Rami AlDhafeeri Date: Mon, 25 Dec 2023 14:04:23 +0300 Subject: [PATCH 085/149] update docs for pie chart --- repo_files/documentations/pie_chart.md | 1 + 1 file changed, 1 insertion(+) diff --git a/repo_files/documentations/pie_chart.md b/repo_files/documentations/pie_chart.md index 8117a0390..3956beebc 100644 --- a/repo_files/documentations/pie_chart.md +++ b/repo_files/documentations/pie_chart.md @@ -36,6 +36,7 @@ When you change the chart's state, it animates to the new state internally (usin |:---------------|:---------------|:-------| |value| value is the weight of each section, for example if all values is 25, and we have 4 section, then the sum is 100 and each section takes 1/4 of the whole circle (360/4) degree|10| |color| colors the section| Colors.red +|gradient| You can use any [Gradient](https://api.flutter.dev/flutter/dart-ui/Gradient-class.html) here. such as [LinearGradient](https://api.flutter.dev/flutter/painting/LinearGradient-class.html) or [RadialGradient](https://api.flutter.dev/flutter/painting/RadialGradient-class.html)|null| |radius| the width radius of each section|40| |showTitle| determines to show or hide the titles on each section|true| |titleStyle| TextStyle of the titles| TextStyle(color: Colors.white, fontSize: 16, fontWeight: FontWeight.bold)| From 494a51f68eada58c239112fe1a3e0ef32eb25c80 Mon Sep 17 00:00:00 2001 From: Rami AlDhafeeri Date: Mon, 25 Dec 2023 14:41:18 +0300 Subject: [PATCH 086/149] Update pie_chart.md with gradient usage clarification --- repo_files/documentations/pie_chart.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo_files/documentations/pie_chart.md b/repo_files/documentations/pie_chart.md index 3956beebc..a15894d5e 100644 --- a/repo_files/documentations/pie_chart.md +++ b/repo_files/documentations/pie_chart.md @@ -36,7 +36,7 @@ When you change the chart's state, it animates to the new state internally (usin |:---------------|:---------------|:-------| |value| value is the weight of each section, for example if all values is 25, and we have 4 section, then the sum is 100 and each section takes 1/4 of the whole circle (360/4) degree|10| |color| colors the section| Colors.red -|gradient| You can use any [Gradient](https://api.flutter.dev/flutter/dart-ui/Gradient-class.html) here. such as [LinearGradient](https://api.flutter.dev/flutter/painting/LinearGradient-class.html) or [RadialGradient](https://api.flutter.dev/flutter/painting/RadialGradient-class.html)|null| +|gradient| You can use any [Gradient](https://api.flutter.dev/flutter/dart-ui/Gradient-class.html) here. such as [LinearGradient](https://api.flutter.dev/flutter/painting/LinearGradient-class.html) or [RadialGradient](https://api.flutter.dev/flutter/painting/RadialGradient-class.html) (you have to provide either `color` or `gradient`)|null| |radius| the width radius of each section|40| |showTitle| determines to show or hide the titles on each section|true| |titleStyle| TextStyle of the titles| TextStyle(color: Colors.white, fontSize: 16, fontWeight: FontWeight.bold)| From 00c1cd657df909f9694817296d0f13768eef54a2 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Mon, 25 Dec 2023 15:21:47 +0100 Subject: [PATCH 087/149] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 313479b2d..24bbced7f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ ScatterSpot( * **BUGFIX** (by @imaNNeo) Fix barChart tooltip for values below or above the 0 point, #1462 * **BUGFIX** (by @imaNNeo) Fix pieChart drawing single section on iPhone, #1515 * **IMPROVEMENT** (by @imaNNeo) Add gradient property to the [HorizontalLine](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#horizontalline) and [VerticalLine](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#verticalline), #1525 +* **FEATURE** (by @raldhafiri) Add gradient property to the [PieChartSectionData](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/pie_chart.md#piechartsectiondata), #1511 ## 0.65.0 * **FEATURE** (by @Dartek12) Added gradient to [FlLine](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#FlLine), #1197 From 001fd6846c8eb7b108812bb0847a07a22492faaf Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Mon, 25 Dec 2023 15:24:53 +0100 Subject: [PATCH 088/149] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 24bbced7f..0be2997eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ ScatterSpot( * **BUGFIX** (by @imaNNeo) Fix pieChart drawing single section on iPhone, #1515 * **IMPROVEMENT** (by @imaNNeo) Add gradient property to the [HorizontalLine](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#horizontalline) and [VerticalLine](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#verticalline), #1525 * **FEATURE** (by @raldhafiri) Add gradient property to the [PieChartSectionData](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/pie_chart.md#piechartsectiondata), #1511 +* **IMPROVEMENT** (by @imaNNeo) Rename default branch `master` to `main` ## 0.65.0 * **FEATURE** (by @Dartek12) Added gradient to [FlLine](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#FlLine), #1197 From 5f92d722c74ec86fa39650b581655b9bd837233c Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Mon, 25 Dec 2023 15:48:54 +0100 Subject: [PATCH 089/149] Update flutter version to remove the upper bound (to fix the flutter package publish warning) https://dart.dev/go/flutter-upper-bound-deprecation --- CHANGELOG.md | 1 + pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0be2997eb..f19d07301 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ ScatterSpot( * **IMPROVEMENT** (by @imaNNeo) Add gradient property to the [HorizontalLine](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#horizontalline) and [VerticalLine](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#verticalline), #1525 * **FEATURE** (by @raldhafiri) Add gradient property to the [PieChartSectionData](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/pie_chart.md#piechartsectiondata), #1511 * **IMPROVEMENT** (by @imaNNeo) Rename default branch `master` to `main` +* **IMPROVEMENT** (by @imaNNeo) Update flutter sdk constraints to remove the upper bound limit (Read more [here](https://dart.dev/go/flutter-upper-bound-deprecation)). ## 0.65.0 * **FEATURE** (by @Dartek12) Added gradient to [FlLine](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#FlLine), #1197 diff --git a/pubspec.yaml b/pubspec.yaml index 1d46a17f6..bd452b836 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -8,7 +8,7 @@ documentation: https://github.com/imaNNeo/fl_chart environment: sdk: ^3.2.0 - flutter: ^3.16.0 + flutter: '>=3.16.0' funding: - https://github.com/sponsors/imaNNeo From c0ca436e43a9985e2cd5f21980dd4049a3075096 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Mon, 25 Dec 2023 15:25:48 +0100 Subject: [PATCH 090/149] Bump version to 0.66.0 --- CHANGELOG.md | 2 +- pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f19d07301..7832e478f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## newVersion +## 0.66.0 * **IMPROVEMENT** (by @imaNNeo) Add Flutter sdk constraints to the pubspec.yaml to force the user/developer to upgrade the Flutter version to 3.16.0 (latest), #1509 * **IMPROVEMENT** (by @imaNNeo) Add `dotPainter` property to ScatterSpot to allow customizing the dot painter, #568 * **BREAKING** (by @imaNNeo) Remove `color` and `radius` properties from ScatterSpot (use `dotPainter` instead), #568 diff --git a/pubspec.yaml b/pubspec.yaml index bd452b836..50bc277f0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: fl_chart description: A highly customizable Flutter chart library that supports Line Chart, Bar Chart, Pie Chart, Scatter Chart, and Radar Chart. -version: 0.65.0 +version: 0.66.0 homepage: https://flchart.dev/ repository: https://github.com/imaNNeo/fl_chart issue_tracker: https://github.com/imaNNeo/fl_chart/issues From d1166014244e03df3c38ff8f55fa9e78c4740ecb Mon Sep 17 00:00:00 2001 From: Jerry Cai Date: Tue, 26 Dec 2023 14:54:19 -0800 Subject: [PATCH 091/149] Upgrade Kotlin version from 1.6.10 to 1.7.10 --- example/android/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/example/android/build.gradle b/example/android/build.gradle index 83ae22004..ea855b667 100644 --- a/example/android/build.gradle +++ b/example/android/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.6.10' + ext.kotlin_version = '1.7.10' repositories { google() mavenCentral() @@ -26,6 +26,6 @@ subprojects { project.evaluationDependsOn(':app') } -task clean(type: Delete) { +tasks.register("clean", Delete) { delete rootProject.buildDir } From 4838f8b081ed121850d241c5feebd5b75275c052 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Wed, 10 Jan 2024 22:00:04 +0100 Subject: [PATCH 092/149] Fix PieChart blackout issue, #1538 --- example/devtools_options.yaml | 1 + lib/src/chart/pie_chart/pie_chart_painter.dart | 1 + 2 files changed, 2 insertions(+) create mode 100644 example/devtools_options.yaml diff --git a/example/devtools_options.yaml b/example/devtools_options.yaml new file mode 100644 index 000000000..7e7e7f67d --- /dev/null +++ b/example/devtools_options.yaml @@ -0,0 +1 @@ +extensions: diff --git a/lib/src/chart/pie_chart/pie_chart_painter.dart b/lib/src/chart/pie_chart/pie_chart_painter.dart index bded582d6..fdc47ed93 100644 --- a/lib/src/chart/pie_chart/pie_chart_painter.dart +++ b/lib/src/chart/pie_chart/pie_chart_painter.dart @@ -131,6 +131,7 @@ class PieChartPainter extends BaseChartPainter { _sectionPaint..blendMode = BlendMode.srcOut, ) ..restore(); + _sectionPaint.blendMode = BlendMode.srcOver; if (section.borderSide.width != 0.0 && section.borderSide.color.opacity != 0.0) { _sectionStrokePaint From ba2f03fa63544c0e5469546c9db17bf799f1386f Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Sat, 13 Jan 2024 13:26:05 +0100 Subject: [PATCH 093/149] Add some new brandings in README.md --- .vscode/settings.json | 2 +- README.md | 11 ++++++----- repo_files/images/landing_logo.jpg | Bin 201041 -> 634061 bytes repo_files/images/overview_thumbnail.png | Bin 0 -> 640038 bytes 4 files changed, 7 insertions(+), 6 deletions(-) create mode 100644 repo_files/images/overview_thumbnail.png diff --git a/.vscode/settings.json b/.vscode/settings.json index 294a6d9de..219863325 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,7 +4,7 @@ "editor.formatOnType": true, "editor.suggest.snippetsPreventQuickSuggestions": false, "editor.tabCompletion": "onlySnippets", - "editor.wordBasedSuggestions": false, + "editor.wordBasedSuggestions": "off", "files.insertFinalNewline": true, "editor.defaultFormatter": "Dart-Code.dart-code" } diff --git a/README.md b/README.md index 3966902ca..53b7b8f03 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,4 @@ -📊 FL Chart is a highly customizable Flutter chart library that supports **[Line Chart](https://app.flchart.dev/#/line)**, **[Bar Chart](https://app.flchart.dev/#/bar)**, **[Pie Chart](https://app.flchart.dev/#/pie)**, **[Scatter Chart](https://app.flchart.dev/#/scatter)**, and **[Radar Chart](https://app.flchart.dev/#/radar)**. - -✅ Do you want to **motivate me to work more on fl_chart?** You can **[donate me](https://github.com/imaNNeo/fl_chart#donation)** ;) - -![FL Chart Logo](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/landing_logo.jpg) +![FL Chart Logo](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/landing_logo.png) [![pub package](https://img.shields.io/pub/v/fl_chart.svg)](https://pub.dartlang.org/packages/fl_chart) [![codecov](https://codecov.io/gh/imaNNeo/fl_chart/branch/main/graph/badge.svg?token=XBhsIZBbZG)](https://codecov.io/gh/imaNNeo/fl_chart) @@ -15,6 +11,11 @@ Buy Me A Coffee donate button +### Overview +📊 FL Chart is a highly customizable Flutter chart library that supports **[Line Chart](https://app.flchart.dev/#/line)**, **[Bar Chart](https://app.flchart.dev/#/bar)**, **[Pie Chart](https://app.flchart.dev/#/pie)**, **[Scatter Chart](https://app.flchart.dev/#/scatter)**, and **[Radar Chart](https://app.flchart.dev/#/radar)**. + +[![FL Chart Overview Video Thumbnail](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/landing_logo.png)](https://youtu.be/hVRU-kpKNjQ) + ### Chart Types |LineChart |BarChart |PieChart | diff --git a/repo_files/images/landing_logo.jpg b/repo_files/images/landing_logo.jpg index b994fbb838b974e1a71697ed9ba2e33cc7d93bf2..04471ff8859babb21f87a860a7013c68e956f0aa 100644 GIT binary patch literal 634061 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 qij^j0eJ?wwXrM#bd`Pd@eU%N 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 v=45J&PQ80Cck%+TFkXvD4HZ4 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


s;e^);4MX`lo7USzG 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

(YXAin2b@W*db)R90_7g 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 ROe6pR002ovPDHLkV1h0GKZXDR literal 201041 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

uauWAP7UuBQrCD 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�#LJ6H8P>T$Kp#=gpHV`OLIYW< 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 XU&)`i5XA$~LyL>|| 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 z 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%0DbJm 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≶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ℑ|MV>@iJK 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 z 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 z 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%0DCL659g$KnTX{mx3jEC=SU-;yeK2yYp|(G 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

[](https://youtu.be/hVRU-kpKNjQ)

### Chart Types From 50def3defe25fe091c316d865e384af68a3cf11c Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Mon, 22 Jan 2024 21:27:06 +0100 Subject: [PATCH 096/149] Fix memory leak in LineChart and BarChart, #1106 --- lib/src/chart/bar_chart/bar_chart.dart | 24 +++++++++--- lib/src/chart/bar_chart/bar_chart_data.dart | 8 +++- lib/src/chart/bar_chart/bar_chart_helper.dart | 4 +- lib/src/chart/line_chart/line_chart.dart | 33 +++++++++++++--- lib/src/chart/line_chart/line_chart_data.dart | 16 ++++---- .../chart/line_chart/line_chart_helper.dart | 4 +- .../bar_chart/bar_chart_helper_test.dart | 39 ++++++++++++------- .../line_chart/line_chart_helper_test.dart | 30 +++++++++----- 8 files changed, 110 insertions(+), 48 deletions(-) diff --git a/lib/src/chart/bar_chart/bar_chart.dart b/lib/src/chart/bar_chart/bar_chart.dart index 83c19e5cd..c83023340 100644 --- a/lib/src/chart/bar_chart/bar_chart.dart +++ b/lib/src/chart/bar_chart/bar_chart.dart @@ -1,4 +1,5 @@ import 'package:fl_chart/fl_chart.dart'; +import 'package:fl_chart/src/chart/bar_chart/bar_chart_helper.dart'; import 'package:fl_chart/src/chart/bar_chart/bar_chart_renderer.dart'; import 'package:fl_chart/src/chart/base/axis_chart/axis_chart_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; @@ -44,6 +45,8 @@ class _BarChartState extends AnimatedWidgetBaseState { final Map> _showingTouchedTooltips = {}; + final _barChartHelper = BarChartHelper(); + @override Widget build(BuildContext context) { final showingData = _getData(); @@ -81,15 +84,24 @@ class _BarChartState extends AnimatedWidgetBaseState { } BarChartData _getData() { - final barTouchData = widget.data.barTouchData; + var newData = widget.data; + if (newData.minY.isNaN || newData.maxY.isNaN) { + final values = _barChartHelper.calculateMaxAxisValues(newData.barGroups); + newData = newData.copyWith( + minY: newData.minY.isNaN ? values.minY : newData.minY, + maxY: newData.maxY.isNaN ? values.maxY : newData.maxY, + ); + } + + final barTouchData = newData.barTouchData; if (barTouchData.enabled && barTouchData.handleBuiltInTouches) { _providedTouchCallback = barTouchData.touchCallback; - return widget.data.copyWith( - barTouchData: widget.data.barTouchData - .copyWith(touchCallback: _handleBuiltInTouch), + return newData.copyWith( + barTouchData: + newData.barTouchData.copyWith(touchCallback: _handleBuiltInTouch), ); } - return widget.data; + return newData; } void _handleBuiltInTouch( @@ -121,7 +133,7 @@ class _BarChartState extends AnimatedWidgetBaseState { void forEachTween(TweenVisitor visitor) { _barChartDataTween = visitor( _barChartDataTween, - widget.data, + _getData(), (dynamic value) => BarChartDataTween(begin: value as BarChartData, end: widget.data), ) as BarChartDataTween?; diff --git a/lib/src/chart/bar_chart/bar_chart_data.dart b/lib/src/chart/bar_chart/bar_chart_data.dart index fd2b24e40..a34077e65 100644 --- a/lib/src/chart/bar_chart/bar_chart_data.dart +++ b/lib/src/chart/bar_chart/bar_chart_data.dart @@ -1,4 +1,5 @@ // coverage:ignore-file +import 'dart:io'; import 'dart:math'; import 'dart:ui'; @@ -10,6 +11,9 @@ import 'package:fl_chart/src/utils/lerp.dart'; import 'package:fl_chart/src/utils/utils.dart'; import 'package:flutter/material.dart'; +final _isTest = Platform.environment.containsKey('FLUTTER_TEST'); +final _axisValues = BarChartHelper().calculateMaxAxisValues; + /// [BarChart] needs this class to render itself. /// /// It holds data needed to draw a bar chart, @@ -64,9 +68,9 @@ class BarChartData extends AxisChartData with EquatableMixin { minX: 0, maxX: 1, maxY: maxY ?? - BarChartHelper.calculateMaxAxisValues(barGroups ?? []).maxY, + (_isTest ? _axisValues(barGroups ?? []).maxY : double.nan), minY: minY ?? - BarChartHelper.calculateMaxAxisValues(barGroups ?? []).minY, + (_isTest ? _axisValues(barGroups ?? []).minY : double.nan), ); /// [BarChart] draws [barGroups] that each of them contains a list of [BarChartRodData]. diff --git a/lib/src/chart/bar_chart/bar_chart_helper.dart b/lib/src/chart/bar_chart/bar_chart_helper.dart index 10763170d..22b14da56 100644 --- a/lib/src/chart/bar_chart/bar_chart_helper.dart +++ b/lib/src/chart/bar_chart/bar_chart_helper.dart @@ -9,12 +9,12 @@ class BarChartHelper { /// Contains List of cached results, base on [List] /// /// We use it to prevent redundant calculations - static final Map, BarChartMinMaxAxisValues> + final Map, BarChartMinMaxAxisValues> _cachedResults = {}; /// Calculates minY, and maxY based on [barGroups], /// returns cached values, to prevent redundant calculations. - static BarChartMinMaxAxisValues calculateMaxAxisValues( + BarChartMinMaxAxisValues calculateMaxAxisValues( List barGroups, ) { if (barGroups.isEmpty) { diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index cee6c9d60..f36321df9 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -1,5 +1,6 @@ import 'package:fl_chart/fl_chart.dart'; import 'package:fl_chart/src/chart/base/axis_chart/axis_chart_scaffold_widget.dart'; +import 'package:fl_chart/src/chart/line_chart/line_chart_helper.dart'; import 'package:fl_chart/src/chart/line_chart/line_chart_renderer.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -44,6 +45,8 @@ class _LineChartState extends AnimatedWidgetBaseState { final Map> _showingTouchedIndicators = {}; + final _lineChartHelper = LineChartHelper(); + @override Widget build(BuildContext context) { final showingData = _getData(); @@ -76,15 +79,35 @@ class _LineChartState extends AnimatedWidgetBaseState { } LineChartData _getData() { - final lineTouchData = widget.data.lineTouchData; + var newData = widget.data; + + /// Calculate minX, maxX, minY, maxY for [LineChartData] if they are null, + /// it is necessary to render the chart correctly. + if (newData.minX.isNaN || + newData.maxX.isNaN || + newData.minY.isNaN || + newData.maxY.isNaN) { + final values = _lineChartHelper.calculateMaxAxisValues( + newData.lineBarsData, + ); + newData = newData.copyWith( + minX: newData.minX.isNaN ? values.minX : newData.minX, + maxX: newData.maxX.isNaN ? values.maxX : newData.maxX, + minY: newData.minY.isNaN ? values.minY : newData.minY, + maxY: newData.maxY.isNaN ? values.maxY : newData.maxY, + ); + } + + final lineTouchData = newData.lineTouchData; if (lineTouchData.enabled && lineTouchData.handleBuiltInTouches) { _providedTouchCallback = lineTouchData.touchCallback; - return widget.data.copyWith( - lineTouchData: widget.data.lineTouchData - .copyWith(touchCallback: _handleBuiltInTouch), + newData = newData.copyWith( + lineTouchData: + newData.lineTouchData.copyWith(touchCallback: _handleBuiltInTouch), ); } - return widget.data; + + return newData; } void _handleBuiltInTouch( diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index 968785691..d291db876 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -1,4 +1,5 @@ // coverage:ignore-file +import 'dart:io'; import 'dart:ui'; import 'package:equatable/equatable.dart'; @@ -9,6 +10,9 @@ import 'package:fl_chart/src/extensions/gradient_extension.dart'; import 'package:fl_chart/src/utils/lerp.dart'; import 'package:flutter/material.dart' hide Image; +final _isTest = Platform.environment.containsKey('FLUTTER_TEST'); +final _axisValues = LineChartHelper().calculateMaxAxisValues; + /// [LineChart] needs this class to render itself. /// /// It holds data needed to draw a line chart, @@ -61,14 +65,10 @@ class LineChartData extends AxisChartData with EquatableMixin { super.backgroundColor, }) : super( touchData: lineTouchData, - minX: - minX ?? LineChartHelper.calculateMaxAxisValues(lineBarsData).minX, - maxX: - maxX ?? LineChartHelper.calculateMaxAxisValues(lineBarsData).maxX, - minY: - minY ?? LineChartHelper.calculateMaxAxisValues(lineBarsData).minY, - maxY: - maxY ?? LineChartHelper.calculateMaxAxisValues(lineBarsData).maxY, + minX: minX ?? (_isTest ? _axisValues(lineBarsData).minX : double.nan), + maxX: maxX ?? (_isTest ? _axisValues(lineBarsData).maxX : double.nan), + minY: minY ?? (_isTest ? _axisValues(lineBarsData).minY : double.nan), + maxY: maxY ?? (_isTest ? _axisValues(lineBarsData).maxY : double.nan), ); /// [LineChart] draws some lines in various shapes and overlaps them. diff --git a/lib/src/chart/line_chart/line_chart_helper.dart b/lib/src/chart/line_chart/line_chart_helper.dart index 336fb40fd..90e388f03 100644 --- a/lib/src/chart/line_chart/line_chart_helper.dart +++ b/lib/src/chart/line_chart/line_chart_helper.dart @@ -7,10 +7,10 @@ class LineChartHelper { /// Contains List of cached results, base on [List] /// /// We use it to prevent redundant calculations - static final Map, LineChartMinMaxAxisValues> + final Map, LineChartMinMaxAxisValues> _cachedResults = {}; - static LineChartMinMaxAxisValues calculateMaxAxisValues( + LineChartMinMaxAxisValues calculateMaxAxisValues( List lineBarsData, ) { if (lineBarsData.isEmpty) { diff --git a/test/chart/bar_chart/bar_chart_helper_test.dart b/test/chart/bar_chart/bar_chart_helper_test.dart index 658854754..35c5e27f8 100644 --- a/test/chart/bar_chart/bar_chart_helper_test.dart +++ b/test/chart/bar_chart/bar_chart_helper_test.dart @@ -7,31 +7,35 @@ import '../data_pool.dart'; void main() { group('Check caching of BarChartHelper.calculateMaxAxisValues', () { test('Test read from cache1', () { + final barChartHelper = BarChartHelper(); final barGroups1 = [barChartGroupData1]; - final result1 = BarChartHelper.calculateMaxAxisValues(barGroups1); + final result1 = barChartHelper.calculateMaxAxisValues(barGroups1); final barGroups2 = [barChartGroupData2]; - final result2 = BarChartHelper.calculateMaxAxisValues(barGroups2); + final result2 = barChartHelper.calculateMaxAxisValues(barGroups2); expect(result1.readFromCache, false); expect(result2.readFromCache, false); }); test('Test read from cache2', () { + final barChartHelper = BarChartHelper(); final barGroups = [barChartGroupData1, barChartGroupData2]; - final result1 = BarChartHelper.calculateMaxAxisValues(barGroups); - final result2 = BarChartHelper.calculateMaxAxisValues(barGroups); + final result1 = barChartHelper.calculateMaxAxisValues(barGroups); + final result2 = barChartHelper.calculateMaxAxisValues(barGroups); expect(result1.readFromCache, false); expect(result2.readFromCache, true); }); test('Test validity 1', () { + final barChartHelper = BarChartHelper(); final barGroups = [barChartGroupData1, barChartGroupData2]; - final result = BarChartHelper.calculateMaxAxisValues(barGroups); + final result = barChartHelper.calculateMaxAxisValues(barGroups); expect(result.minY, 0); expect(result.maxY, 1132); }); test('Test validity 2', () { + final barChartHelper = BarChartHelper(); final barGroups = [ barChartGroupData1.copyWith( barRods: [ @@ -43,21 +47,23 @@ void main() { ], ), ]; - final result = BarChartHelper.calculateMaxAxisValues(barGroups); + final result = barChartHelper.calculateMaxAxisValues(barGroups); expect(result.minY, -40); expect(result.maxY, 10); }); test('Test validity 3', () { + final barChartHelper = BarChartHelper(); final barGroups = [ barChartGroupData1.copyWith(barRods: []), ]; - final result = BarChartHelper.calculateMaxAxisValues(barGroups); + final result = barChartHelper.calculateMaxAxisValues(barGroups); expect(result.minY, 0); expect(result.maxY, 0); }); test('Test validity 4', () { + final barChartHelper = BarChartHelper(); final barGroups = [ barChartGroupData1.copyWith( barRods: [ @@ -71,21 +77,26 @@ void main() { ], ), ]; - final result = BarChartHelper.calculateMaxAxisValues(barGroups); + final result = barChartHelper.calculateMaxAxisValues(barGroups); expect(result.minY, -50); expect(result.maxY, 39); }); test('Test equality', () { + final barChartHelper = BarChartHelper(); final barGroups = [barChartGroupData1, barChartGroupData2]; - final result1 = BarChartHelper.calculateMaxAxisValues(barGroups); - final result2 = BarChartHelper.calculateMaxAxisValues(barGroups); + final result1 = barChartHelper.calculateMaxAxisValues(barGroups); + final result2 = barChartHelper.calculateMaxAxisValues(barGroups).copyWith( + readFromCache: false, + ); expect(result1, result2); }); test('Test equality2', () { + final barChartHelper = BarChartHelper(); final barGroups = [barChartGroupData1, barChartGroupData2]; - final result1 = BarChartHelper.calculateMaxAxisValues(barGroups) + final result1 = barChartHelper + .calculateMaxAxisValues(barGroups) .copyWith(readFromCache: true); final result2 = result1.copyWith(readFromCache: false); expect(result1 != result2, true); @@ -99,6 +110,7 @@ void main() { }); test('Test calculateMaxAxisValues with all positive values', () { + final barChartHelper = BarChartHelper(); final barGroups = [ barChartGroupData1.copyWith( barRods: barChartGroupData1.barRods @@ -121,11 +133,12 @@ void main() { .toList(), ), ]; - final result1 = BarChartHelper.calculateMaxAxisValues(barGroups); + final result1 = barChartHelper.calculateMaxAxisValues(barGroups); expect(result1.minY, 5); }); test('Test calculateMaxAxisValues with all negative values', () { + final barChartHelper = BarChartHelper(); final barGroups = [ barChartGroupData1.copyWith( barRods: barChartGroupData1.barRods @@ -138,7 +151,7 @@ void main() { .toList(), ), ]; - final result1 = BarChartHelper.calculateMaxAxisValues(barGroups); + final result1 = barChartHelper.calculateMaxAxisValues(barGroups); expect(result1.minY, -8); }); }); diff --git a/test/chart/line_chart/line_chart_helper_test.dart b/test/chart/line_chart/line_chart_helper_test.dart index 0ed40801c..341e35f27 100644 --- a/test/chart/line_chart/line_chart_helper_test.dart +++ b/test/chart/line_chart/line_chart_helper_test.dart @@ -7,28 +7,31 @@ import '../data_pool.dart'; void main() { group('Check caching of LineChartHelper.calculateMaxAxisValues', () { test('Test read from cache1', () { + final lineChartHelper = LineChartHelper(); final lineBars1 = [lineChartBarData1]; - final result1 = LineChartHelper.calculateMaxAxisValues(lineBars1); + final result1 = lineChartHelper.calculateMaxAxisValues(lineBars1); final lineBars2 = [lineChartBarData2]; - final result2 = LineChartHelper.calculateMaxAxisValues(lineBars2); + final result2 = lineChartHelper.calculateMaxAxisValues(lineBars2); expect(result1.readFromCache, false); expect(result2.readFromCache, false); }); test('Test read from cache2', () { + final lineChartHelper = LineChartHelper(); final lineBars = [lineChartBarData1, lineChartBarData2]; final lineBarsClone = [lineChartBarData1Clone, lineChartBarData2]; - final result1 = LineChartHelper.calculateMaxAxisValues(lineBars); - final result2 = LineChartHelper.calculateMaxAxisValues(lineBarsClone); + final result1 = lineChartHelper.calculateMaxAxisValues(lineBars); + final result2 = lineChartHelper.calculateMaxAxisValues(lineBarsClone); expect(result1.readFromCache, false); expect(result2.readFromCache, true); }); test('Test validity 1', () { + final lineChartHelper = LineChartHelper(); final lineBars = [lineChartBarData1, lineChartBarData2]; - final result = LineChartHelper.calculateMaxAxisValues(lineBars); + final result = lineChartHelper.calculateMaxAxisValues(lineBars); expect(result.minX, 1); expect(result.maxX, 4); expect(result.minY, 1); @@ -36,6 +39,7 @@ void main() { }); test('Test validity 2', () { + final lineChartHelper = LineChartHelper(); final lineBars = [ lineChartBarData1.copyWith( spots: const [ @@ -45,7 +49,7 @@ void main() { ], ), ]; - final result = LineChartHelper.calculateMaxAxisValues(lineBars); + final result = lineChartHelper.calculateMaxAxisValues(lineBars); expect(result.minX, -3); expect(result.maxX, 14); expect(result.minY, -10); @@ -53,14 +57,19 @@ void main() { }); test('Test equality', () { + final lineChartHelper = LineChartHelper(); final lineBars = [lineChartBarData1, lineChartBarData2]; final lineBarsClone = [lineChartBarData1Clone, lineChartBarData2]; - final result1 = LineChartHelper.calculateMaxAxisValues(lineBars); - final result2 = LineChartHelper.calculateMaxAxisValues(lineBarsClone); + final result1 = lineChartHelper.calculateMaxAxisValues(lineBars); + final result2 = + lineChartHelper.calculateMaxAxisValues(lineBarsClone).copyWith( + readFromCache: false, + ); expect(result1, result2); }); test('Test null spot 1', () { + final lineChartHelper = LineChartHelper(); final lineBars = [ LineChartBarData( spots: [ @@ -71,11 +80,12 @@ void main() { ], ), ]; - final result1 = LineChartHelper.calculateMaxAxisValues(lineBars); + final result1 = lineChartHelper.calculateMaxAxisValues(lineBars); expect(result1, const LineChartMinMaxAxisValues(0, 0, 0, 0)); }); test('Test null spot 2', () { + final lineChartHelper = LineChartHelper(); final lineBars = [ LineChartBarData( spots: [ @@ -86,7 +96,7 @@ void main() { ], ), ]; - final result1 = LineChartHelper.calculateMaxAxisValues(lineBars); + final result1 = lineChartHelper.calculateMaxAxisValues(lineBars); expect(result1, const LineChartMinMaxAxisValues(-1, 4, -3, 5)); }); }); From 122a9e3f2d8a52483c8dbed73fe314cb3427bc5d Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Mon, 22 Jan 2024 21:27:28 +0100 Subject: [PATCH 097/149] Update CHANGELOG.md --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7832e478f..b89b71a4f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## newVersion +* **BUGFIX** (by @imaNNeo) Fix PieChart blackout issue, #1538 +* **BUGFIX** (by @imaNNeo) Fix memory leak in LineChart and BarChart, #1106 + ## 0.66.0 * **IMPROVEMENT** (by @imaNNeo) Add Flutter sdk constraints to the pubspec.yaml to force the user/developer to upgrade the Flutter version to 3.16.0 (latest), #1509 * **IMPROVEMENT** (by @imaNNeo) Add `dotPainter` property to ScatterSpot to allow customizing the dot painter, #568 From 294f250eaff60c36ec0347a70fef6d3f8849f651 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Mon, 22 Jan 2024 21:41:34 +0100 Subject: [PATCH 098/149] Minor change on .codecov.yml --- .codecov.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ .codecov.yml b/ .codecov.yml index 7052b8221..a38bf6570 100644 --- a/ .codecov.yml +++ b/ .codecov.yml @@ -5,12 +5,12 @@ coverage: status: project: default: - target: 85% - threshold: 2% + target: auto + threshold: 1% patch: default: - target: 0% - threshold: 100% + target: 50% + threshold: 10% precision: 1 range: "80...100" From 90b615e6093b6c7b8858e1f848ed9c736643621f Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Mon, 22 Jan 2024 22:27:59 +0100 Subject: [PATCH 099/149] Bump version to 0.66.1 --- CHANGELOG.md | 2 +- pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b89b71a4f..1b9411880 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## newVersion +## 0.66.1 * **BUGFIX** (by @imaNNeo) Fix PieChart blackout issue, #1538 * **BUGFIX** (by @imaNNeo) Fix memory leak in LineChart and BarChart, #1106 diff --git a/pubspec.yaml b/pubspec.yaml index 50bc277f0..0a277c199 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: fl_chart description: A highly customizable Flutter chart library that supports Line Chart, Bar Chart, Pie Chart, Scatter Chart, and Radar Chart. -version: 0.66.0 +version: 0.66.1 homepage: https://flchart.dev/ repository: https://github.com/imaNNeo/fl_chart issue_tracker: https://github.com/imaNNeo/fl_chart/issues From c75c6eadbb1f7aded285f68d79cbd8f801bff2fc Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Mon, 22 Jan 2024 23:34:06 +0100 Subject: [PATCH 100/149] Minor fix on README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 95756e022..8e1a891e2 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ ### Overview 📊 FL Chart is a highly customizable Flutter chart library that supports **[Line Chart](https://app.flchart.dev/#/line)**, **[Bar Chart](https://app.flchart.dev/#/bar)**, **[Pie Chart](https://app.flchart.dev/#/pie)**, **[Scatter Chart](https://app.flchart.dev/#/scatter)**, and **[Radar Chart](https://app.flchart.dev/#/radar)**. -[

[](https://youtu.be/hVRU-kpKNjQ)

+

[](https://youtu.be/hVRU-kpKNjQ)

### Chart Types From 0c75173c62eb1ac842282656ec493591121a7632 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Mon, 22 Jan 2024 23:36:23 +0100 Subject: [PATCH 101/149] Fix README [ issue --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8e1a891e2..16b4329f3 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ ### Overview 📊 FL Chart is a highly customizable Flutter chart library that supports **[Line Chart](https://app.flchart.dev/#/line)**, **[Bar Chart](https://app.flchart.dev/#/bar)**, **[Pie Chart](https://app.flchart.dev/#/pie)**, **[Scatter Chart](https://app.flchart.dev/#/scatter)**, and **[Radar Chart](https://app.flchart.dev/#/radar)**. -

[](https://youtu.be/hVRU-kpKNjQ)

+[

](https://youtu.be/hVRU-kpKNjQ) ### Chart Types From 4b144a03d14b750aea76001f763442eff8044c69 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Mon, 22 Jan 2024 23:38:56 +0100 Subject: [PATCH 102/149] Use
tag for link in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 16b4329f3..c0cff1dbb 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ ### Overview 📊 FL Chart is a highly customizable Flutter chart library that supports **[Line Chart](https://app.flchart.dev/#/line)**, **[Bar Chart](https://app.flchart.dev/#/bar)**, **[Pie Chart](https://app.flchart.dev/#/pie)**, **[Scatter Chart](https://app.flchart.dev/#/scatter)**, and **[Radar Chart](https://app.flchart.dev/#/radar)**. -[

](https://youtu.be/hVRU-kpKNjQ) +

### Chart Types From 2ff658b32dad68e6f524d23bac66a0fbc391b016 Mon Sep 17 00:00:00 2001 From: r3za Date: Sat, 27 Jan 2024 14:33:03 +0100 Subject: [PATCH 103/149] Update README.md a minor improvement on readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c0cff1dbb..2fa2f6fff 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ Thank you all! # Let's get started -First of all you need to add the `fl_chart` in your project. In order to do that, follow [this guide](https://pub.dev/packages/fl_chart/install). +First of all, you need to add the `fl_chart` in your project. In order to do that, follow [this guide](https://pub.dev/packages/fl_chart/install). Then you need to read the docs. Start from [here](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/index.md). From 46dd5ad8cfe7eed884a58c821a624d80e19f0dbe Mon Sep 17 00:00:00 2001 From: Julian Scheel Date: Thu, 25 Jan 2024 09:40:56 +0100 Subject: [PATCH 104/149] Fix unsupported environment access on web The Platform.environment can not be be accessed in flutter web. Remove the check when running on web to prevent an exception. Fixes #1565. --- lib/src/chart/bar_chart/bar_chart_data.dart | 3 ++- lib/src/chart/line_chart/line_chart_data.dart | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/src/chart/bar_chart/bar_chart_data.dart b/lib/src/chart/bar_chart/bar_chart_data.dart index a34077e65..9841e4a6d 100644 --- a/lib/src/chart/bar_chart/bar_chart_data.dart +++ b/lib/src/chart/bar_chart/bar_chart_data.dart @@ -9,9 +9,10 @@ import 'package:fl_chart/src/chart/bar_chart/bar_chart_helper.dart'; import 'package:fl_chart/src/extensions/color_extension.dart'; import 'package:fl_chart/src/utils/lerp.dart'; import 'package:fl_chart/src/utils/utils.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -final _isTest = Platform.environment.containsKey('FLUTTER_TEST'); +final _isTest = !kIsWeb && Platform.environment.containsKey('FLUTTER_TEST'); final _axisValues = BarChartHelper().calculateMaxAxisValues; /// [BarChart] needs this class to render itself. diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index d291db876..b4634efed 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -8,9 +8,10 @@ import 'package:fl_chart/src/chart/line_chart/line_chart_helper.dart'; import 'package:fl_chart/src/extensions/color_extension.dart'; import 'package:fl_chart/src/extensions/gradient_extension.dart'; import 'package:fl_chart/src/utils/lerp.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart' hide Image; -final _isTest = Platform.environment.containsKey('FLUTTER_TEST'); +final _isTest = !kIsWeb && Platform.environment.containsKey('FLUTTER_TEST'); final _axisValues = LineChartHelper().calculateMaxAxisValues; /// [LineChart] needs this class to render itself. From 75a3b98538be9c940299d6e9b9ce54c1dbc0b170 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yunus=20Can=20Sakall=C4=B1?= <43264230+adamsocrat@users.noreply.github.com> Date: Wed, 7 Feb 2024 14:07:04 +0100 Subject: [PATCH 105/149] Update bar_chart.md --- repo_files/documentations/bar_chart.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo_files/documentations/bar_chart.md b/repo_files/documentations/bar_chart.md index 1c0751ed7..37478cf53 100644 --- a/repo_files/documentations/bar_chart.md +++ b/repo_files/documentations/bar_chart.md @@ -26,7 +26,7 @@ When you change the chart's state, it animates to the new state internally (usin |axisTitleData| check the [FlAxisTitleData](base_chart.md#FlAxisTitleData)| FlAxisTitleData()| |rangeAnnotations| show range annotations behind the chart, check [RangeAnnotations](base_chart.md#RangeAnnotations) | RangeAnnotations()| |backgroundColor| a background color which is drawn behind the chart| null | -|barTouchData| [BarTouchData](#BarTouchData) holds the touch interactivity details|BarTouchData()| +|barTouchData| [BarTouchData](#bartouchdata-read-about-touch-handling) holds the touch interactivity details|BarTouchData()| |gridData| check the [FlGridData](base_chart.md#FlGridData)|FlGridData()| |borderData| check the [FlBorderData](base_chart.md#FlBorderData)|FlBorderData()| |maxY| gets maximum y of y axis, if null, value will be read from the input barGroups | null| From 2d21444efc642de3dcc15aef8978c09ff77cce36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yunus=20Can=20Sakall=C4=B1?= <43264230+adamsocrat@users.noreply.github.com> Date: Wed, 7 Feb 2024 14:08:44 +0100 Subject: [PATCH 106/149] Update pie_chart.md --- repo_files/documentations/pie_chart.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo_files/documentations/pie_chart.md b/repo_files/documentations/pie_chart.md index a15894d5e..3b134c708 100644 --- a/repo_files/documentations/pie_chart.md +++ b/repo_files/documentations/pie_chart.md @@ -27,7 +27,7 @@ When you change the chart's state, it animates to the new state internally (usin |centerSpaceColor| colors the free space in the middle of the PieChart|Colors.transparent| |sectionsSpace| space between the sections (margin of them). It does not work on html-rendere, read more about it [here](https://github.com/imaNNeo/fl_chart/issues/955) |2| |startDegreeOffset| degree offset of the sections around the pie chart, should be between 0 and 360|0| -|pieTouchData| [PieTouchData](#PieTouchData) holds the touch interactivity details| PieTouchData()| +|pieTouchData| [PieTouchData](#pietouchdata-read-about-touch-handling) holds the touch interactivity details| PieTouchData()| |borderData| shows a border around the chart, check the [FlBorderData](base_chart.md#FlBorderData)|FlBorderData()| From c2e634d781a1283539c12682fac36457080c0b2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yunus=20Can=20Sakall=C4=B1?= <43264230+adamsocrat@users.noreply.github.com> Date: Wed, 7 Feb 2024 14:11:01 +0100 Subject: [PATCH 107/149] Update radar_chart.md --- repo_files/documentations/radar_chart.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo_files/documentations/radar_chart.md b/repo_files/documentations/radar_chart.md index 5905340a4..7a9972488 100644 --- a/repo_files/documentations/radar_chart.md +++ b/repo_files/documentations/radar_chart.md @@ -30,7 +30,7 @@ When you change the chart's state, it animates to the new state internally (usin |ticksTextStyle|TextStyle of the tick titles|TextStyle(fontSize: 10, color: Colors.black)| |tickBorderData|Style of the tick borders|BorderSide(color: Colors.black, width: 2)| |gridBorderData|Style of the grid borders|BorderSide(color: Colors.black, width: 2)| -|radarTouchData|Handles touch behaviors and responses.|RadarTouchData()| +|radarTouchData|[RadarTouchData](#radartouchdata-read-about-touch-handling) handles the touch behaviors and responses.|RadarTouchData()| ### RadarDataSet |PropName |Description |default value| From eb82f1c5373af6c6e65ff0c57b43794b76ae6491 Mon Sep 17 00:00:00 2001 From: stwarwas Date: Mon, 5 Feb 2024 22:14:34 -0500 Subject: [PATCH 108/149] - removed dependency to dart:io - moved test-helper code to test cases --- lib/src/chart/bar_chart/bar_chart_data.dart | 12 +- lib/src/chart/line_chart/line_chart_data.dart | 14 +- .../bar_chart/bar_chart_painter_test.dart | 190 ++++++++++++------ .../side_titles/side_titles_widget_test.dart | 106 +++++----- .../line_chart/line_chart_painter_test.dart | 31 ++- 5 files changed, 218 insertions(+), 135 deletions(-) diff --git a/lib/src/chart/bar_chart/bar_chart_data.dart b/lib/src/chart/bar_chart/bar_chart_data.dart index 9841e4a6d..7597e5714 100644 --- a/lib/src/chart/bar_chart/bar_chart_data.dart +++ b/lib/src/chart/bar_chart/bar_chart_data.dart @@ -1,20 +1,14 @@ // coverage:ignore-file -import 'dart:io'; import 'dart:math'; import 'dart:ui'; import 'package:equatable/equatable.dart'; import 'package:fl_chart/fl_chart.dart'; -import 'package:fl_chart/src/chart/bar_chart/bar_chart_helper.dart'; import 'package:fl_chart/src/extensions/color_extension.dart'; import 'package:fl_chart/src/utils/lerp.dart'; import 'package:fl_chart/src/utils/utils.dart'; -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -final _isTest = !kIsWeb && Platform.environment.containsKey('FLUTTER_TEST'); -final _axisValues = BarChartHelper().calculateMaxAxisValues; - /// [BarChart] needs this class to render itself. /// /// It holds data needed to draw a bar chart, @@ -68,10 +62,8 @@ class BarChartData extends AxisChartData with EquatableMixin { extraLinesData: extraLinesData ?? const ExtraLinesData(), minX: 0, maxX: 1, - maxY: maxY ?? - (_isTest ? _axisValues(barGroups ?? []).maxY : double.nan), - minY: minY ?? - (_isTest ? _axisValues(barGroups ?? []).minY : double.nan), + maxY: maxY ?? double.nan, + minY: minY ?? double.nan, ); /// [BarChart] draws [barGroups] that each of them contains a list of [BarChartRodData]. diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index b4634efed..b09a1b029 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -1,19 +1,13 @@ // coverage:ignore-file -import 'dart:io'; import 'dart:ui'; import 'package:equatable/equatable.dart'; import 'package:fl_chart/fl_chart.dart'; -import 'package:fl_chart/src/chart/line_chart/line_chart_helper.dart'; import 'package:fl_chart/src/extensions/color_extension.dart'; import 'package:fl_chart/src/extensions/gradient_extension.dart'; import 'package:fl_chart/src/utils/lerp.dart'; -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart' hide Image; -final _isTest = !kIsWeb && Platform.environment.containsKey('FLUTTER_TEST'); -final _axisValues = LineChartHelper().calculateMaxAxisValues; - /// [LineChart] needs this class to render itself. /// /// It holds data needed to draw a line chart, @@ -66,10 +60,10 @@ class LineChartData extends AxisChartData with EquatableMixin { super.backgroundColor, }) : super( touchData: lineTouchData, - minX: minX ?? (_isTest ? _axisValues(lineBarsData).minX : double.nan), - maxX: maxX ?? (_isTest ? _axisValues(lineBarsData).maxX : double.nan), - minY: minY ?? (_isTest ? _axisValues(lineBarsData).minY : double.nan), - maxY: maxY ?? (_isTest ? _axisValues(lineBarsData).maxY : double.nan), + minX: minX ?? double.nan, + maxX: maxX ?? double.nan, + minY: minY ?? double.nan, + maxY: maxY ?? double.nan, ); /// [LineChart] draws some lines in various shapes and overlaps them. diff --git a/test/chart/bar_chart/bar_chart_painter_test.dart b/test/chart/bar_chart/bar_chart_painter_test.dart index ef7684efb..9695a033c 100644 --- a/test/chart/bar_chart/bar_chart_painter_test.dart +++ b/test/chart/bar_chart/bar_chart_painter_test.dart @@ -1,4 +1,5 @@ import 'package:fl_chart/fl_chart.dart'; +import 'package:fl_chart/src/chart/bar_chart/bar_chart_helper.dart'; import 'package:fl_chart/src/chart/bar_chart/bar_chart_painter.dart'; import 'package:fl_chart/src/chart/base/base_chart/base_chart_painter.dart'; import 'package:fl_chart/src/extensions/bar_chart_data_extension.dart'; @@ -21,27 +22,33 @@ void main() { test('test 1', () { final utilsMainInstance = Utils(); const viewSize = Size(400, 400); + final barGroups = [ + BarChartGroupData( + x: 1, + barRods: [ + BarChartRodData(fromY: 1, toY: 10), + BarChartRodData(fromY: 2, toY: 10), + ], + showingTooltipIndicators: [ + 1, + 2, + ], + ), + BarChartGroupData( + x: 2, + barRods: [ + BarChartRodData(fromY: 3, toY: 10), + BarChartRodData(fromY: 4, toY: 10), + ], + ), + ]; + + final axisValues = BarChartHelper().calculateMaxAxisValues(barGroups); + final data = BarChartData( - barGroups: [ - BarChartGroupData( - x: 1, - barRods: [ - BarChartRodData(fromY: 1, toY: 10), - BarChartRodData(fromY: 2, toY: 10), - ], - showingTooltipIndicators: [ - 1, - 2, - ], - ), - BarChartGroupData( - x: 2, - barRods: [ - BarChartRodData(fromY: 3, toY: 10), - BarChartRodData(fromY: 4, toY: 10), - ], - ), - ], + barGroups: barGroups, + minY: axisValues.minY, + maxY: axisValues.maxY, ); final barChartPainter = BarChartPainter(); @@ -340,11 +347,15 @@ void main() { ), ]; + final axisValues = BarChartHelper().calculateMaxAxisValues(barGroups); + final data = BarChartData( titlesData: const FlTitlesData(show: false), groupsSpace: 10, barGroups: barGroups, alignment: BarChartAlignment.center, + minY: axisValues.minY, + maxY: axisValues.maxY, ); final barChartPainter = BarChartPainter(); @@ -601,11 +612,15 @@ void main() { ), ]; + final axisValues = BarChartHelper().calculateMaxAxisValues(barGroups); + final data = BarChartData( titlesData: const FlTitlesData(show: false), groupsSpace: 10, barGroups: barGroups, alignment: BarChartAlignment.center, + minY: axisValues.minY, + maxY: axisValues.maxY, ); final barChartPainter = BarChartPainter(); @@ -833,7 +848,13 @@ void main() { ), ]; - final data = BarChartData(barGroups: barGroups); + final axisValues = BarChartHelper().calculateMaxAxisValues(barGroups); + + final data = BarChartData( + barGroups: barGroups, + minY: axisValues.minY, + maxY: axisValues.maxY, + ); final barChartPainter = BarChartPainter(); final holder = @@ -932,7 +953,13 @@ void main() { ), ]; - final data = BarChartData(barGroups: barGroups); + final axisValues = BarChartHelper().calculateMaxAxisValues(barGroups); + + final data = BarChartData( + barGroups: barGroups, + minY: axisValues.minY, + maxY: axisValues.maxY, + ); final barChartPainter = BarChartPainter(); final holder = @@ -1081,6 +1108,8 @@ void main() { }, ); + final axisValues = BarChartHelper().calculateMaxAxisValues(barGroups); + final data = BarChartData( groupsSpace: 10, barGroups: barGroups, @@ -1088,6 +1117,8 @@ void main() { touchTooltipData: tooltipData, ), alignment: BarChartAlignment.center, + minY: axisValues.minY, + maxY: axisValues.maxY, ); final barChartPainter = BarChartPainter(); @@ -1277,6 +1308,8 @@ void main() { }, ); + final axisValues = BarChartHelper().calculateMaxAxisValues(barGroups); + final data = BarChartData( groupsSpace: 10, barGroups: barGroups, @@ -1284,6 +1317,8 @@ void main() { touchTooltipData: tooltipData, ), alignment: BarChartAlignment.center, + minY: axisValues.minY, + maxY: axisValues.maxY, ); final barChartPainter = BarChartPainter(); @@ -1447,6 +1482,9 @@ void main() { ); }, ); + + final axisValues = BarChartHelper().calculateMaxAxisValues(barGroups); + final data = BarChartData( groupsSpace: 10, barGroups: barGroups, @@ -1454,6 +1492,8 @@ void main() { touchTooltipData: tooltipData, ), alignment: BarChartAlignment.center, + minY: axisValues.minY, + maxY: axisValues.maxY, ); final barChartPainter = BarChartPainter(); @@ -1574,10 +1614,14 @@ void main() { BarChartGroupData(x: 0, barRods: [barRod], barsSpace: 5), ]; + final axisValues = BarChartHelper().calculateMaxAxisValues(barGroups); + final data = BarChartData( groupsSpace: 10, barGroups: barGroups, barTouchData: BarTouchData(), + minY: axisValues.minY, + maxY: axisValues.maxY, ); final barChartPainter = BarChartPainter(); @@ -1748,6 +1792,8 @@ void main() { ), ]; + final axisValues = BarChartHelper().calculateMaxAxisValues(barGroups); + final data = BarChartData( barGroups: barGroups, titlesData: const FlTitlesData(show: false), @@ -1757,6 +1803,8 @@ void main() { handleBuiltInTouches: true, touchExtraThreshold: const EdgeInsets.all(1), ), + minY: axisValues.minY, + maxY: axisValues.maxY, ); final painter = BarChartPainter(); @@ -1847,6 +1895,8 @@ void main() { ), ]; + final axisValues = BarChartHelper().calculateMaxAxisValues(barGroups); + final data = BarChartData( barGroups: barGroups, titlesData: const FlTitlesData(show: false), @@ -1856,6 +1906,8 @@ void main() { handleBuiltInTouches: true, touchExtraThreshold: const EdgeInsets.all(1), ), + minY: axisValues.minY, + maxY: axisValues.maxY, ); final painter = BarChartPainter(); @@ -2079,27 +2131,34 @@ void main() { test('bar chart should not paint vertical lines', () { final utilsMainInstance = Utils(); const viewSize = Size(400, 400); + + final barGroups = [ + BarChartGroupData( + x: 1, + barRods: [ + BarChartRodData(fromY: 1, toY: 10), + BarChartRodData(fromY: 2, toY: 10), + ], + showingTooltipIndicators: [ + 1, + 2, + ], + ), + BarChartGroupData( + x: 2, + barRods: [ + BarChartRodData(fromY: 3, toY: 10), + BarChartRodData(fromY: 4, toY: 10), + ], + ), + ]; + + final axisValues = BarChartHelper().calculateMaxAxisValues(barGroups); + final data = BarChartData( - barGroups: [ - BarChartGroupData( - x: 1, - barRods: [ - BarChartRodData(fromY: 1, toY: 10), - BarChartRodData(fromY: 2, toY: 10), - ], - showingTooltipIndicators: [ - 1, - 2, - ], - ), - BarChartGroupData( - x: 2, - barRods: [ - BarChartRodData(fromY: 3, toY: 10), - BarChartRodData(fromY: 4, toY: 10), - ], - ), - ], + minY: axisValues.minY, + maxY: axisValues.maxY, + barGroups: barGroups, extraLinesData: ExtraLinesData( verticalLines: [verticalLine1], ), @@ -2268,27 +2327,34 @@ void main() { ); final utilsMainInstance = Utils(); const viewSize = Size(400, 400); + + final barGroups = [ + BarChartGroupData( + x: 1, + barRods: [ + BarChartRodData(fromY: 1, toY: 10), + BarChartRodData(fromY: 2, toY: 10), + ], + showingTooltipIndicators: [ + 1, + 2, + ], + ), + BarChartGroupData( + x: 2, + barRods: [ + BarChartRodData(fromY: 3, toY: 10), + BarChartRodData(fromY: 4, toY: 10), + ], + ), + ]; + + final axisValues = BarChartHelper().calculateMaxAxisValues(barGroups); + final data = BarChartData( - barGroups: [ - BarChartGroupData( - x: 1, - barRods: [ - BarChartRodData(fromY: 1, toY: 10), - BarChartRodData(fromY: 2, toY: 10), - ], - showingTooltipIndicators: [ - 1, - 2, - ], - ), - BarChartGroupData( - x: 2, - barRods: [ - BarChartRodData(fromY: 3, toY: 10), - BarChartRodData(fromY: 4, toY: 10), - ], - ), - ], + minY: axisValues.minY, + maxY: axisValues.maxY, + barGroups: barGroups, extraLinesData: ExtraLinesData( horizontalLines: [horizontalLine, horizontalLine1], ), diff --git a/test/chart/base/axis_chart/side_titles/side_titles_widget_test.dart b/test/chart/base/axis_chart/side_titles/side_titles_widget_test.dart index 1ebb87b5d..f55d1ef16 100644 --- a/test/chart/base/axis_chart/side_titles/side_titles_widget_test.dart +++ b/test/chart/base/axis_chart/side_titles/side_titles_widget_test.dart @@ -1,4 +1,5 @@ import 'package:fl_chart/fl_chart.dart'; +import 'package:fl_chart/src/chart/bar_chart/bar_chart_helper.dart'; import 'package:fl_chart/src/chart/base/axis_chart/side_titles/side_titles_widget.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -146,8 +147,8 @@ void main() { ), ); - final barChartDataWithOnlyRightTitles = BarChartData( - barGroups: [ + BarChartData createBarChartDataWithOnlyRightTitles() { + final barGroups = [ BarChartGroupData( x: 0, barRods: [ @@ -166,52 +167,67 @@ void main() { BarChartRodData(toY: 10), ], ), - ], - titlesData: FlTitlesData( - leftTitles: const AxisTitles(), - topTitles: const AxisTitles(), - rightTitles: AxisTitles( - axisNameWidget: const Icon(Icons.arrow_right), - sideTitles: SideTitles( - showTitles: true, - interval: 1, - getTitlesWidget: (value, meta) { - return TextButton( - onPressed: () {}, - child: Text( - value.toInt().toString(), - ), - ); - }, + ]; + + final axisValues = BarChartHelper().calculateMaxAxisValues(barGroups); + + return BarChartData( + barGroups: barGroups, + titlesData: FlTitlesData( + leftTitles: const AxisTitles(), + topTitles: const AxisTitles(), + rightTitles: AxisTitles( + axisNameWidget: const Icon(Icons.arrow_right), + sideTitles: SideTitles( + showTitles: true, + interval: 1, + getTitlesWidget: (value, meta) { + return TextButton( + onPressed: () {}, + child: Text( + value.toInt().toString(), + ), + ); + }, + ), ), + bottomTitles: const AxisTitles(), ), - bottomTitles: const AxisTitles(), - ), - ); + minY: axisValues.minY, + maxY: axisValues.maxY, + ); + } - final barChartDataWithEmptyGroups = BarChartData( - barGroups: [], - titlesData: FlTitlesData( - leftTitles: const AxisTitles(), - topTitles: const AxisTitles(), - rightTitles: AxisTitles( - axisNameWidget: const Icon(Icons.arrow_right), - sideTitles: SideTitles( - showTitles: true, - interval: 1, - getTitlesWidget: (value, meta) { - return TextButton( - onPressed: () {}, - child: Text( - value.toInt().toString(), - ), - ); - }, + BarChartData createBarChartDataWithEmptyGroups() { + final barGroups = []; + final axisValues = BarChartHelper().calculateMaxAxisValues(barGroups); + + return BarChartData( + barGroups: [], + titlesData: FlTitlesData( + leftTitles: const AxisTitles(), + topTitles: const AxisTitles(), + rightTitles: AxisTitles( + axisNameWidget: const Icon(Icons.arrow_right), + sideTitles: SideTitles( + showTitles: true, + interval: 1, + getTitlesWidget: (value, meta) { + return TextButton( + onPressed: () {}, + child: Text( + value.toInt().toString(), + ), + ); + }, + ), ), + bottomTitles: const AxisTitles(), ), - bottomTitles: const AxisTitles(), - ), - ); + minY: axisValues.minY, + maxY: axisValues.maxY, + ); + } testWidgets( 'LineChart with no titles', @@ -377,7 +393,7 @@ void main() { height: viewSize.height, child: SideTitlesWidget( side: AxisSide.right, - axisChartData: barChartDataWithOnlyRightTitles, + axisChartData: createBarChartDataWithOnlyRightTitles(), parentSize: viewSize, ), ), @@ -406,7 +422,7 @@ void main() { height: viewSize.height, child: SideTitlesWidget( side: AxisSide.right, - axisChartData: barChartDataWithEmptyGroups, + axisChartData: createBarChartDataWithEmptyGroups(), parentSize: viewSize, ), ), diff --git a/test/chart/line_chart/line_chart_painter_test.dart b/test/chart/line_chart/line_chart_painter_test.dart index e9477e822..8f3b4f759 100644 --- a/test/chart/line_chart/line_chart_painter_test.dart +++ b/test/chart/line_chart/line_chart_painter_test.dart @@ -4,6 +4,7 @@ import 'dart:ui' as ui show Gradient; import 'package:fl_chart/fl_chart.dart'; import 'package:fl_chart/src/chart/base/base_chart/base_chart_painter.dart'; +import 'package:fl_chart/src/chart/line_chart/line_chart_helper.dart'; import 'package:fl_chart/src/chart/line_chart/line_chart_painter.dart'; import 'package:fl_chart/src/extensions/path_extension.dart'; import 'package:fl_chart/src/utils/canvas_wrapper.dart'; @@ -45,11 +46,18 @@ void main() { FlSpot(4, 0), ], ); + + final lineChartBarsData = [bar1, bar2]; + final axisValues = LineChartHelper().calculateMaxAxisValues( + lineChartBarsData, + ); + final data = LineChartData( - lineBarsData: [ - bar1, - bar2, - ], + minX: axisValues.minX, + maxX: axisValues.maxX, + minY: axisValues.minY, + maxY: axisValues.maxY, + lineBarsData: lineChartBarsData, clipData: const FlClipData.all(), extraLinesData: ExtraLinesData( horizontalLines: [ @@ -137,11 +145,18 @@ void main() { FlSpot(4, 3), ], ); + + final lineChartBarsData = [bar1, bar2]; + final axisValues = LineChartHelper().calculateMaxAxisValues( + lineChartBarsData, + ); + final data = LineChartData( - lineBarsData: [ - bar1, - bar2, - ], + minX: axisValues.minX, + maxX: axisValues.maxX, + minY: axisValues.minY, + maxY: axisValues.maxY, + lineBarsData: lineChartBarsData, clipData: const FlClipData.all(), lineTouchData: LineTouchData( getTouchedSpotIndicator: From 09d19445d6be682ea51a762476996385befc6985 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Sat, 10 Feb 2024 12:58:24 +0100 Subject: [PATCH 109/149] Update README.md --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b9411880..b175315be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## 0.66.2 +* **BUGFIX** (by @stwarwas) Remove dart.io to fix web platform issue, #1577 + ## 0.66.1 * **BUGFIX** (by @imaNNeo) Fix PieChart blackout issue, #1538 * **BUGFIX** (by @imaNNeo) Fix memory leak in LineChart and BarChart, #1106 From 5a01893b27b8e9f64146af74790cf28e245eb7fb Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Sat, 10 Feb 2024 12:58:41 +0100 Subject: [PATCH 110/149] Bump version to 0.66.2 --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 0a277c199..ec542a720 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: fl_chart description: A highly customizable Flutter chart library that supports Line Chart, Bar Chart, Pie Chart, Scatter Chart, and Radar Chart. -version: 0.66.1 +version: 0.66.2 homepage: https://flchart.dev/ repository: https://github.com/imaNNeo/fl_chart issue_tracker: https://github.com/imaNNeo/fl_chart/issues From fb7cf1b3df865bc0100dc1152574cc4116449fc3 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Sun, 3 Mar 2024 14:31:27 +0100 Subject: [PATCH 111/149] Add sponsors section --- README.md | 36 +++++++++++++++++++- repo_files/sponsors/become_a_hero_dark.png | Bin 0 -> 14730 bytes repo_files/sponsors/become_a_hero_empty.png | Bin 0 -> 575 bytes repo_files/sponsors/become_a_hero_light.png | Bin 0 -> 15398 bytes 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 repo_files/sponsors/become_a_hero_dark.png create mode 100644 repo_files/sponsors/become_a_hero_empty.png create mode 100644 repo_files/sponsors/become_a_hero_light.png diff --git a/README.md b/README.md index 2fa2f6fff..fe219a7d2 100644 --- a/README.md +++ b/README.md @@ -11,11 +11,45 @@ Buy Me A Coffee donate button +### Our Financial Heroes +Your financial support acts as fuel for fl_chart's development. [Support here](https://github.com/sponsors/imaNNeo). + + + + + + + + + +
+ + + + + Become a sponsor + + + + + + + + + + + + + + +
+ ### Overview -📊 FL Chart is a highly customizable Flutter chart library that supports **[Line Chart](https://app.flchart.dev/#/line)**, **[Bar Chart](https://app.flchart.dev/#/bar)**, **[Pie Chart](https://app.flchart.dev/#/pie)**, **[Scatter Chart](https://app.flchart.dev/#/scatter)**, and **[Radar Chart](https://app.flchart.dev/#/radar)**. +FL Chart is a highly customizable Flutter chart library that supports **[Line Chart](https://app.flchart.dev/#/line)**, **[Bar Chart](https://app.flchart.dev/#/bar)**, **[Pie Chart](https://app.flchart.dev/#/pie)**, **[Scatter Chart](https://app.flchart.dev/#/scatter)**, and **[Radar Chart](https://app.flchart.dev/#/radar)**.

+ ### Chart Types |LineChart |BarChart |PieChart | diff --git a/repo_files/sponsors/become_a_hero_dark.png b/repo_files/sponsors/become_a_hero_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..350da0e9f66b2c5b5aeb4092fc773d5de0d837dc GIT binary patch literal 14730 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 G4E!Gmw;fXe literal 0 HcmV?d00001 diff --git a/repo_files/sponsors/become_a_hero_empty.png b/repo_files/sponsors/become_a_hero_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..39d902195095ee812b8dc500568bbfc979e741a8 GIT binary patch literal 575 zcmeAS@N?(olHy`uVBq!ia0y~yV0-{%f8byPk~d1X?*dYs1s;*b3=G`DAk4@xYmNj^ zkg+((-HBn{IhmJ04okYDuOkD)#(wTUiL5}mE1oWnAr*{o4=^$UWt$ZKug~)c0J28G ckPU$k*_@FKjGf|Fyg**?boFyt=akR{03z=oEdT%j literal 0 HcmV?d00001 diff --git a/repo_files/sponsors/become_a_hero_light.png b/repo_files/sponsors/become_a_hero_light.png new file mode 100644 index 0000000000000000000000000000000000000000..6544cb5fd155071341ea586a5803db4485b088fd GIT binary patch literal 15398 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 literal 0 HcmV?d00001 From 16d92d7ae39da80401d0612a588da8a2bb5bfddb Mon Sep 17 00:00:00 2001 From: Julien <120588494+julien4215@users.noreply.github.com> Date: Sun, 4 Feb 2024 11:08:10 +0100 Subject: [PATCH 112/149] add the option to display the text vertically for a FLineLabel --- .../samples/line/line_chart_sample8.dart | 5 +- .../base/axis_chart/axis_chart_data.dart | 57 +++++++------- .../base/axis_chart/axis_chart_painter.dart | 74 +++++++++++++------ lib/src/chart/line_chart/line_chart_data.dart | 8 ++ lib/src/utils/canvas_wrapper.dart | 12 +++ repo_files/documentations/base_chart.md | 2 + test/chart/data_pool.dart | 3 - 7 files changed, 102 insertions(+), 59 deletions(-) diff --git a/example/lib/presentation/samples/line/line_chart_sample8.dart b/example/lib/presentation/samples/line/line_chart_sample8.dart index 75b629a1c..63974a01d 100644 --- a/example/lib/presentation/samples/line/line_chart_sample8.dart +++ b/example/lib/presentation/samples/line/line_chart_sample8.dart @@ -167,12 +167,13 @@ class _LineChartSample8State extends State { dashArray: [5, 10], label: VerticalLineLabel( show: true, - alignment: Alignment.topRight, - padding: const EdgeInsets.only(left: 10, top: 5), + alignment: Alignment.bottomRight, + padding: const EdgeInsets.only(left: 5, bottom: 5), style: const TextStyle( fontSize: 9, fontWeight: FontWeight.bold, ), + direction: LabelDirection.vertical, labelResolver: (line) => 'V: ${line.x}', ), ), diff --git a/lib/src/chart/base/axis_chart/axis_chart_data.dart b/lib/src/chart/base/axis_chart/axis_chart_data.dart index a5cddae35..c83738264 100644 --- a/lib/src/chart/base/axis_chart/axis_chart_data.dart +++ b/lib/src/chart/base/axis_chart/axis_chart_data.dart @@ -1120,19 +1120,16 @@ class HorizontalLineLabel extends FlLineLabel with EquatableMixin { /// size, ... of the text. /// Drawing text will retrieve through [labelResolver], /// you can override it with your custom data. - /// /// [show] determines showing label or not. + /// [show] determines showing label or not. + /// [direction] determines if the direction of the text should be horizontal or vertical. HorizontalLineLabel({ - EdgeInsets? padding, + super.padding = const EdgeInsets.all(6), super.style, - Alignment? alignment, + super.alignment = Alignment.topLeft, super.show = false, - String Function(HorizontalLine)? labelResolver, - }) : labelResolver = - labelResolver ?? HorizontalLineLabel.defaultLineLabelResolver, - super( - padding: padding ?? const EdgeInsets.all(6), - alignment: alignment ?? Alignment.topLeft, - ); + super.direction = LabelDirection.horizontal, + this.labelResolver = HorizontalLineLabel.defaultLineLabelResolver, + }); /// Resolves a label for showing. final String Function(HorizontalLine) labelResolver; @@ -1149,9 +1146,9 @@ class HorizontalLineLabel extends FlLineLabel with EquatableMixin { ) { return HorizontalLineLabel( padding: - EdgeInsets.lerp(a.padding as EdgeInsets, b.padding as EdgeInsets, t), + EdgeInsets.lerp(a.padding as EdgeInsets, b.padding as EdgeInsets, t)!, style: TextStyle.lerp(a.style, b.style, t), - alignment: Alignment.lerp(a.alignment, b.alignment, t), + alignment: Alignment.lerp(a.alignment, b.alignment, t)!, labelResolver: b.labelResolver, show: b.show, ); @@ -1165,6 +1162,7 @@ class HorizontalLineLabel extends FlLineLabel with EquatableMixin { padding, style, alignment, + direction, ]; } @@ -1176,25 +1174,19 @@ class VerticalLineLabel extends FlLineLabel with EquatableMixin { /// Drawing text will retrieve through [labelResolver], /// you can override it with your custom data. /// [show] determines showing label or not. + /// [direction] determines if the direction of the text should be horizontal or vertical. VerticalLineLabel({ - EdgeInsets? padding, - TextStyle? style, - Alignment? alignment, - bool? show, - String Function(VerticalLine)? labelResolver, - }) : labelResolver = - labelResolver ?? VerticalLineLabel.defaultLineLabelResolver, - super( - show: show ?? false, - padding: padding ?? const EdgeInsets.all(6), - style: style ?? - const TextStyle( - color: Colors.black, - fontWeight: FontWeight.bold, - fontSize: 14, - ), - alignment: alignment ?? Alignment.bottomRight, - ); + super.padding = const EdgeInsets.all(6), + super.style = const TextStyle( + color: Colors.black, + fontWeight: FontWeight.bold, + fontSize: 14, + ), + super.alignment = Alignment.bottomRight, + super.show = false, + super.direction = LabelDirection.horizontal, + this.labelResolver = VerticalLineLabel.defaultLineLabelResolver, + }); /// Resolves a label for showing. final String Function(VerticalLine) labelResolver; @@ -1211,9 +1203,9 @@ class VerticalLineLabel extends FlLineLabel with EquatableMixin { ) { return VerticalLineLabel( padding: - EdgeInsets.lerp(a.padding as EdgeInsets, b.padding as EdgeInsets, t), + EdgeInsets.lerp(a.padding as EdgeInsets, b.padding as EdgeInsets, t)!, style: TextStyle.lerp(a.style, b.style, t), - alignment: Alignment.lerp(a.alignment, b.alignment, t), + alignment: Alignment.lerp(a.alignment, b.alignment, t)!, labelResolver: b.labelResolver, show: b.show, ); @@ -1227,6 +1219,7 @@ class VerticalLineLabel extends FlLineLabel with EquatableMixin { padding, style, alignment, + direction, ]; } diff --git a/lib/src/chart/base/axis_chart/axis_chart_painter.dart b/lib/src/chart/base/axis_chart/axis_chart_painter.dart index 833b7ee91..3983677ba 100644 --- a/lib/src/chart/base/axis_chart/axis_chart_painter.dart +++ b/lib/src/chart/base/axis_chart/axis_chart_painter.dart @@ -305,17 +305,32 @@ abstract class AxisChartPainter // ignore: cascade_invocations tp.layout(); - canvasWrapper.drawText( - tp, - label.alignment.withinRect( - Rect.fromLTRB( - from.dx + padding.left, - from.dy - padding.bottom - tp.height, - to.dx - padding.right - tp.width, - to.dy + padding.top, - ), - ), - ); + switch (label.direction) { + case LabelDirection.horizontal: + canvasWrapper.drawText( + tp, + label.alignment.withinRect( + Rect.fromLTRB( + from.dx + padding.left, + from.dy - padding.bottom - tp.height, + to.dx - padding.right - tp.width, + to.dy + padding.top, + ), + ), + ); + case LabelDirection.vertical: + canvasWrapper.drawVerticalText( + tp, + label.alignment.withinRect( + Rect.fromLTRB( + from.dx + padding.left, + from.dy - padding.bottom - tp.width, + to.dx - padding.right, + to.dy + padding.top, + ), + ), + ); + } } } } @@ -398,17 +413,32 @@ abstract class AxisChartPainter // ignore: cascade_invocations tp.layout(); - canvasWrapper.drawText( - tp, - label.alignment.withinRect( - Rect.fromLTRB( - to.dx - padding.right - tp.width, - from.dy + padding.top, - from.dx + padding.left, - to.dy - padding.bottom, - ), - ), - ); + switch (label.direction) { + case LabelDirection.horizontal: + canvasWrapper.drawText( + tp, + label.alignment.withinRect( + Rect.fromLTRB( + to.dx - padding.right - tp.width, + from.dy + padding.top, + from.dx + padding.left, + to.dy - padding.bottom, + ), + ), + ); + case LabelDirection.vertical: + canvasWrapper.drawVerticalText( + tp, + label.alignment.withinRect( + Rect.fromLTRB( + to.dx - padding.right, + from.dy + padding.top, + from.dx + padding.left + tp.height, + to.dy - padding.bottom - tp.width, + ), + ), + ); + } } } } diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index b09a1b029..fee025f22 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -802,17 +802,21 @@ bool showAllDots(FlSpot spot, LineChartBarData barData) { return true; } +enum LabelDirection { horizontal, vertical } + /// Shows a text label abstract class FlLineLabel with EquatableMixin { /// Draws a title on the line, align it with [alignment] over the line, /// applies [padding] for spaces, and applies [style] for changing color, /// size, ... of the text. /// [show] determines showing label or not. + /// [direction] determines if the direction of the text should be horizontal or vertical. const FlLineLabel({ required this.show, required this.padding, required this.style, required this.alignment, + required this.direction, }); /// Determines showing label or not. @@ -827,6 +831,9 @@ abstract class FlLineLabel with EquatableMixin { /// Aligns the text on the line. final Alignment alignment; + /// Determines the direction of the text. + final LabelDirection direction; + /// Used for equality check, see [EquatableMixin]. @override List get props => [ @@ -834,6 +841,7 @@ abstract class FlLineLabel with EquatableMixin { padding, style, alignment, + direction, ]; } diff --git a/lib/src/utils/canvas_wrapper.dart b/lib/src/utils/canvas_wrapper.dart index c2ced6f50..a38e83f07 100644 --- a/lib/src/utils/canvas_wrapper.dart +++ b/lib/src/utils/canvas_wrapper.dart @@ -98,6 +98,18 @@ class CanvasWrapper { } } + /// Paints a vertical text on the [Canvas] + /// + /// Gets a [TextPainter] and call its [TextPainter.paint] using our canvas + void drawVerticalText(TextPainter tp, Offset offset) { + save(); + translate(offset.dx, offset.dy); + rotate(Utils().radians(90)); + translate(-offset.dx, -offset.dy); + tp.paint(canvas, offset); + restore(); + } + /// Paints a dot using customized [FlDotPainter] /// /// Paints a customized dot using [FlDotPainter] at the [spot]'s position, diff --git a/repo_files/documentations/base_chart.md b/repo_files/documentations/base_chart.md index 5f9f95361..7f40ca0d0 100644 --- a/repo_files/documentations/base_chart.md +++ b/repo_files/documentations/base_chart.md @@ -168,6 +168,7 @@ Base class for all supported touch/pointer events. |padding|[EdgeInsets](https://api.flutter.dev/flutter/painting/EdgeInsets-class.html) object with label padding configuration|EdgeInsets.zero| |style|[TextStyle](https://api.flutter.dev/flutter/dart-ui/TextStyle-class.html) which determines label text style|TextStyle(fontSize: 11, color: line.color)| |alignment|[Alignment](https://api.flutter.dev/flutter/painting/Alignment-class.html) with label position relative to line|Alignment.topLeft| +|direction|Direction of the text (horizontal or vertical)|LabelDirection.horizontal| |labelResolver|Getter function returning label title|defaultLineLabelResolver| ### VerticalLineLabel @@ -177,6 +178,7 @@ Base class for all supported touch/pointer events. |padding|[EdgeInsets](https://api.flutter.dev/flutter/painting/EdgeInsets-class.html) object with label padding configuration|EdgeInsets.zero| |style|[TextStyle](https://api.flutter.dev/flutter/dart-ui/TextStyle-class.html) which determines label text style|TextStyle(fontSize: 11, color: line.color)| |alignment|[Alignment](https://api.flutter.dev/flutter/painting/Alignment-class.html) with label position relative to line|Alignment.topLeft| +|direction|Direction of the text (horizontal or vertical)|LabelDirection.horizontal| |labelResolver|Getter function returning label title|defaultLineLabelResolver| ### FLHorizontalAlignment diff --git a/test/chart/data_pool.dart b/test/chart/data_pool.dart index d60bef0fa..591f2cdbe 100644 --- a/test/chart/data_pool.dart +++ b/test/chart/data_pool.dart @@ -1414,7 +1414,6 @@ final VerticalLineLabel verticalLineLabel1Clone = VerticalLineLabel( padding: const EdgeInsets.all(12), ); final VerticalLineLabel verticalLineLabel2 = VerticalLineLabel( - show: false, style: const TextStyle(color: Colors.green), labelResolver: verticalLabelResolver, alignment: Alignment.topCenter, @@ -1436,7 +1435,6 @@ final VerticalLineLabel verticalLineLabel5 = VerticalLineLabel( show: true, style: const TextStyle(color: Colors.green), labelResolver: verticalLabelResolver, - alignment: Alignment.bottomRight, padding: const EdgeInsets.all(12), ); final VerticalLineLabel verticalLineLabel6 = VerticalLineLabel( @@ -1447,7 +1445,6 @@ final VerticalLineLabel verticalLineLabel6 = VerticalLineLabel( padding: const EdgeInsets.all(44), ); final VerticalLineLabel verticalLineLabel7 = VerticalLineLabel( - show: false, style: const TextStyle(color: Colors.green), labelResolver: verticalLabelResolver, alignment: Alignment.topCenter, From 9c28a8a372222bbcebb4a7cba61d0da5fdbbf4ec Mon Sep 17 00:00:00 2001 From: Julien <120588494+julien4215@users.noreply.github.com> Date: Sat, 10 Feb 2024 13:51:16 +0100 Subject: [PATCH 113/149] edit changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b175315be..ef7aa32d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## newVersion +* **FEATURE** (by @julien4215 ) Add direction property to the [HorizontalLineLabel](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#horizontallinelabel) and [VerticalLineLabel](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#verticallinelabel), #1579 + ## 0.66.2 * **BUGFIX** (by @stwarwas) Remove dart.io to fix web platform issue, #1577 From dbaa832e0bedf243cb7a41707a1079a93b8aa10e Mon Sep 17 00:00:00 2001 From: Julien <120588494+julien4215@users.noreply.github.com> Date: Sun, 4 Feb 2024 13:10:43 +0100 Subject: [PATCH 114/149] edit test for coverage --- test/chart/data_pool.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/chart/data_pool.dart b/test/chart/data_pool.dart index 591f2cdbe..b684a8bc1 100644 --- a/test/chart/data_pool.dart +++ b/test/chart/data_pool.dart @@ -1397,6 +1397,7 @@ final HorizontalLineLabel horizontalLineLabel7 = HorizontalLineLabel( labelResolver: horizontalLabelResolver, alignment: Alignment.topCenter, padding: const EdgeInsets.all(12), + direction: LabelDirection.vertical, ); final VerticalLineLabel verticalLineLabel1 = VerticalLineLabel( @@ -1449,6 +1450,7 @@ final VerticalLineLabel verticalLineLabel7 = VerticalLineLabel( labelResolver: verticalLabelResolver, alignment: Alignment.topCenter, padding: const EdgeInsets.all(12), + direction: LabelDirection.vertical, ); final HorizontalLine horizontalLine1 = HorizontalLine( From 288852a3dfec8ebffc11f985abb2fa637b9e8c56 Mon Sep 17 00:00:00 2001 From: Julien <120588494+julien4215@users.noreply.github.com> Date: Fri, 9 Feb 2024 11:07:52 +0100 Subject: [PATCH 115/149] WIP test --- .../bar_chart_painter_test.mocks.dart | 18 ++++- .../bar_chart_renderer_test.mocks.dart | 2 +- test/chart/data_pool.dart | 6 ++ .../line_chart/line_chart_painter_test.dart | 73 +++++++++++++++++++ .../line_chart_painter_test.mocks.dart | 18 ++++- .../line_chart_renderer_test.mocks.dart | 2 +- .../pie_chart_painter_test.mocks.dart | 18 ++++- .../pie_chart_renderer_test.mocks.dart | 2 +- .../radar_chart_painter_test.mocks.dart | 18 ++++- .../radar_chart_renderer_test.mocks.dart | 2 +- .../scatter_chart_painter_test.mocks.dart | 18 ++++- .../scatter_chart_renderer_test.mocks.dart | 2 +- test/utils/canvas_wrapper_test.dart | 26 +++++++ test/utils/canvas_wrapper_test.mocks.dart | 2 +- test/utils/utils_test.mocks.dart | 2 +- 15 files changed, 197 insertions(+), 12 deletions(-) diff --git a/test/chart/bar_chart/bar_chart_painter_test.mocks.dart b/test/chart/bar_chart/bar_chart_painter_test.mocks.dart index 7955d4248..c70a981ee 100644 --- a/test/chart/bar_chart/bar_chart_painter_test.mocks.dart +++ b/test/chart/bar_chart/bar_chart_painter_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in fl_chart/test/chart/bar_chart/bar_chart_painter_test.dart. // Do not manually edit this file. @@ -996,6 +996,22 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { returnValueForMissingStub: null, ); + @override + void drawVerticalText( + _i3.TextPainter? tp, + _i2.Offset? offset, + ) => + super.noSuchMethod( + Invocation.method( + #drawVerticalText, + [ + tp, + offset, + ], + ), + returnValueForMissingStub: null, + ); + @override void drawDot( _i7.FlDotPainter? painter, diff --git a/test/chart/bar_chart/bar_chart_renderer_test.mocks.dart b/test/chart/bar_chart/bar_chart_renderer_test.mocks.dart index 363495b21..7e43d8ba3 100644 --- a/test/chart/bar_chart/bar_chart_renderer_test.mocks.dart +++ b/test/chart/bar_chart/bar_chart_renderer_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in fl_chart/test/chart/bar_chart/bar_chart_renderer_test.dart. // Do not manually edit this file. diff --git a/test/chart/data_pool.dart b/test/chart/data_pool.dart index b684a8bc1..0a35d5381 100644 --- a/test/chart/data_pool.dart +++ b/test/chart/data_pool.dart @@ -91,6 +91,10 @@ class MockData { static const size2 = Size(22, 22); static final textPainter1 = TextPainter(); + static final textPainter2 = TextPainter() + ..text = const TextSpan(text: 'test') + ..textDirection = TextDirection.ltr + ..layout(); static final rect1 = Rect.fromCenter(center: offset1, width: 11, height: 11); static final rect2 = Rect.fromCenter(center: offset2, width: 22, height: 22); @@ -1352,6 +1356,7 @@ final HorizontalLineLabel horizontalLineLabel1 = HorizontalLineLabel( labelResolver: horizontalLabelResolver, alignment: Alignment.topCenter, padding: const EdgeInsets.all(12), + direction: LabelDirection.vertical, ); final HorizontalLineLabel horizontalLineLabel1Clone = HorizontalLineLabel( show: true, @@ -1359,6 +1364,7 @@ final HorizontalLineLabel horizontalLineLabel1Clone = HorizontalLineLabel( labelResolver: horizontalLabelResolver, alignment: Alignment.topCenter, padding: const EdgeInsets.all(12), + direction: LabelDirection.vertical, ); final HorizontalLineLabel horizontalLineLabel2 = HorizontalLineLabel( style: const TextStyle(color: Colors.green), diff --git a/test/chart/line_chart/line_chart_painter_test.dart b/test/chart/line_chart/line_chart_painter_test.dart index 8f3b4f759..8f5eb3e34 100644 --- a/test/chart/line_chart/line_chart_painter_test.dart +++ b/test/chart/line_chart/line_chart_painter_test.dart @@ -2291,6 +2291,79 @@ void main() { ), ); }); + + test('test lines label', () { + const viewSize = Size(100, 100); + + String horizontalLabelResolver(HorizontalLine line) { + return 'test'; + } + + String verticalLabelResolver(VerticalLine line) { + return 'test'; + } + + final data = LineChartData( + minY: 0, + maxY: 10, + minX: 0, + maxX: 10, + extraLinesData: ExtraLinesData( + verticalLines: [ + VerticalLine( + x: 3, + label: VerticalLineLabel( + show: true, + labelResolver: verticalLabelResolver, + ), + ), + VerticalLine( + x: 6, + label: VerticalLineLabel( + show: true, + labelResolver: verticalLabelResolver, + direction: LabelDirection.vertical, + ), + ), + ], + horizontalLines: [ + HorizontalLine( + y: 3, + label: HorizontalLineLabel( + show: true, + labelResolver: horizontalLabelResolver, + ), + ), + HorizontalLine( + y: 6, + label: HorizontalLineLabel( + show: true, + labelResolver: horizontalLabelResolver, + direction: LabelDirection.vertical, + ), + ), + ], + ), + ); + + final lineChartPainter = LineChartPainter(); + final holder = + PaintHolder(data, data, TextScaler.noScaling); + final mockCanvasWrapper = MockCanvasWrapper(); + when(mockCanvasWrapper.size).thenAnswer((realInvocation) => viewSize); + when(mockCanvasWrapper.canvas).thenReturn(MockCanvas()); + + final mockBuildContext = MockBuildContext(); + + lineChartPainter.drawExtraLines( + mockBuildContext, + mockCanvasWrapper, + holder, + ); + + verify(mockCanvasWrapper.drawText(any, any)).called(2); + verify(mockCanvasWrapper.drawVerticalText(any, any)).called(2); + }); }); group('drawTouchTooltip()', () { diff --git a/test/chart/line_chart/line_chart_painter_test.mocks.dart b/test/chart/line_chart/line_chart_painter_test.mocks.dart index b30a9a838..a01595352 100644 --- a/test/chart/line_chart/line_chart_painter_test.mocks.dart +++ b/test/chart/line_chart/line_chart_painter_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in fl_chart/test/chart/line_chart/line_chart_painter_test.dart. // Do not manually edit this file. @@ -1009,6 +1009,22 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { returnValueForMissingStub: null, ); + @override + void drawVerticalText( + _i3.TextPainter? tp, + _i2.Offset? offset, + ) => + super.noSuchMethod( + Invocation.method( + #drawVerticalText, + [ + tp, + offset, + ], + ), + returnValueForMissingStub: null, + ); + @override void drawDot( _i7.FlDotPainter? painter, diff --git a/test/chart/line_chart/line_chart_renderer_test.mocks.dart b/test/chart/line_chart/line_chart_renderer_test.mocks.dart index 8996944ba..b3e9c938c 100644 --- a/test/chart/line_chart/line_chart_renderer_test.mocks.dart +++ b/test/chart/line_chart/line_chart_renderer_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in fl_chart/test/chart/line_chart/line_chart_renderer_test.dart. // Do not manually edit this file. diff --git a/test/chart/pie_chart/pie_chart_painter_test.mocks.dart b/test/chart/pie_chart/pie_chart_painter_test.mocks.dart index 14289e27d..4cb06047c 100644 --- a/test/chart/pie_chart/pie_chart_painter_test.mocks.dart +++ b/test/chart/pie_chart/pie_chart_painter_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in fl_chart/test/chart/pie_chart/pie_chart_painter_test.dart. // Do not manually edit this file. @@ -996,6 +996,22 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { returnValueForMissingStub: null, ); + @override + void drawVerticalText( + _i3.TextPainter? tp, + _i2.Offset? offset, + ) => + super.noSuchMethod( + Invocation.method( + #drawVerticalText, + [ + tp, + offset, + ], + ), + returnValueForMissingStub: null, + ); + @override void drawDot( _i7.FlDotPainter? painter, diff --git a/test/chart/pie_chart/pie_chart_renderer_test.mocks.dart b/test/chart/pie_chart/pie_chart_renderer_test.mocks.dart index 98ce2bab9..72aff7d65 100644 --- a/test/chart/pie_chart/pie_chart_renderer_test.mocks.dart +++ b/test/chart/pie_chart/pie_chart_renderer_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in fl_chart/test/chart/pie_chart/pie_chart_renderer_test.dart. // Do not manually edit this file. diff --git a/test/chart/radar_chart/radar_chart_painter_test.mocks.dart b/test/chart/radar_chart/radar_chart_painter_test.mocks.dart index c25bff9ce..a7f89b688 100644 --- a/test/chart/radar_chart/radar_chart_painter_test.mocks.dart +++ b/test/chart/radar_chart/radar_chart_painter_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in fl_chart/test/chart/radar_chart/radar_chart_painter_test.dart. // Do not manually edit this file. @@ -996,6 +996,22 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { returnValueForMissingStub: null, ); + @override + void drawVerticalText( + _i3.TextPainter? tp, + _i2.Offset? offset, + ) => + super.noSuchMethod( + Invocation.method( + #drawVerticalText, + [ + tp, + offset, + ], + ), + returnValueForMissingStub: null, + ); + @override void drawDot( _i7.FlDotPainter? painter, diff --git a/test/chart/radar_chart/radar_chart_renderer_test.mocks.dart b/test/chart/radar_chart/radar_chart_renderer_test.mocks.dart index d5559d87d..d79d0a49d 100644 --- a/test/chart/radar_chart/radar_chart_renderer_test.mocks.dart +++ b/test/chart/radar_chart/radar_chart_renderer_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in fl_chart/test/chart/radar_chart/radar_chart_renderer_test.dart. // Do not manually edit this file. diff --git a/test/chart/scatter_chart/scatter_chart_painter_test.mocks.dart b/test/chart/scatter_chart/scatter_chart_painter_test.mocks.dart index 7ebd21827..f8eca0cb5 100644 --- a/test/chart/scatter_chart/scatter_chart_painter_test.mocks.dart +++ b/test/chart/scatter_chart/scatter_chart_painter_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in fl_chart/test/chart/scatter_chart/scatter_chart_painter_test.dart. // Do not manually edit this file. @@ -996,6 +996,22 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { returnValueForMissingStub: null, ); + @override + void drawVerticalText( + _i3.TextPainter? tp, + _i2.Offset? offset, + ) => + super.noSuchMethod( + Invocation.method( + #drawVerticalText, + [ + tp, + offset, + ], + ), + returnValueForMissingStub: null, + ); + @override void drawDot( _i7.FlDotPainter? painter, diff --git a/test/chart/scatter_chart/scatter_chart_renderer_test.mocks.dart b/test/chart/scatter_chart/scatter_chart_renderer_test.mocks.dart index 79cd9ed5b..d6380b076 100644 --- a/test/chart/scatter_chart/scatter_chart_renderer_test.mocks.dart +++ b/test/chart/scatter_chart/scatter_chart_renderer_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in fl_chart/test/chart/scatter_chart/scatter_chart_renderer_test.dart. // Do not manually edit this file. diff --git a/test/utils/canvas_wrapper_test.dart b/test/utils/canvas_wrapper_test.dart index 6fb155811..6bac98b6f 100644 --- a/test/utils/canvas_wrapper_test.dart +++ b/test/utils/canvas_wrapper_test.dart @@ -3,6 +3,7 @@ import 'dart:ui'; import 'package:fl_chart/src/chart/base/axis_chart/axis_chart_data.dart'; import 'package:fl_chart/src/utils/canvas_wrapper.dart'; import 'package:fl_chart/src/utils/utils.dart'; +import 'package:flutter/painting.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/annotations.dart'; import 'package:mockito/mockito.dart'; @@ -100,6 +101,7 @@ void main() { }); test('test drawRotated', () { + final utilsMainInstance = Utils(); final mockUtils = MockUtils(); when(mockUtils.radians(any)).thenAnswer((realInvocation) => 12); Utils.changeInstance(mockUtils); @@ -122,5 +124,29 @@ void main() { verify(mockCanvas.translate(-122, -122)).called(1); expect(calledCallback, true); verify(mockCanvas.restore()).called(1); + Utils.changeInstance(utilsMainInstance); + }); + + test('test drawText', () { + final tp = MockData.textPainter2; + canvasWrapper.drawText(tp, MockData.offset1); + verify(tp.paint(mockCanvas, MockData.offset1)).called(1); + }); + + test('test drawVerticalText', () { + final tp = MockData.textPainter2; + final mockUtils = MockUtils(); + when(mockUtils.radians(any)).thenAnswer((realInvocation) => 90); + Utils.changeInstance(mockUtils); + + canvasWrapper.drawVerticalText(tp, MockData.offset1); + verify(mockCanvas.save()).called(1); + verify(mockCanvas.translate(MockData.offset1.dx, MockData.offset1.dy)) + .called(1); + verify(mockCanvas.rotate(90)).called(1); + verify(mockCanvas.translate(-MockData.offset1.dx, -MockData.offset1.dy)) + .called(1); + verify(tp.paint(mockCanvas, MockData.offset1)).called(1); + verify(mockCanvas.restore()).called(1); }); } diff --git a/test/utils/canvas_wrapper_test.mocks.dart b/test/utils/canvas_wrapper_test.mocks.dart index e3f4a2964..94bfa1040 100644 --- a/test/utils/canvas_wrapper_test.mocks.dart +++ b/test/utils/canvas_wrapper_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in fl_chart/test/utils/canvas_wrapper_test.dart. // Do not manually edit this file. diff --git a/test/utils/utils_test.mocks.dart b/test/utils/utils_test.mocks.dart index 90fcd8b7a..7f2956778 100644 --- a/test/utils/utils_test.mocks.dart +++ b/test/utils/utils_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in fl_chart/test/utils/utils_test.dart. // Do not manually edit this file. From 1d1e1371a57874de298c29ca8ba7d05b0e663777 Mon Sep 17 00:00:00 2001 From: Julien <120588494+julien4215@users.noreply.github.com> Date: Fri, 9 Feb 2024 15:06:51 +0100 Subject: [PATCH 116/149] end unit tests --- .../line_chart/line_chart_painter_test.dart | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/test/chart/line_chart/line_chart_painter_test.dart b/test/chart/line_chart/line_chart_painter_test.dart index 8f5eb3e34..0a8fff934 100644 --- a/test/chart/line_chart/line_chart_painter_test.dart +++ b/test/chart/line_chart/line_chart_painter_test.dart @@ -2361,8 +2361,20 @@ void main() { holder, ); - verify(mockCanvasWrapper.drawText(any, any)).called(2); - verify(mockCanvasWrapper.drawVerticalText(any, any)).called(2); + final result1 = verify(mockCanvasWrapper.drawText(any, captureAny)) + ..called(2); + final result2 = + verify(mockCanvasWrapper.drawVerticalText(any, captureAny)) + ..called(2); + + final offset1 = result1.captured[0] as Offset; + final offset2 = result1.captured[1] as Offset; + final offset3 = result2.captured[0] as Offset; + final offset4 = result2.captured[1] as Offset; + expect(offset1, const Offset(6, 50)); + expect(offset2, const Offset(36, 94)); + expect(offset3, const Offset(6, -22)); + expect(offset4, const Offset(80, 38)); }); }); From 2c7295bd68007055bf7594edbb2912cb5fcb674f Mon Sep 17 00:00:00 2001 From: Julien <120588494+julien4215@users.noreply.github.com> Date: Fri, 9 Feb 2024 18:10:54 +0100 Subject: [PATCH 117/149] make code more understandable --- lib/src/chart/base/axis_chart/axis_chart_painter.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/src/chart/base/axis_chart/axis_chart_painter.dart b/lib/src/chart/base/axis_chart/axis_chart_painter.dart index 3983677ba..b3b372ae2 100644 --- a/lib/src/chart/base/axis_chart/axis_chart_painter.dart +++ b/lib/src/chart/base/axis_chart/axis_chart_painter.dart @@ -419,9 +419,9 @@ abstract class AxisChartPainter tp, label.alignment.withinRect( Rect.fromLTRB( - to.dx - padding.right - tp.width, + from.dx - padding.right - tp.width, from.dy + padding.top, - from.dx + padding.left, + to.dx + padding.left, to.dy - padding.bottom, ), ), @@ -431,9 +431,9 @@ abstract class AxisChartPainter tp, label.alignment.withinRect( Rect.fromLTRB( - to.dx - padding.right, + from.dx - padding.right, from.dy + padding.top, - from.dx + padding.left + tp.height, + to.dx + padding.left + tp.height, to.dy - padding.bottom - tp.width, ), ), From bf3654445445d5061036dafe8dc3cbbac2abf6e9 Mon Sep 17 00:00:00 2001 From: Julien <120588494+julien4215@users.noreply.github.com> Date: Sat, 10 Feb 2024 15:32:23 +0100 Subject: [PATCH 118/149] fix : label always inside chart --- lib/src/chart/base/axis_chart/axis_chart_painter.dart | 4 ++-- test/chart/line_chart/line_chart_painter_test.dart | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/src/chart/base/axis_chart/axis_chart_painter.dart b/lib/src/chart/base/axis_chart/axis_chart_painter.dart index b3b372ae2..3b0ff7f03 100644 --- a/lib/src/chart/base/axis_chart/axis_chart_painter.dart +++ b/lib/src/chart/base/axis_chart/axis_chart_painter.dart @@ -323,7 +323,7 @@ abstract class AxisChartPainter tp, label.alignment.withinRect( Rect.fromLTRB( - from.dx + padding.left, + from.dx + padding.left + tp.height, from.dy - padding.bottom - tp.width, to.dx - padding.right, to.dy + padding.top, @@ -422,7 +422,7 @@ abstract class AxisChartPainter from.dx - padding.right - tp.width, from.dy + padding.top, to.dx + padding.left, - to.dy - padding.bottom, + to.dy - padding.bottom - tp.height, ), ), ); diff --git a/test/chart/line_chart/line_chart_painter_test.dart b/test/chart/line_chart/line_chart_painter_test.dart index 0a8fff934..45124c29e 100644 --- a/test/chart/line_chart/line_chart_painter_test.dart +++ b/test/chart/line_chart/line_chart_painter_test.dart @@ -2372,8 +2372,8 @@ void main() { final offset3 = result2.captured[0] as Offset; final offset4 = result2.captured[1] as Offset; expect(offset1, const Offset(6, 50)); - expect(offset2, const Offset(36, 94)); - expect(offset3, const Offset(6, -22)); + expect(offset2, const Offset(36, 80)); + expect(offset3, const Offset(20, -22)); expect(offset4, const Offset(80, 38)); }); }); From a540582ccac9b1e6f892a0c4b73583e1d18bd39a Mon Sep 17 00:00:00 2001 From: Julien <120588494+julien4215@users.noreply.github.com> Date: Thu, 29 Feb 2024 01:05:23 +0100 Subject: [PATCH 119/149] add direction in lerp method --- lib/src/chart/base/axis_chart/axis_chart_data.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/src/chart/base/axis_chart/axis_chart_data.dart b/lib/src/chart/base/axis_chart/axis_chart_data.dart index c83738264..8ff0b6743 100644 --- a/lib/src/chart/base/axis_chart/axis_chart_data.dart +++ b/lib/src/chart/base/axis_chart/axis_chart_data.dart @@ -1151,6 +1151,7 @@ class HorizontalLineLabel extends FlLineLabel with EquatableMixin { alignment: Alignment.lerp(a.alignment, b.alignment, t)!, labelResolver: b.labelResolver, show: b.show, + direction: b.direction, ); } @@ -1208,6 +1209,7 @@ class VerticalLineLabel extends FlLineLabel with EquatableMixin { alignment: Alignment.lerp(a.alignment, b.alignment, t)!, labelResolver: b.labelResolver, show: b.show, + direction: b.direction, ); } From 34a6af0fefa9e298dba9304c1f7e1ba30b386f85 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Thu, 28 Mar 2024 23:49:17 +0330 Subject: [PATCH 120/149] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef7aa32d6..15d88a401 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,5 @@ ## newVersion -* **FEATURE** (by @julien4215 ) Add direction property to the [HorizontalLineLabel](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#horizontallinelabel) and [VerticalLineLabel](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#verticallinelabel), #1579 +* **FEATURE** (by @julien4215) Add direction property to the [HorizontalLineLabel](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#horizontallinelabel) and [VerticalLineLabel](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#verticallinelabel), #1574 ## 0.66.2 * **BUGFIX** (by @stwarwas) Remove dart.io to fix web platform issue, #1577 From cdfdb66b142605e4a0ed14bd4dbccb3cd2eacc61 Mon Sep 17 00:00:00 2001 From: Xavier Hainaux Date: Fri, 16 Feb 2024 16:34:43 +0100 Subject: [PATCH 121/149] Dynamically changing tooltipBgColor --- CHANGELOG.md | 4 + .../samples/bar/bar_chart_sample1.dart | 18 ++++- .../samples/bar/bar_chart_sample2.dart | 4 +- .../samples/bar/bar_chart_sample3.dart | 2 +- .../samples/bar/bar_chart_sample7.dart | 2 +- .../samples/line/line_chart_sample1.dart | 2 +- .../samples/line/line_chart_sample3.dart | 17 +++- .../samples/line/line_chart_sample5.dart | 2 +- .../samples/line/line_chart_sample8.dart | 4 +- .../samples/line/line_chart_sample9.dart | 2 +- .../scatter/scatter_chart_sample2.dart | 18 ++++- lib/src/chart/bar_chart/bar_chart_data.dart | 30 +++++-- .../chart/bar_chart/bar_chart_painter.dart | 4 +- lib/src/chart/line_chart/line_chart_data.dart | 27 +++++-- .../chart/line_chart/line_chart_painter.dart | 10 ++- .../scatter_chart/scatter_chart_data.dart | 35 ++++++--- .../scatter_chart/scatter_chart_painter.dart | 3 +- pubspec.yaml | 2 +- repo_files/documentations/bar_chart.md | 2 +- repo_files/documentations/handle_touches.md | 2 +- repo_files/documentations/line_chart.md | 2 +- repo_files/documentations/scatter_chart.md | 2 +- .../bar_chart/bar_chart_painter_test.dart | 6 +- test/chart/data_pool.dart | 78 +++++++++++++------ .../line_chart/line_chart_painter_test.dart | 6 +- .../scatter_chart_data_test.dart | 4 +- .../scatter_chart_painter_test.dart | 6 +- 27 files changed, 213 insertions(+), 81 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 15d88a401..1ed5e3fe0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ ## newVersion * **FEATURE** (by @julien4215) Add direction property to the [HorizontalLineLabel](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#horizontallinelabel) and [VerticalLineLabel](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#verticallinelabel), #1574 +## 0.67.0 +* **FEATURE** (by @apekshamehta) Added new method called getTooltipColor for axis charts (bar,line,scatter) to change backgroud color of tooltip dynamically.[issue](https://github.com/imaNNeo/fl_chart/issues/1279). +* **BREAKING** (by @apekshamehta) Removed tooltipBgColor property from Bar, Line and Scatter Charts. + ## 0.66.2 * **BUGFIX** (by @stwarwas) Remove dart.io to fix web platform issue, #1577 diff --git a/example/lib/presentation/samples/bar/bar_chart_sample1.dart b/example/lib/presentation/samples/bar/bar_chart_sample1.dart index a71f5f04a..36d9b15c4 100644 --- a/example/lib/presentation/samples/bar/bar_chart_sample1.dart +++ b/example/lib/presentation/samples/bar/bar_chart_sample1.dart @@ -162,7 +162,19 @@ class BarChartSample1State extends State { return BarChartData( barTouchData: BarTouchData( touchTooltipData: BarTouchTooltipData( - tooltipBgColor: Colors.blueGrey, + getTooltipColor: (group) { + Color bgColor = switch (group.x) { + 0 => AppColors.contentColorPurple.withAlpha(100), + 1 => AppColors.contentColorYellow.withAlpha(100), + 2 => AppColors.contentColorBlue.withAlpha(100), + 3 => AppColors.contentColorOrange.withAlpha(100), + 4 => AppColors.contentColorPink.withAlpha(100), + 5 => AppColors.contentColorRed.withAlpha(100), + 6 => AppColors.contentColorPurple.withAlpha(150), + _ => throw Error(), + }; + return bgColor; + }, tooltipHorizontalAlignment: FLHorizontalAlignment.right, tooltipMargin: -10, getTooltipItem: (group, groupIndex, rod, rodIndex) { @@ -202,8 +214,8 @@ class BarChartSample1State extends State { children: [ TextSpan( text: (rod.toY - 1).toString(), - style: TextStyle( - color: widget.touchedBarColor, + style: const TextStyle( + color: Colors.white, //widget.touchedBarColor, fontSize: 16, fontWeight: FontWeight.w500, ), diff --git a/example/lib/presentation/samples/bar/bar_chart_sample2.dart b/example/lib/presentation/samples/bar/bar_chart_sample2.dart index 9972134c3..d88018c06 100644 --- a/example/lib/presentation/samples/bar/bar_chart_sample2.dart +++ b/example/lib/presentation/samples/bar/bar_chart_sample2.dart @@ -85,7 +85,9 @@ class BarChartSample2State extends State { maxY: 20, barTouchData: BarTouchData( touchTooltipData: BarTouchTooltipData( - tooltipBgColor: Colors.grey, + getTooltipColor: ((group) { + return Colors.grey; + }), getTooltipItem: (a, b, c, d) => null, ), touchCallback: (FlTouchEvent event, response) { diff --git a/example/lib/presentation/samples/bar/bar_chart_sample3.dart b/example/lib/presentation/samples/bar/bar_chart_sample3.dart index 3db1cbe79..5883a8f08 100644 --- a/example/lib/presentation/samples/bar/bar_chart_sample3.dart +++ b/example/lib/presentation/samples/bar/bar_chart_sample3.dart @@ -24,7 +24,7 @@ class _BarChart extends StatelessWidget { BarTouchData get barTouchData => BarTouchData( enabled: false, touchTooltipData: BarTouchTooltipData( - tooltipBgColor: Colors.transparent, + getTooltipColor: (group) => Colors.transparent, tooltipPadding: EdgeInsets.zero, tooltipMargin: 8, getTooltipItem: ( diff --git a/example/lib/presentation/samples/bar/bar_chart_sample7.dart b/example/lib/presentation/samples/bar/bar_chart_sample7.dart index 03b539360..ecb36f9dc 100644 --- a/example/lib/presentation/samples/bar/bar_chart_sample7.dart +++ b/example/lib/presentation/samples/bar/bar_chart_sample7.dart @@ -122,7 +122,7 @@ class _BarChartSample7State extends State { enabled: true, handleBuiltInTouches: false, touchTooltipData: BarTouchTooltipData( - tooltipBgColor: Colors.transparent, + getTooltipColor: (group) => Colors.transparent, tooltipMargin: 0, getTooltipItem: ( BarChartGroupData group, diff --git a/example/lib/presentation/samples/line/line_chart_sample1.dart b/example/lib/presentation/samples/line/line_chart_sample1.dart index d85e7e971..343e2a46f 100644 --- a/example/lib/presentation/samples/line/line_chart_sample1.dart +++ b/example/lib/presentation/samples/line/line_chart_sample1.dart @@ -42,7 +42,7 @@ class _LineChart extends StatelessWidget { LineTouchData get lineTouchData1 => LineTouchData( handleBuiltInTouches: true, touchTooltipData: LineTouchTooltipData( - tooltipBgColor: Colors.blueGrey.withOpacity(0.8), + getTooltipColor: (touchedSpot) => Colors.blueGrey.withOpacity(0.8), ), ); diff --git a/example/lib/presentation/samples/line/line_chart_sample3.dart b/example/lib/presentation/samples/line/line_chart_sample3.dart index 7109ee711..e5d4cc83a 100644 --- a/example/lib/presentation/samples/line/line_chart_sample3.dart +++ b/example/lib/presentation/samples/line/line_chart_sample3.dart @@ -206,7 +206,22 @@ class _LineChartSample3State extends State { }).toList(); }, touchTooltipData: LineTouchTooltipData( - tooltipBgColor: widget.tooltipBgColor, + getTooltipColor: (touchedSpot) { + Color bgColor = switch (( + touchedSpot.x.toInt(), + touchedSpot.y.toDouble() + )) { + (0, 1.3) => AppColors.contentColorPurple.withAlpha(100), + (1, 1) => AppColors.contentColorYellow.withAlpha(100), + (2, 1.8) => AppColors.contentColorBlue.withAlpha(100), + (3, 1.5) => AppColors.contentColorOrange.withAlpha(100), + (4, 2.2) => AppColors.contentColorPink.withAlpha(100), + (5, 1.8) => AppColors.contentColorRed.withAlpha(100), + (6, 3) => AppColors.contentColorPurple.withAlpha(150), + _ => throw Error(), + }; + return bgColor; + }, getTooltipItems: (List touchedBarSpots) { return touchedBarSpots.map((barSpot) { final flSpot = barSpot; diff --git a/example/lib/presentation/samples/line/line_chart_sample5.dart b/example/lib/presentation/samples/line/line_chart_sample5.dart index 26d765614..00e801758 100644 --- a/example/lib/presentation/samples/line/line_chart_sample5.dart +++ b/example/lib/presentation/samples/line/line_chart_sample5.dart @@ -181,7 +181,7 @@ class _LineChartSample5State extends State { }).toList(); }, touchTooltipData: LineTouchTooltipData( - tooltipBgColor: Colors.pink, + getTooltipColor: (touchedSpot) => Colors.pink, tooltipRoundedRadius: 8, getTooltipItems: (List lineBarsSpot) { return lineBarsSpot.map((lineBarSpot) { diff --git a/example/lib/presentation/samples/line/line_chart_sample8.dart b/example/lib/presentation/samples/line/line_chart_sample8.dart index 63974a01d..2c72c5279 100644 --- a/example/lib/presentation/samples/line/line_chart_sample8.dart +++ b/example/lib/presentation/samples/line/line_chart_sample8.dart @@ -238,8 +238,8 @@ class _LineChartSample8State extends State { ); }).toList(); }, - touchTooltipData: const LineTouchTooltipData( - tooltipBgColor: AppColors.contentColorBlue, + touchTooltipData: LineTouchTooltipData( + getTooltipColor: (touchedSpot) => AppColors.contentColorBlue, ), ), borderData: FlBorderData( diff --git a/example/lib/presentation/samples/line/line_chart_sample9.dart b/example/lib/presentation/samples/line/line_chart_sample9.dart index 3acb9c0a5..31ea837f9 100644 --- a/example/lib/presentation/samples/line/line_chart_sample9.dart +++ b/example/lib/presentation/samples/line/line_chart_sample9.dart @@ -59,7 +59,7 @@ class LineChartSample9 extends StatelessWidget { lineTouchData: LineTouchData( touchTooltipData: LineTouchTooltipData( maxContentWidth: 100, - tooltipBgColor: Colors.black, + getTooltipColor: (touchedSpot) => Colors.black, getTooltipItems: (touchedSpots) { return touchedSpots.map((LineBarSpot touchedSpot) { final textStyle = TextStyle( diff --git a/example/lib/presentation/samples/scatter/scatter_chart_sample2.dart b/example/lib/presentation/samples/scatter/scatter_chart_sample2.dart index 0a1db8f5c..27664cfb7 100644 --- a/example/lib/presentation/samples/scatter/scatter_chart_sample2.dart +++ b/example/lib/presentation/samples/scatter/scatter_chart_sample2.dart @@ -126,7 +126,23 @@ class _ScatterChartSample2State extends State { : SystemMouseCursors.click; }, touchTooltipData: ScatterTouchTooltipData( - tooltipBgColor: Colors.black, + getTooltipColor: (ScatterSpot touchedBarSpot) { + Color bgColor = switch (( + touchedBarSpot.x.toInt(), + touchedBarSpot.y.toInt() + )) { + (4, 4) => AppColors.contentColorPurple.withAlpha(100), + (2, 5) => AppColors.contentColorYellow.withAlpha(100), + (4, 5) => AppColors.contentColorBlue.withAlpha(100), + (8, 6) => AppColors.contentColorOrange.withAlpha(100), + (5, 7) => AppColors.contentColorPink.withAlpha(100), + (7, 2) => AppColors.contentColorRed.withAlpha(100), + (3, 2) => AppColors.contentColorPurple.withAlpha(150), + (2, 8) => AppColors.contentColorYellow.withAlpha(100), + _ => throw Error(), + }; + return bgColor; + }, getTooltipItems: (ScatterSpot touchedBarSpot) { return ScatterTooltipItem( 'X: ', diff --git a/lib/src/chart/bar_chart/bar_chart_data.dart b/lib/src/chart/bar_chart/bar_chart_data.dart index 7597e5714..115869450 100644 --- a/lib/src/chart/bar_chart/bar_chart_data.dart +++ b/lib/src/chart/bar_chart/bar_chart_data.dart @@ -687,7 +687,7 @@ class BarTouchTooltipData with EquatableMixin { /// if [BarTouchData.handleBuiltInTouches] is true, /// [BarChart] shows a tooltip popup on top of rods automatically when touch happens, /// otherwise you can show it manually using [BarChartGroupData.showingTooltipIndicators]. - /// Tooltip shows on top of rods, with [tooltipBgColor] as a background color, + /// Tooltip shows on top of rods, with [getTooltipColor] as a background color, /// and you can set corner radius using [tooltipRoundedRadius]. /// If you want to have a padding inside the tooltip, fill [tooltipPadding], /// or If you want to have a bottom margin, set [tooltipMargin]. @@ -698,7 +698,6 @@ class BarTouchTooltipData with EquatableMixin { /// you can set [fitInsideHorizontally] true to force it to shift inside the chart horizontally, /// also you can set [fitInsideVertically] true to force it to shift inside the chart vertically. BarTouchTooltipData({ - Color? tooltipBgColor, double? tooltipRoundedRadius, EdgeInsets? tooltipPadding, double? tooltipMargin, @@ -706,13 +705,13 @@ class BarTouchTooltipData with EquatableMixin { double? tooltipHorizontalOffset, double? maxContentWidth, GetBarTooltipItem? getTooltipItem, + GetBarTooltipColor? getTooltipColor, bool? fitInsideHorizontally, bool? fitInsideVertically, TooltipDirection? direction, double? rotateAngle, BorderSide? tooltipBorder, - }) : tooltipBgColor = tooltipBgColor ?? Colors.blueGrey.darken(15), - tooltipRoundedRadius = tooltipRoundedRadius ?? 4, + }) : tooltipRoundedRadius = tooltipRoundedRadius ?? 4, tooltipPadding = tooltipPadding ?? const EdgeInsets.symmetric(horizontal: 16, vertical: 8), tooltipMargin = tooltipMargin ?? 16, @@ -721,6 +720,7 @@ class BarTouchTooltipData with EquatableMixin { tooltipHorizontalOffset = tooltipHorizontalOffset ?? 0, maxContentWidth = maxContentWidth ?? 120, getTooltipItem = getTooltipItem ?? defaultBarTooltipItem, + getTooltipColor = getTooltipColor ?? defaultBarTooltipColor, fitInsideHorizontally = fitInsideHorizontally ?? false, fitInsideVertically = fitInsideVertically ?? false, direction = direction ?? TooltipDirection.auto, @@ -728,9 +728,6 @@ class BarTouchTooltipData with EquatableMixin { tooltipBorder = tooltipBorder ?? BorderSide.none, super(); - /// The tooltip background color. - final Color tooltipBgColor; - /// Sets a rounded radius for the tooltip. final double tooltipRoundedRadius; @@ -767,10 +764,12 @@ class BarTouchTooltipData with EquatableMixin { /// The tooltip border color. final BorderSide tooltipBorder; + /// Retrieves data for setting background color of the tooltip. + final GetBarTooltipColor getTooltipColor; + /// Used for equality check, see [EquatableMixin]. @override List get props => [ - tooltipBgColor, tooltipRoundedRadius, tooltipPadding, tooltipMargin, @@ -782,6 +781,7 @@ class BarTouchTooltipData with EquatableMixin { fitInsideVertically, rotateAngle, tooltipBorder, + getTooltipColor, ]; } @@ -851,6 +851,20 @@ class BarTooltipItem with EquatableMixin { ]; } +//// Provides a [Color] to show different background color for each rod +/// +/// You can override [BarTouchTooltipData.getTooltipColor], it gives you +/// [group] that touch happened on, then you should and pass your custom [Color] to set background color +/// of tooltip popup. +typedef GetBarTooltipColor = Color Function( + BarChartGroupData group, +); + +/// Default implementation for [BarTouchTooltipData.getTooltipColor]. +Color defaultBarTooltipColor(BarChartGroupData group) { + return Colors.blueGrey.darken(15); +} + /// Holds information about touch response in the [BarChart]. /// /// You can override [BarTouchData.touchCallback] to handle touch events, diff --git a/lib/src/chart/bar_chart/bar_chart_painter.dart b/lib/src/chart/bar_chart/bar_chart_painter.dart index ff7a41347..39691f5a6 100644 --- a/lib/src/chart/bar_chart/bar_chart_painter.dart +++ b/lib/src/chart/bar_chart/bar_chart_painter.dart @@ -476,7 +476,9 @@ class BarChartPainter extends AxisChartPainter { bottomLeft: radius, bottomRight: radius, ); - _bgTouchTooltipPaint.color = tooltipData.tooltipBgColor; + + /// set tooltip's background color for each rod + _bgTouchTooltipPaint.color = tooltipData.getTooltipColor(showOnBarGroup); final rotateAngle = tooltipData.rotateAngle; final rectRotationOffset = diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index fee025f22..c24127acf 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -1030,7 +1030,7 @@ class LineTouchTooltipData with EquatableMixin { /// if [LineTouchData.handleBuiltInTouches] is true, /// [LineChart] shows a tooltip popup on top of spots automatically when touch happens, /// otherwise you can show it manually using [LineChartData.showingTooltipIndicators]. - /// Tooltip shows on top of spots, with [tooltipBgColor] as a background color, + /// Tooltip shows on top of spots, with [getTooltipColor] as a background color, /// and you can set corner radius using [tooltipRoundedRadius]. /// If you want to have a padding inside the tooltip, fill [tooltipPadding], /// or If you want to have a bottom margin, set [tooltipMargin]. @@ -1041,7 +1041,6 @@ class LineTouchTooltipData with EquatableMixin { /// you can set [fitInsideHorizontally] true to force it to shift inside the chart horizontally, /// also you can set [fitInsideVertically] true to force it to shift inside the chart vertically. const LineTouchTooltipData({ - this.tooltipBgColor = const Color.fromRGBO(96, 125, 139, 1), this.tooltipRoundedRadius = 4, this.tooltipPadding = const EdgeInsets.symmetric(horizontal: 16, vertical: 8), @@ -1050,6 +1049,7 @@ class LineTouchTooltipData with EquatableMixin { this.tooltipHorizontalOffset = 0, this.maxContentWidth = 120, this.getTooltipItems = defaultLineTooltipItem, + this.getTooltipColor = defaultLineTooltipColor, this.fitInsideHorizontally = false, this.fitInsideVertically = false, this.showOnTopOfTheChartBoxArea = false, @@ -1057,9 +1057,6 @@ class LineTouchTooltipData with EquatableMixin { this.tooltipBorder = BorderSide.none, }); - /// The tooltip background color. - final Color tooltipBgColor; - /// Sets a rounded radius for the tooltip. final double tooltipRoundedRadius; @@ -1096,10 +1093,12 @@ class LineTouchTooltipData with EquatableMixin { /// The tooltip border color. final BorderSide tooltipBorder; + // /// Retrieves data for setting background color of the tooltip. + final GetLineTooltipColor getTooltipColor; + /// Used for equality check, see [EquatableMixin]. @override List get props => [ - tooltipBgColor, tooltipRoundedRadius, tooltipPadding, tooltipMargin, @@ -1112,6 +1111,7 @@ class LineTouchTooltipData with EquatableMixin { showOnTopOfTheChartBoxArea, rotateAngle, tooltipBorder, + getTooltipColor, ]; } @@ -1140,6 +1140,21 @@ List defaultLineTooltipItem(List touchedSpots) { }).toList(); } +//// Provides a [Color] to show different background color for each touched spot +/// +/// You can override [LineTouchTooltipData.getTooltipColor], it gives you +/// [touchedSpot] object that touch happened on, then you should and pass your custom [Color] list +/// (length should be equal to the [touchedSpots.length]), to set background color +/// of tooltip popup. +typedef GetLineTooltipColor = Color Function( + LineBarSpot touchedSpot, +); + +/// Default implementation for [LineTouchTooltipData.getTooltipColor]. +Color defaultLineTooltipColor(LineBarSpot touchedSpot) { + return Colors.blueGrey.darken(15); +} + /// Represent a targeted spot inside a line bar. class LineBarSpot extends FlSpot with EquatableMixin { /// [bar] is the [LineChartBarData] that this spot is inside of, diff --git a/lib/src/chart/line_chart/line_chart_painter.dart b/lib/src/chart/line_chart/line_chart_painter.dart index 75b4a60ec..b0f7c6cbd 100644 --- a/lib/src/chart/line_chart/line_chart_painter.dart +++ b/lib/src/chart/line_chart/line_chart_painter.dart @@ -1126,7 +1126,15 @@ class LineChartPainter extends AxisChartPainter { bottomLeft: radius, bottomRight: radius, ); - _bgTouchTooltipPaint.color = tooltipData.tooltipBgColor; + + var topSpot = showingTooltipSpots.showingSpots[0]; + for (final barSpot in showingTooltipSpots.showingSpots) { + if (barSpot.y > topSpot.y) { + topSpot = barSpot; + } + } + + _bgTouchTooltipPaint.color = tooltipData.getTooltipColor(topSpot); final rotateAngle = tooltipData.rotateAngle; final rectRotationOffset = diff --git a/lib/src/chart/scatter_chart/scatter_chart_data.dart b/lib/src/chart/scatter_chart/scatter_chart_data.dart index 5bb9c9d81..2c3f3f1e6 100644 --- a/lib/src/chart/scatter_chart/scatter_chart_data.dart +++ b/lib/src/chart/scatter_chart/scatter_chart_data.dart @@ -390,7 +390,7 @@ class ScatterTouchTooltipData with EquatableMixin { /// if [ScatterTouchData.handleBuiltInTouches] is true, /// [ScatterChart] shows a tooltip popup on top of spots automatically when touch happens, /// otherwise you can show it manually using [ScatterChartData.showingTooltipIndicators]. - /// Tooltip shows on top of spots, with [tooltipBgColor] as a background color, + /// Tooltip shows on top of spots, with [getTooltipColor] as a background color, /// and you can set corner radius using [tooltipRoundedRadius]. /// If you want to have a padding inside the tooltip, fill [tooltipPadding]. /// Content of the tooltip will provide using [getTooltipItems] callback, you can override it @@ -400,7 +400,6 @@ class ScatterTouchTooltipData with EquatableMixin { /// you can set [fitInsideHorizontally] true to force it to shift inside the chart horizontally, /// also you can set [fitInsideVertically] true to force it to shift inside the chart vertically. ScatterTouchTooltipData({ - Color? tooltipBgColor, double? tooltipRoundedRadius, EdgeInsets? tooltipPadding, FLHorizontalAlignment? tooltipHorizontalAlignment, @@ -411,8 +410,8 @@ class ScatterTouchTooltipData with EquatableMixin { bool? fitInsideVertically, double? rotateAngle, BorderSide? tooltipBorder, - }) : tooltipBgColor = tooltipBgColor ?? Colors.blueGrey.darken(15), - tooltipRoundedRadius = tooltipRoundedRadius ?? 4, + GetScatterTooltipColor? getTooltipColor, + }) : tooltipRoundedRadius = tooltipRoundedRadius ?? 4, tooltipPadding = tooltipPadding ?? const EdgeInsets.symmetric(horizontal: 16, vertical: 8), tooltipHorizontalAlignment = @@ -424,11 +423,9 @@ class ScatterTouchTooltipData with EquatableMixin { fitInsideVertically = fitInsideVertically ?? false, rotateAngle = rotateAngle ?? 0.0, tooltipBorder = tooltipBorder ?? BorderSide.none, + getTooltipColor = getTooltipColor ?? defaultScatterTooltipColor, super(); - /// The tooltip background color. - final Color tooltipBgColor; - /// Sets a rounded radius for the tooltip. final double tooltipRoundedRadius; @@ -459,10 +456,12 @@ class ScatterTouchTooltipData with EquatableMixin { /// The tooltip border color. final BorderSide tooltipBorder; + /// Retrieves data for showing content inside the tooltip. + final GetScatterTooltipColor getTooltipColor; + /// Used for equality check, see [EquatableMixin]. @override List get props => [ - tooltipBgColor, tooltipRoundedRadius, tooltipPadding, tooltipHorizontalAlignment, @@ -473,12 +472,12 @@ class ScatterTouchTooltipData with EquatableMixin { fitInsideVertically, rotateAngle, tooltipBorder, + getTooltipColor, ]; /// Copies current [ScatterTouchTooltipData] to a new [ScatterTouchTooltipData], /// and replaces provided values. ScatterTouchTooltipData copyWith({ - Color? tooltipBgColor, double? tooltipRoundedRadius, EdgeInsets? tooltipPadding, FLHorizontalAlignment? tooltipHorizontalAlignment, @@ -489,9 +488,9 @@ class ScatterTouchTooltipData with EquatableMixin { bool? fitInsideVertically, double? rotateAngle, BorderSide? tooltipBorder, + GetScatterTooltipColor? getTooltipColor, }) { return ScatterTouchTooltipData( - tooltipBgColor: tooltipBgColor ?? this.tooltipBgColor, tooltipRoundedRadius: tooltipRoundedRadius ?? this.tooltipRoundedRadius, tooltipPadding: tooltipPadding ?? this.tooltipPadding, tooltipHorizontalAlignment: @@ -505,6 +504,7 @@ class ScatterTouchTooltipData with EquatableMixin { fitInsideVertically: fitInsideVertically ?? this.fitInsideVertically, rotateAngle: rotateAngle ?? this.rotateAngle, tooltipBorder: tooltipBorder ?? this.tooltipBorder, + getTooltipColor: getTooltipColor ?? this.getTooltipColor, ); } } @@ -538,6 +538,21 @@ ScatterTooltipItem? defaultScatterTooltipItem(ScatterSpot touchedSpot) { ); } +/// Provides a [Color] to show different background color inside the [ScatterTouchTooltipData]. +/// +/// You can override [ScatterTouchTooltipData.getTooltipColor], it gives you +/// [touchedSpot] that touch happened on, +/// then you should and pass your custom [Color] +/// to show it inside the tooltip popup. +typedef GetScatterTooltipColor = Color Function( + ScatterSpot touchedSpot, +); + +/// Default implementation for [ScatterTouchTooltipData.getTooltipItems]. +Color defaultScatterTooltipColor(ScatterSpot touchedSpot) { + return Colors.blueGrey.darken(15); +} + /// Holds data of showing each item in the tooltip popup. class ScatterTooltipItem with EquatableMixin { /// Shows a [text] with [textStyle], [textDirection], and optional [children] in the tooltip popup, diff --git a/lib/src/chart/scatter_chart/scatter_chart_painter.dart b/lib/src/chart/scatter_chart/scatter_chart_painter.dart index 386079d76..109091ae2 100644 --- a/lib/src/chart/scatter_chart/scatter_chart_painter.dart +++ b/lib/src/chart/scatter_chart/scatter_chart_painter.dart @@ -311,7 +311,8 @@ class ScatterChartPainter extends AxisChartPainter { bottomLeft: radius, bottomRight: radius, ); - _bgTouchTooltipPaint.color = tooltipData.tooltipBgColor; + + _bgTouchTooltipPaint.color = tooltipData.getTooltipColor(showOnSpot); final rotateAngle = tooltipData.rotateAngle; final rectRotationOffset = diff --git a/pubspec.yaml b/pubspec.yaml index ec542a720..cab8f6a0d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: fl_chart description: A highly customizable Flutter chart library that supports Line Chart, Bar Chart, Pie Chart, Scatter Chart, and Radar Chart. -version: 0.66.2 +version: 0.67.0 homepage: https://flchart.dev/ repository: https://github.com/imaNNeo/fl_chart issue_tracker: https://github.com/imaNNeo/fl_chart/issues diff --git a/repo_files/documentations/bar_chart.md b/repo_files/documentations/bar_chart.md index 37478cf53..439c744e3 100644 --- a/repo_files/documentations/bar_chart.md +++ b/repo_files/documentations/bar_chart.md @@ -95,7 +95,6 @@ enum values {`start`, `end`, `center`, `spaceEvenly`, `spaceAround`, `spaceBetwe ### BarTouchTooltipData |PropName|Description|default value| |:-------|:----------|:------------| - |tooltipBgColor|background color of the tooltip bubble|Colors.white| |tooltipBorder|border of the tooltip bubble|BorderSide.none| |tooltipRoundedRadius|background corner radius of the tooltip bubble|4| |tooltipPadding|padding of the tooltip|EdgeInsets.symmetric(horizontal: 16, vertical: 8)| @@ -107,6 +106,7 @@ enum values {`start`, `end`, `center`, `spaceEvenly`, `spaceAround`, `spaceBetwe |fitInsideHorizontally| forces tooltip to horizontally shift inside the chart's bounding box| false| |fitInsideVertically| forces tooltip to vertically shift inside the chart's bounding box| false| |direction| Controls showing tooltip on top or bottom, default is auto.| auto| + |getTooltipColor|a callback that retrieves the Color for each rod separately from the given [BarChartGroupData](#BarChartGroupData) to set the background color of the tooltip bubble|Colors.blueGrey.darken(15)| ### BarTooltipItem |PropName|Description|default value| diff --git a/repo_files/documentations/handle_touches.md b/repo_files/documentations/handle_touches.md index 0ed86f8f5..2d8056a9d 100644 --- a/repo_files/documentations/handle_touches.md +++ b/repo_files/documentations/handle_touches.md @@ -22,7 +22,7 @@ LineChart( LineChartData( lineTouchData: LineTouchData( touchTooltipData: TouchTooltipData ( - tooltipBgColor: Colors.blueGrey.withOpacity(0.8), + getTooltipColor: (touchedSpot) => Colors.blueGrey.withOpacity(0.8), . . . diff --git a/repo_files/documentations/line_chart.md b/repo_files/documentations/line_chart.md index 00bc36973..52d84b888 100644 --- a/repo_files/documentations/line_chart.md +++ b/repo_files/documentations/line_chart.md @@ -119,7 +119,6 @@ When you change the chart's state, it animates to the new state internally (usin ### LineTouchTooltipData |PropName|Description|default value| |:-------|:----------|:------------| - |tooltipBgColor|background color of the tooltip bubble|Colors.white| |tooltipBorder|border of the tooltip bubble|BorderSide.none| |tooltipRoundedRadius|background corner radius of the tooltip bubble|4| |tooltipPadding|padding of the tooltip|EdgeInsets.symmetric(horizontal: 16, vertical: 8)| @@ -131,6 +130,7 @@ When you change the chart's state, it animates to the new state internally (usin |fitInsideHorizontally| forces tooltip to horizontally shift inside the chart's bounding box| false| |fitInsideVertically| forces tooltip to vertically shift inside the chart's bounding box| false| |showOnTopOfTheChartBoxArea| forces the tooltip container to top of the line| false| + |getTooltipColor|a callback that retrieves the Color for each touched spots separately from the given [LineBarSpot](#LineBarSpot) to set the background color of the tooltip bubble|Colors.blueGrey.darken(15)| ### LineTooltipItem |PropName|Description|default value| diff --git a/repo_files/documentations/scatter_chart.md b/repo_files/documentations/scatter_chart.md index 084ee49ff..4051cffde 100644 --- a/repo_files/documentations/scatter_chart.md +++ b/repo_files/documentations/scatter_chart.md @@ -49,7 +49,6 @@ When you change the chart's state, it animates to the new state internally (usin ### ScatterTouchTooltipData |PropName|Description|default value| |:-------|:----------|:------------| -|tooltipBgColor|background color of the tooltip bubble|Colors.white| |tooltipBorder|border of the tooltip bubble|BorderSide.none| |tooltipRoundedRadius|background corner radius of the tooltip bubble|4| |tooltipPadding|padding of the tooltip|EdgeInsets.symmetric(horizontal: 16, vertical: 8)| @@ -59,6 +58,7 @@ When you change the chart's state, it animates to the new state internally (usin |getTooltipItems|a callback that retrieve a [ScatterTooltipItem](#ScatterTooltipItem) by the given [ScatterSpot](#ScatterSpot) |defaultScatterTooltipItem| |fitInsideHorizontally| forces tooltip to horizontally shift inside the chart's bounding box| false| |fitInsideVertically| forces tooltip to vertically shift inside the chart's bounding box| false| +|getTooltipColor|a callback that retrieves the Color for each touched spots separately from the given [ScatterSpot](#ScatterSpot) to set the background color of the tooltip bubble|Colors.blueGrey.darken(15)| ### ScatterTooltipItem |PropName|Description|default value| diff --git a/test/chart/bar_chart/bar_chart_painter_test.dart b/test/chart/bar_chart/bar_chart_painter_test.dart index 9695a033c..ad8fb9af2 100644 --- a/test/chart/bar_chart/bar_chart_painter_test.dart +++ b/test/chart/bar_chart/bar_chart_painter_test.dart @@ -1085,7 +1085,7 @@ void main() { final tooltipData = BarTouchTooltipData( tooltipRoundedRadius: 8, - tooltipBgColor: const Color(0xf33f33f3), + getTooltipColor: (group) => const Color(0xf33f33f3), maxContentWidth: 80, rotateAngle: 12, tooltipBorder: const BorderSide(color: Color(0xf33f33f3), width: 2), @@ -1282,7 +1282,7 @@ void main() { final tooltipData = BarTouchTooltipData( tooltipRoundedRadius: 8, - tooltipBgColor: const Color(0xf33f33f3), + getTooltipColor: (group) => const Color(0xf33f33f3), maxContentWidth: 80, rotateAngle: 12, direction: TooltipDirection.bottom, @@ -1453,7 +1453,7 @@ void main() { final tooltipData = BarTouchTooltipData( tooltipRoundedRadius: 8, - tooltipBgColor: const Color(0xf33f33f3), + getTooltipColor: (group) => const Color(0xf33f33f3), maxContentWidth: 8000, rotateAngle: 12, fitInsideHorizontally: true, diff --git a/test/chart/data_pool.dart b/test/chart/data_pool.dart index 0a35d5381..9dac57ad8 100644 --- a/test/chart/data_pool.dart +++ b/test/chart/data_pool.dart @@ -1186,9 +1186,17 @@ List lineChartGetTooltipItems(List list) { return list.map((s) => lineTooltipItem1).toList(); } +Color lineChartGetGreenColor(LineBarSpot touchedSpot) { + return Colors.green; +} + +Color lineChartGetRedColor(LineBarSpot touchedSpot) { + return Colors.red; +} + const LineTouchTooltipData lineTouchTooltipData1 = LineTouchTooltipData( tooltipPadding: EdgeInsets.all(0.1), - tooltipBgColor: Colors.green, + getTooltipColor: lineChartGetGreenColor, maxContentWidth: 12, getTooltipItems: lineChartGetTooltipItems, fitInsideHorizontally: true, @@ -1198,7 +1206,7 @@ const LineTouchTooltipData lineTouchTooltipData1 = LineTouchTooltipData( ); const LineTouchTooltipData lineTouchTooltipData1Clone = LineTouchTooltipData( tooltipPadding: EdgeInsets.all(0.1), - tooltipBgColor: Colors.green, + getTooltipColor: lineChartGetGreenColor, maxContentWidth: 12, getTooltipItems: lineChartGetTooltipItems, fitInsideHorizontally: true, @@ -1209,7 +1217,7 @@ const LineTouchTooltipData lineTouchTooltipData1Clone = LineTouchTooltipData( const LineTouchTooltipData lineTouchTooltipData2 = LineTouchTooltipData( tooltipPadding: EdgeInsets.all(0.1), - tooltipBgColor: Colors.red, + getTooltipColor: lineChartGetRedColor, maxContentWidth: 12, getTooltipItems: lineChartGetTooltipItems, fitInsideHorizontally: true, @@ -1219,7 +1227,7 @@ const LineTouchTooltipData lineTouchTooltipData2 = LineTouchTooltipData( ); const LineTouchTooltipData lineTouchTooltipData3 = LineTouchTooltipData( tooltipPadding: EdgeInsets.all(0.2), - tooltipBgColor: Colors.green, + getTooltipColor: lineChartGetGreenColor, maxContentWidth: 12, getTooltipItems: lineChartGetTooltipItems, fitInsideHorizontally: true, @@ -1230,7 +1238,7 @@ const LineTouchTooltipData lineTouchTooltipData3 = LineTouchTooltipData( ); const LineTouchTooltipData lineTouchTooltipData4 = LineTouchTooltipData( tooltipPadding: EdgeInsets.all(0.1), - tooltipBgColor: Colors.green, + getTooltipColor: lineChartGetGreenColor, maxContentWidth: 13, getTooltipItems: lineChartGetTooltipItems, fitInsideHorizontally: true, @@ -1241,7 +1249,7 @@ const LineTouchTooltipData lineTouchTooltipData4 = LineTouchTooltipData( ); const LineTouchTooltipData lineTouchTooltipData5 = LineTouchTooltipData( tooltipPadding: EdgeInsets.all(0.1), - tooltipBgColor: Colors.green, + getTooltipColor: lineChartGetGreenColor, maxContentWidth: 12, getTooltipItems: lineChartGetTooltipItems, fitInsideHorizontally: true, @@ -1252,7 +1260,7 @@ const LineTouchTooltipData lineTouchTooltipData5 = LineTouchTooltipData( ); const LineTouchTooltipData lineTouchTooltipData6 = LineTouchTooltipData( tooltipPadding: EdgeInsets.all(0.1), - tooltipBgColor: Colors.green, + getTooltipColor: lineChartGetGreenColor, maxContentWidth: 12, getTooltipItems: lineChartGetTooltipItems, fitInsideHorizontally: true, @@ -1264,7 +1272,7 @@ const LineTouchTooltipData lineTouchTooltipData6 = LineTouchTooltipData( ); const LineTouchTooltipData lineTouchTooltipData7 = LineTouchTooltipData( tooltipPadding: EdgeInsets.all(0.1), - tooltipBgColor: Colors.green, + getTooltipColor: lineChartGetGreenColor, maxContentWidth: 12, getTooltipItems: lineChartGetTooltipItems, fitInsideHorizontally: true, @@ -2240,6 +2248,14 @@ ScatterTooltipItem? scatterChartGetTooltipItems(ScatterSpot spots) { ); } +Color scatterChartGetTooltipGreenColor(ScatterSpot spots) { + return Colors.green; //Color +} + +Color scatterChartGetTooltipRedColor(ScatterSpot spots) { + return Colors.red; //Color +} + final ScatterSpot scatterSpot1 = ScatterSpot(1, 40); final ScatterSpot scatterSpot1Clone = ScatterSpot(1, 40); final ScatterSpot scatterSpot2 = ScatterSpot(-4, -8); @@ -2302,7 +2318,7 @@ final ScatterChartData scatterChartData1 = ScatterChartData( fitInsideHorizontally: true, fitInsideVertically: false, maxContentWidth: 33, - tooltipBgColor: Colors.white, + getTooltipColor: (touchedSpot) => Colors.white, tooltipPadding: const EdgeInsets.all(23), tooltipRoundedRadius: 534, ), @@ -2341,7 +2357,7 @@ final ScatterTouchTooltipData scatterTouchTooltipData1 = ScatterTouchTooltipData( tooltipRoundedRadius: 23, tooltipPadding: const EdgeInsets.all(11), - tooltipBgColor: Colors.green, + getTooltipColor: scatterChartGetTooltipGreenColor, maxContentWidth: 33, fitInsideVertically: true, fitInsideHorizontally: false, @@ -2352,7 +2368,7 @@ final ScatterTouchTooltipData scatterTouchTooltipData1Clone = ScatterTouchTooltipData( tooltipRoundedRadius: 23, tooltipPadding: const EdgeInsets.all(11), - tooltipBgColor: Colors.green, + getTooltipColor: scatterChartGetTooltipGreenColor, maxContentWidth: 33, fitInsideVertically: true, fitInsideHorizontally: false, @@ -2363,7 +2379,7 @@ final ScatterTouchTooltipData scatterTouchTooltipData2 = ScatterTouchTooltipData( tooltipRoundedRadius: 23, tooltipPadding: const EdgeInsets.all(11), - tooltipBgColor: Colors.green, + getTooltipColor: scatterChartGetTooltipGreenColor, maxContentWidth: 33, fitInsideVertically: true, fitInsideHorizontally: false, @@ -2375,7 +2391,7 @@ final ScatterTouchTooltipData scatterTouchTooltipData3 = ScatterTouchTooltipData( tooltipRoundedRadius: 23, tooltipPadding: const EdgeInsets.all(11), - tooltipBgColor: Colors.green, + getTooltipColor: scatterChartGetTooltipGreenColor, maxContentWidth: 33, fitInsideVertically: true, fitInsideHorizontally: false, @@ -2749,12 +2765,24 @@ BarTooltipItem getTooltipItem( return BarTooltipItem(rod.toY.toString(), textStyle); } +Color getTooltipGreenColor( + BarChartGroupData group, +) { + return Colors.green; +} + +Color getTooltipBlueColor( + BarChartGroupData group, +) { + return Colors.blue; +} + final BarTouchTooltipData barTouchTooltipData1 = BarTouchTooltipData( tooltipRoundedRadius: 12, fitInsideVertically: false, fitInsideHorizontally: true, maxContentWidth: 23, - tooltipBgColor: Colors.green, + getTooltipColor: getTooltipGreenColor, tooltipPadding: const EdgeInsets.all(23), getTooltipItem: getTooltipItem, tooltipMargin: 12, @@ -2765,7 +2793,7 @@ final BarTouchTooltipData barTouchTooltipData1Clone = BarTouchTooltipData( fitInsideVertically: false, fitInsideHorizontally: true, maxContentWidth: 23, - tooltipBgColor: Colors.green, + getTooltipColor: getTooltipGreenColor, tooltipPadding: const EdgeInsets.all(23), getTooltipItem: getTooltipItem, tooltipMargin: 12, @@ -2776,7 +2804,7 @@ final BarTouchTooltipData barTouchTooltipData2 = BarTouchTooltipData( fitInsideVertically: false, fitInsideHorizontally: true, maxContentWidth: 23, - tooltipBgColor: Colors.green, + getTooltipColor: getTooltipGreenColor, tooltipPadding: const EdgeInsets.all(23), getTooltipItem: getTooltipItem, tooltipMargin: 12, @@ -2788,7 +2816,7 @@ final BarTouchTooltipData barTouchTooltipData3 = BarTouchTooltipData( fitInsideVertically: true, fitInsideHorizontally: true, maxContentWidth: 23, - tooltipBgColor: Colors.green, + getTooltipColor: getTooltipGreenColor, tooltipPadding: const EdgeInsets.all(23), getTooltipItem: getTooltipItem, tooltipMargin: 12, @@ -2800,7 +2828,7 @@ final BarTouchTooltipData barTouchTooltipData4 = BarTouchTooltipData( fitInsideVertically: false, fitInsideHorizontally: false, maxContentWidth: 23, - tooltipBgColor: Colors.green, + getTooltipColor: getTooltipGreenColor, tooltipPadding: const EdgeInsets.all(23), getTooltipItem: getTooltipItem, tooltipMargin: 12, @@ -2812,7 +2840,7 @@ final BarTouchTooltipData barTouchTooltipData5 = BarTouchTooltipData( fitInsideVertically: false, fitInsideHorizontally: true, maxContentWidth: 23.00001, - tooltipBgColor: Colors.green, + getTooltipColor: getTooltipGreenColor, tooltipPadding: const EdgeInsets.all(23), getTooltipItem: getTooltipItem, tooltipMargin: 12, @@ -2825,7 +2853,7 @@ final BarTouchTooltipData barTouchTooltipData6 = BarTouchTooltipData( fitInsideVertically: false, fitInsideHorizontally: true, maxContentWidth: 23, - tooltipBgColor: Colors.blue, + getTooltipColor: getTooltipBlueColor, tooltipPadding: const EdgeInsets.all(23), getTooltipItem: getTooltipItem, tooltipMargin: 12, @@ -2838,7 +2866,7 @@ final BarTouchTooltipData barTouchTooltipData7 = BarTouchTooltipData( fitInsideVertically: false, fitInsideHorizontally: true, maxContentWidth: 23, - tooltipBgColor: Colors.green, + getTooltipColor: getTooltipGreenColor, getTooltipItem: getTooltipItem, tooltipMargin: 12, tooltipBorder: const BorderSide(color: Colors.red), @@ -2850,7 +2878,7 @@ final BarTouchTooltipData barTouchTooltipData8 = BarTouchTooltipData( fitInsideVertically: false, fitInsideHorizontally: true, maxContentWidth: 23, - tooltipBgColor: Colors.green, + getTooltipColor: getTooltipGreenColor, tooltipPadding: const EdgeInsets.all(23), tooltipMargin: 12, tooltipBorder: const BorderSide(color: Colors.red), @@ -2860,7 +2888,7 @@ final BarTouchTooltipData barTouchTooltipData9 = BarTouchTooltipData( fitInsideVertically: false, fitInsideHorizontally: true, maxContentWidth: 23, - tooltipBgColor: Colors.green, + getTooltipColor: getTooltipGreenColor, tooltipPadding: const EdgeInsets.all(23), getTooltipItem: getTooltipItem, tooltipMargin: 333, @@ -2871,7 +2899,7 @@ final BarTouchTooltipData barTouchTooltipData10 = BarTouchTooltipData( fitInsideVertically: false, fitInsideHorizontally: true, maxContentWidth: 23, - tooltipBgColor: Colors.green, + getTooltipColor: getTooltipGreenColor, tooltipPadding: const EdgeInsets.all(23), getTooltipItem: getTooltipItem, tooltipMargin: 12, @@ -2882,7 +2910,7 @@ final BarTouchTooltipData barTouchTooltipData11 = BarTouchTooltipData( fitInsideVertically: false, fitInsideHorizontally: true, maxContentWidth: 23, - tooltipBgColor: Colors.green, + getTooltipColor: getTooltipGreenColor, tooltipPadding: const EdgeInsets.all(23), getTooltipItem: getTooltipItem, tooltipMargin: 12, diff --git a/test/chart/line_chart/line_chart_painter_test.dart b/test/chart/line_chart/line_chart_painter_test.dart index 45124c29e..7cad6c080 100644 --- a/test/chart/line_chart/line_chart_painter_test.dart +++ b/test/chart/line_chart/line_chart_painter_test.dart @@ -2394,7 +2394,7 @@ void main() { ); final tooltipData = LineTouchTooltipData( - tooltipBgColor: const Color(0x11111111), + getTooltipColor: (touchedSpot) => const Color(0x11111111), tooltipRoundedRadius: 12, rotateAngle: 43, maxContentWidth: 100, @@ -2505,7 +2505,7 @@ void main() { ); final tooltipData = LineTouchTooltipData( - tooltipBgColor: const Color(0x11111111), + getTooltipColor: (touchedSpot) => const Color(0x11111111), tooltipRoundedRadius: 12, rotateAngle: 43, maxContentWidth: 100, @@ -2616,7 +2616,7 @@ void main() { ); final tooltipData = LineTouchTooltipData( - tooltipBgColor: const Color(0x11111111), + getTooltipColor: (touchedSpot) => const Color(0x11111111), tooltipRoundedRadius: 12, rotateAngle: 43, maxContentWidth: 100, diff --git a/test/chart/scatter_chart/scatter_chart_data_test.dart b/test/chart/scatter_chart/scatter_chart_data_test.dart index 671468402..2d1d1bd2c 100644 --- a/test/chart/scatter_chart/scatter_chart_data_test.dart +++ b/test/chart/scatter_chart/scatter_chart_data_test.dart @@ -386,7 +386,7 @@ void main() { final sample = ScatterTouchData( touchTooltipData: ScatterTouchTooltipData( maxContentWidth: 2, - tooltipBgColor: Colors.red, + getTooltipColor: scatterChartGetTooltipRedColor, tooltipPadding: const EdgeInsets.all(11), ), handleBuiltInTouches: false, @@ -396,7 +396,7 @@ void main() { final sampleClone = ScatterTouchData( touchTooltipData: ScatterTouchTooltipData( maxContentWidth: 2, - tooltipBgColor: Colors.red, + getTooltipColor: scatterChartGetTooltipRedColor, tooltipPadding: const EdgeInsets.all(11), ), handleBuiltInTouches: false, diff --git a/test/chart/scatter_chart/scatter_chart_painter_test.dart b/test/chart/scatter_chart/scatter_chart_painter_test.dart index 3664d910d..04562fd0a 100644 --- a/test/chart/scatter_chart/scatter_chart_painter_test.dart +++ b/test/chart/scatter_chart/scatter_chart_painter_test.dart @@ -397,7 +397,7 @@ void main() { scatterTouchData: ScatterTouchData( touchTooltipData: ScatterTouchTooltipData( rotateAngle: 18, - tooltipBgColor: const Color(0xFF00FF00), + getTooltipColor: (touchedSpot) => const Color(0xFF00FF00), tooltipRoundedRadius: 85, tooltipPadding: const EdgeInsets.all(12), getTooltipItems: (_) { @@ -499,7 +499,7 @@ void main() { scatterTouchData: ScatterTouchData( touchTooltipData: ScatterTouchTooltipData( rotateAngle: 18, - tooltipBgColor: const Color(0xFFFFFF00), + getTooltipColor: (touchedSpot) => const Color(0xFFFFFF00), tooltipRoundedRadius: 22, fitInsideHorizontally: false, fitInsideVertically: true, @@ -606,7 +606,7 @@ void main() { scatterTouchData: ScatterTouchData( touchTooltipData: ScatterTouchTooltipData( rotateAngle: 18, - tooltipBgColor: const Color(0xFFFFFF00), + getTooltipColor: (touchedSpot) => const Color(0xFFFFFF00), tooltipRoundedRadius: 22, fitInsideHorizontally: false, fitInsideVertically: true, From 0d486c8d0ebc9c2aaeb4c53ae59502f60b270780 Mon Sep 17 00:00:00 2001 From: Xavier H Date: Thu, 28 Mar 2024 22:12:52 +0100 Subject: [PATCH 122/149] Adrresses review comments --- CHANGELOG.md | 2 -- .../samples/bar/bar_chart_sample1.dart | 14 +------------- .../samples/line/line_chart_sample3.dart | 17 +---------------- .../samples/scatter/scatter_chart_sample2.dart | 16 +--------------- pubspec.yaml | 2 +- 5 files changed, 4 insertions(+), 47 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ed5e3fe0..56c482f71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,5 @@ ## newVersion * **FEATURE** (by @julien4215) Add direction property to the [HorizontalLineLabel](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#horizontallinelabel) and [VerticalLineLabel](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#verticallinelabel), #1574 - -## 0.67.0 * **FEATURE** (by @apekshamehta) Added new method called getTooltipColor for axis charts (bar,line,scatter) to change backgroud color of tooltip dynamically.[issue](https://github.com/imaNNeo/fl_chart/issues/1279). * **BREAKING** (by @apekshamehta) Removed tooltipBgColor property from Bar, Line and Scatter Charts. diff --git a/example/lib/presentation/samples/bar/bar_chart_sample1.dart b/example/lib/presentation/samples/bar/bar_chart_sample1.dart index 36d9b15c4..30ffa61f2 100644 --- a/example/lib/presentation/samples/bar/bar_chart_sample1.dart +++ b/example/lib/presentation/samples/bar/bar_chart_sample1.dart @@ -162,19 +162,7 @@ class BarChartSample1State extends State { return BarChartData( barTouchData: BarTouchData( touchTooltipData: BarTouchTooltipData( - getTooltipColor: (group) { - Color bgColor = switch (group.x) { - 0 => AppColors.contentColorPurple.withAlpha(100), - 1 => AppColors.contentColorYellow.withAlpha(100), - 2 => AppColors.contentColorBlue.withAlpha(100), - 3 => AppColors.contentColorOrange.withAlpha(100), - 4 => AppColors.contentColorPink.withAlpha(100), - 5 => AppColors.contentColorRed.withAlpha(100), - 6 => AppColors.contentColorPurple.withAlpha(150), - _ => throw Error(), - }; - return bgColor; - }, + getTooltipColor: (_) => Colors.blueGrey, tooltipHorizontalAlignment: FLHorizontalAlignment.right, tooltipMargin: -10, getTooltipItem: (group, groupIndex, rod, rodIndex) { diff --git a/example/lib/presentation/samples/line/line_chart_sample3.dart b/example/lib/presentation/samples/line/line_chart_sample3.dart index e5d4cc83a..1dd048687 100644 --- a/example/lib/presentation/samples/line/line_chart_sample3.dart +++ b/example/lib/presentation/samples/line/line_chart_sample3.dart @@ -206,22 +206,7 @@ class _LineChartSample3State extends State { }).toList(); }, touchTooltipData: LineTouchTooltipData( - getTooltipColor: (touchedSpot) { - Color bgColor = switch (( - touchedSpot.x.toInt(), - touchedSpot.y.toDouble() - )) { - (0, 1.3) => AppColors.contentColorPurple.withAlpha(100), - (1, 1) => AppColors.contentColorYellow.withAlpha(100), - (2, 1.8) => AppColors.contentColorBlue.withAlpha(100), - (3, 1.5) => AppColors.contentColorOrange.withAlpha(100), - (4, 2.2) => AppColors.contentColorPink.withAlpha(100), - (5, 1.8) => AppColors.contentColorRed.withAlpha(100), - (6, 3) => AppColors.contentColorPurple.withAlpha(150), - _ => throw Error(), - }; - return bgColor; - }, + getTooltipColor: (touchedSpot) => widget.tooltipBgColor, getTooltipItems: (List touchedBarSpots) { return touchedBarSpots.map((barSpot) { final flSpot = barSpot; diff --git a/example/lib/presentation/samples/scatter/scatter_chart_sample2.dart b/example/lib/presentation/samples/scatter/scatter_chart_sample2.dart index 27664cfb7..8ce83961e 100644 --- a/example/lib/presentation/samples/scatter/scatter_chart_sample2.dart +++ b/example/lib/presentation/samples/scatter/scatter_chart_sample2.dart @@ -127,21 +127,7 @@ class _ScatterChartSample2State extends State { }, touchTooltipData: ScatterTouchTooltipData( getTooltipColor: (ScatterSpot touchedBarSpot) { - Color bgColor = switch (( - touchedBarSpot.x.toInt(), - touchedBarSpot.y.toInt() - )) { - (4, 4) => AppColors.contentColorPurple.withAlpha(100), - (2, 5) => AppColors.contentColorYellow.withAlpha(100), - (4, 5) => AppColors.contentColorBlue.withAlpha(100), - (8, 6) => AppColors.contentColorOrange.withAlpha(100), - (5, 7) => AppColors.contentColorPink.withAlpha(100), - (7, 2) => AppColors.contentColorRed.withAlpha(100), - (3, 2) => AppColors.contentColorPurple.withAlpha(150), - (2, 8) => AppColors.contentColorYellow.withAlpha(100), - _ => throw Error(), - }; - return bgColor; + return touchedBarSpot.dotPainter.mainColor; }, getTooltipItems: (ScatterSpot touchedBarSpot) { return ScatterTooltipItem( diff --git a/pubspec.yaml b/pubspec.yaml index cab8f6a0d..ec542a720 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: fl_chart description: A highly customizable Flutter chart library that supports Line Chart, Bar Chart, Pie Chart, Scatter Chart, and Radar Chart. -version: 0.67.0 +version: 0.66.2 homepage: https://flchart.dev/ repository: https://github.com/imaNNeo/fl_chart issue_tracker: https://github.com/imaNNeo/fl_chart/issues From bba73947ad3812de13dab3946a8e4a9e21be26fb Mon Sep 17 00:00:00 2001 From: Xavier H Date: Thu, 28 Mar 2024 22:14:41 +0100 Subject: [PATCH 123/149] Typo in changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 56c482f71..475237c71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ ## newVersion * **FEATURE** (by @julien4215) Add direction property to the [HorizontalLineLabel](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#horizontallinelabel) and [VerticalLineLabel](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#verticallinelabel), #1574 -* **FEATURE** (by @apekshamehta) Added new method called getTooltipColor for axis charts (bar,line,scatter) to change backgroud color of tooltip dynamically.[issue](https://github.com/imaNNeo/fl_chart/issues/1279). +* **FEATURE** (by @apekshamehta) Added new method called getTooltipColor for axis charts (bar,line,scatter) to change background color of tooltip dynamically.[issue](https://github.com/imaNNeo/fl_chart/issues/1279). * **BREAKING** (by @apekshamehta) Removed tooltipBgColor property from Bar, Line and Scatter Charts. ## 0.66.2 From bfdd91b8b2b73060e9844ed1f37e1d41e3d1c7c8 Mon Sep 17 00:00:00 2001 From: Xavier H Date: Thu, 28 Mar 2024 22:32:33 +0100 Subject: [PATCH 124/149] Add migration guide --- .../0.67.0/MIGRATION_00_67_00.md | 85 +++++++++++++++++++ .../documentations/migration_guides/INDEX.md | 4 +- 2 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 repo_files/documentations/migration_guides/0.67.0/MIGRATION_00_67_00.md diff --git a/repo_files/documentations/migration_guides/0.67.0/MIGRATION_00_67_00.md b/repo_files/documentations/migration_guides/0.67.0/MIGRATION_00_67_00.md new file mode 100644 index 000000000..9ece3775a --- /dev/null +++ b/repo_files/documentations/migration_guides/0.67.0/MIGRATION_00_67_00.md @@ -0,0 +1,85 @@ +# Migrate to new version + +## Replaced tooltipBgColor + +**Breaking: [#1595](https://github.com/imaNNeo/fl_chart/pull/1595)** + +We added the ability to customize the tooltip background color for each point. + +The property `Color tooltipBgColor` from Bar, Line and Scatter Charts is replaced with a callback `Color Function(spot) getTooltipColor` + +#### BarChartData + +Previously: +```dart +BarChartData( + barTouchData: BarTouchData( + touchTooltipData: BarTouchTooltipData( + tooltipBgColor: Colors.blueGrey, + ) + ) +) +``` + +Now in new version: + +```dart +BarChartData( + barTouchData: BarTouchData( + touchTooltipData: BarTouchTooltipData( + getTooltipColor: (BarChartGroupData group) => Colors.blueGrey, + ) + ) +) +``` + +#### LineChartData + +Previously: +```dart +LineChartData( + lineTouchData: LineTouchData( + touchTooltipData: LineTouchTooltipData( + tooltipBgColor: Colors.blueGrey, + ) + ) +) +``` + +Now in new version: + +```dart +LineChartData( + lineTouchData: LineTouchData( + touchTooltipData: LineTouchTooltipData( + getTooltipColor: (LineBarSpot touchedSpot) => Colors.blueGrey, + ) + ) +) +``` + +#### ScatterChartData + +Previously: +```dart +ScatterChartData( + scatterTouchData: ScatterTouchData( + touchTooltipData: ScatterTouchTooltipData( + tooltipBgColor: Colors.blueGrey, + ) + ) +) +``` + +Now in new version: + +```dart +ScatterChartData( + scatterTouchData: ScatterTouchData( + touchTooltipData: ScatterTouchTooltipData( + getTooltipColor: (ScatterSpot touchedBarSpot) => Colors.blueGrey, + ) + ) +) +``` + diff --git a/repo_files/documentations/migration_guides/INDEX.md b/repo_files/documentations/migration_guides/INDEX.md index c9a6df6c8..026e7eeec 100644 --- a/repo_files/documentations/migration_guides/INDEX.md +++ b/repo_files/documentations/migration_guides/INDEX.md @@ -2,4 +2,6 @@ Here are fl_chart's migration guides: #### [Migrate to 0.50.0](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/migration_guides/0.50.0/MIGRATION_00_50_00.md) -#### [Migrate to 0.55.0](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/migration_guides/0.55.0/MIGRATION_00_55_00.md) \ No newline at end of file +#### [Migrate to 0.55.0](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/migration_guides/0.55.0/MIGRATION_00_55_00.md) + +#### [Migrate to 0.67.0](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/migration_guides/0.67.0/MIGRATION_00_67_00.md) \ No newline at end of file From e170af81cba9f61d2625dcf52b123d06747cdd5b Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Fri, 29 Mar 2024 01:28:17 +0330 Subject: [PATCH 125/149] Fix scatter_chart_sample2 color contrast --- .../scatter/scatter_chart_sample2.dart | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/example/lib/presentation/samples/scatter/scatter_chart_sample2.dart b/example/lib/presentation/samples/scatter/scatter_chart_sample2.dart index 8ce83961e..25b3ad4a9 100644 --- a/example/lib/presentation/samples/scatter/scatter_chart_sample2.dart +++ b/example/lib/presentation/samples/scatter/scatter_chart_sample2.dart @@ -130,19 +130,37 @@ class _ScatterChartSample2State extends State { return touchedBarSpot.dotPainter.mainColor; }, getTooltipItems: (ScatterSpot touchedBarSpot) { + final bool isBgDark = + switch ((touchedBarSpot.x, touchedBarSpot.y)) { + (4.0, 4.0) => false, + (2.0, 5.0) => false, + (4.0, 5.0) => true, + (8.0, 6.0) => true, + (5.0, 7.0) => true, + (7.0, 2.0) => true, + (3.0, 2.0) => true, + (2.0, 8.0) => false, + (8.0, 8.0) => true, + (5.0, 2.5) => false, + (3.0, 7.0) => true, + _ => false, + }; + + final color1 = isBgDark ? Colors.grey[100] : Colors.black87; + final color2 = isBgDark ? Colors.white : Colors.black; return ScatterTooltipItem( 'X: ', textStyle: TextStyle( height: 1.2, - color: Colors.grey[100], + color: color1, fontStyle: FontStyle.italic, ), bottomMargin: 10, children: [ TextSpan( text: '${touchedBarSpot.x.toInt()} \n', - style: const TextStyle( - color: Colors.white, + style: TextStyle( + color: color2, fontStyle: FontStyle.normal, fontWeight: FontWeight.bold, ), @@ -151,14 +169,14 @@ class _ScatterChartSample2State extends State { text: 'Y: ', style: TextStyle( height: 1.2, - color: Colors.grey[100], + color: color1, fontStyle: FontStyle.italic, ), ), TextSpan( text: touchedBarSpot.y.toInt().toString(), - style: const TextStyle( - color: Colors.white, + style: TextStyle( + color: color2, fontStyle: FontStyle.normal, fontWeight: FontWeight.bold, ), From 2d0ce646eaa2c02d37b8d9c41513b1fe9eafa275 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Fri, 29 Mar 2024 01:32:23 +0330 Subject: [PATCH 126/149] Update CHANGELOG.md --- CHANGELOG.md | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 475237c71..ad0348987 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,27 @@ ## newVersion * **FEATURE** (by @julien4215) Add direction property to the [HorizontalLineLabel](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#horizontallinelabel) and [VerticalLineLabel](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#verticallinelabel), #1574 * **FEATURE** (by @apekshamehta) Added new method called getTooltipColor for axis charts (bar,line,scatter) to change background color of tooltip dynamically.[issue](https://github.com/imaNNeo/fl_chart/issues/1279). -* **BREAKING** (by @apekshamehta) Removed tooltipBgColor property from Bar, Line and Scatter Charts. +* **BREAKING** (by @apekshamehta) Removed tooltipBgColor property from Bar, Line and Scatter Charts (you can now use `getTooltipColor` which provides more customizability), checkout the [full migration guide here](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/migration_guides/0.67.0/MIGRATION_00_67_00.md). +```dart +/// Migration guide: +/// This is the old way: +BarChartData( + barTouchData: BarTouchData( + touchTooltipData: BarTouchTooltipData( + tooltipBgColor: Colors.blueGrey, + ) + ) +) + +/// This is the new way: +BarChartData( + barTouchData: BarTouchData( + touchTooltipData: BarTouchTooltipData( + getTooltipColor: (BarChartGroupData group) => Colors.blueGrey, + ) + ) +) +``` ## 0.66.2 * **BUGFIX** (by @stwarwas) Remove dart.io to fix web platform issue, #1577 From f82c4961d0c2c1e0ae2aa7b29575b57fb6e44aa7 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Fri, 29 Mar 2024 01:34:57 +0330 Subject: [PATCH 127/149] Bump version to 0.67.0 --- CHANGELOG.md | 2 +- pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad0348987..3094cd2dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## newVersion +## 0.67.0 * **FEATURE** (by @julien4215) Add direction property to the [HorizontalLineLabel](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#horizontallinelabel) and [VerticalLineLabel](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#verticallinelabel), #1574 * **FEATURE** (by @apekshamehta) Added new method called getTooltipColor for axis charts (bar,line,scatter) to change background color of tooltip dynamically.[issue](https://github.com/imaNNeo/fl_chart/issues/1279). * **BREAKING** (by @apekshamehta) Removed tooltipBgColor property from Bar, Line and Scatter Charts (you can now use `getTooltipColor` which provides more customizability), checkout the [full migration guide here](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/migration_guides/0.67.0/MIGRATION_00_67_00.md). diff --git a/pubspec.yaml b/pubspec.yaml index ec542a720..cab8f6a0d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: fl_chart description: A highly customizable Flutter chart library that supports Line Chart, Bar Chart, Pie Chart, Scatter Chart, and Radar Chart. -version: 0.66.2 +version: 0.67.0 homepage: https://flchart.dev/ repository: https://github.com/imaNNeo/fl_chart issue_tracker: https://github.com/imaNNeo/fl_chart/issues From 930ac12e3280a52bf03207b6a933ec65c26ba1fe Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Fri, 29 Mar 2024 01:37:00 +0330 Subject: [PATCH 128/149] Update CHANGELOG.md --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3094cd2dd..0e4befda0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ +## newVersion + ## 0.67.0 * **FEATURE** (by @julien4215) Add direction property to the [HorizontalLineLabel](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#horizontallinelabel) and [VerticalLineLabel](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#verticallinelabel), #1574 -* **FEATURE** (by @apekshamehta) Added new method called getTooltipColor for axis charts (bar,line,scatter) to change background color of tooltip dynamically.[issue](https://github.com/imaNNeo/fl_chart/issues/1279). +* **FEATURE** (by @apekshamehta) Added new method called getTooltipColor for axis charts (bar,line,scatter) to change background color of tooltip dynamically, #1279. * **BREAKING** (by @apekshamehta) Removed tooltipBgColor property from Bar, Line and Scatter Charts (you can now use `getTooltipColor` which provides more customizability), checkout the [full migration guide here](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/migration_guides/0.67.0/MIGRATION_00_67_00.md). ```dart /// Migration guide: From 033e3679e7dca4dc046c8b51d533ffc060d727b1 Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sat, 26 Aug 2023 18:09:34 +0200 Subject: [PATCH 129/149] Add draggable logic for LineChart --- .../base/axis_chart/axis_chart_painter.dart | 19 ++++++ lib/src/chart/line_chart/line_chart.dart | 64 +++++++++++-------- lib/src/chart/line_chart/line_chart_data.dart | 8 +++ .../chart/line_chart/line_chart_painter.dart | 8 +++ 4 files changed, 73 insertions(+), 26 deletions(-) diff --git a/lib/src/chart/base/axis_chart/axis_chart_painter.dart b/lib/src/chart/base/axis_chart/axis_chart_painter.dart index 3b0ff7f03..74bec81d1 100644 --- a/lib/src/chart/base/axis_chart/axis_chart_painter.dart +++ b/lib/src/chart/base/axis_chart/axis_chart_painter.dart @@ -467,6 +467,25 @@ abstract class AxisChartPainter return viewSize.height - (((spotY - data.minY) / deltaY) * viewSize.height); } + /// Function converts pixelX and pixelY to the [FlSpot], + /// reversed logic of [getPixelY] and [getPixelX] + FlSpot getTouchedCoordinates( + double pixelX, + double pixelY, + Size viewSize, + PaintHolder holder, + ) { + final data = holder.data; + final deltaY = data.maxY - data.minY; + final deltaX = data.maxX - data.minX; + + final x = ((pixelX * deltaX) / viewSize.width) + data.minX; + final y = + ((viewSize.height - pixelY) * deltaY) / viewSize.height + data.minY; + + return FlSpot(x, y); + } + /// With this function we can get horizontal /// position for the tooltip. double getTooltipLeft( diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index f36321df9..3450e2b85 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -45,7 +45,21 @@ class _LineChartState extends AnimatedWidgetBaseState { final Map> _showingTouchedIndicators = {}; - final _lineChartHelper = LineChartHelper(); + List _lineBarsData = []; + + @override + void initState() { + _lineBarsData = widget.data.lineBarsData; + super.initState(); + } + + @override + void didUpdateWidget(covariant LineChart oldWidget) { + if (widget.data.lineBarsData != _lineBarsData) { + _lineBarsData = widget.data.lineBarsData; + } + super.didUpdateWidget(oldWidget); + } @override Widget build(BuildContext context) { @@ -79,35 +93,17 @@ class _LineChartState extends AnimatedWidgetBaseState { } LineChartData _getData() { - var newData = widget.data; - - /// Calculate minX, maxX, minY, maxY for [LineChartData] if they are null, - /// it is necessary to render the chart correctly. - if (newData.minX.isNaN || - newData.maxX.isNaN || - newData.minY.isNaN || - newData.maxY.isNaN) { - final values = _lineChartHelper.calculateMaxAxisValues( - newData.lineBarsData, - ); - newData = newData.copyWith( - minX: newData.minX.isNaN ? values.minX : newData.minX, - maxX: newData.maxX.isNaN ? values.maxX : newData.maxX, - minY: newData.minY.isNaN ? values.minY : newData.minY, - maxY: newData.maxY.isNaN ? values.maxY : newData.maxY, - ); - } - - final lineTouchData = newData.lineTouchData; + final lineTouchData = widget.data.lineTouchData; if (lineTouchData.enabled && lineTouchData.handleBuiltInTouches) { _providedTouchCallback = lineTouchData.touchCallback; - newData = newData.copyWith( - lineTouchData: - newData.lineTouchData.copyWith(touchCallback: _handleBuiltInTouch), + return widget.data.copyWith( + lineBarsData: _lineBarsData, + lineTouchData: widget.data.lineTouchData + .copyWith(touchCallback: _handleBuiltInTouch), ); } - return newData; + return widget.data.copyWith(lineBarsData: _lineBarsData); } void _handleBuiltInTouch( @@ -117,8 +113,8 @@ class _LineChartState extends AnimatedWidgetBaseState { if (!mounted) { return; } - _providedTouchCallback?.call(event, touchResponse); + _providedTouchCallback?.call(event, touchResponse); if (!event.isInterestedForInteractions || touchResponse?.lineBarSpots == null || touchResponse!.lineBarSpots!.isEmpty) { @@ -144,6 +140,22 @@ class _LineChartState extends AnimatedWidgetBaseState { ..clear() ..add(ShowingTooltipIndicators(sortedLineSpots)); }); + + if (event is FlPanStartEvent || event is FlPanUpdateEvent) { + final barIndex = touchResponse.lineBarSpots?.first.barIndex; + final spotIndex = touchResponse.lineBarSpots?.first.spotIndex; + final newDataSpot = touchResponse.lineBarSpots?.first.touchedAxesPoint; + + if (spotIndex != null && newDataSpot != null && barIndex != null) { + final isDraggable = widget.data.lineBarsData[barIndex].isDraggable; + + if (isDraggable) { + setState(() { + _lineBarsData[barIndex].spots[spotIndex] = newDataSpot; + }); + } + } + } } @override diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index c24127acf..8c086af17 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -241,6 +241,7 @@ class LineChartBarData with EquatableMixin { this.shadow = const Shadow(color: Colors.transparent), this.isStepLineChart = false, this.lineChartStepData = const LineChartStepData(), + this.isDraggable = false, }) : color = color ?? ((color == null && gradient == null) ? Colors.cyan : null), belowBarData = belowBarData ?? BarAreaData(), @@ -306,6 +307,9 @@ class LineChartBarData with EquatableMixin { /// Determines to show or hide the line. final bool show; + /// Determines if spots are draggable + final bool isDraggable; + /// If provided, this [LineChartBarData] draws with this [color] /// Otherwise we use [gradient] to draw the background. /// It throws an exception if you provide both [color] and [gradient] @@ -1195,10 +1199,14 @@ class TouchLineBarSpot extends LineBarSpot { super.barIndex, super.spot, this.distance, + this.touchedAxesPoint, ); /// Distance in pixels from where the user taped final double distance; + + /// Position in spots' values converted from local position + final FlSpot touchedAxesPoint; } /// Holds data of showing each row item in the tooltip popup. diff --git a/lib/src/chart/line_chart/line_chart_painter.dart b/lib/src/chart/line_chart/line_chart_painter.dart index b0f7c6cbd..edb2f0cd1 100644 --- a/lib/src/chart/line_chart/line_chart_painter.dart +++ b/lib/src/chart/line_chart/line_chart_painter.dart @@ -1263,6 +1263,13 @@ class LineChartPainter extends AxisChartPainter { return null; } + final axesPoint = getTouchedCoordinates( + touchedPoint.dx, + touchedPoint.dy, + viewSize, + holder, + ); + /// Find the nearest spot (based on distanceCalculator) final sortedSpots = []; double? smallestDistance; @@ -1294,6 +1301,7 @@ class LineChartPainter extends AxisChartPainter { barDataPosition, sortedSpots.first, smallestDistance!, + axesPoint, ); } else { return null; From dd241fbacca23d178ade275e621602f5cbc17c6d Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sat, 26 Aug 2023 20:41:27 +0200 Subject: [PATCH 130/149] Remake logic of updating spot's position and adjust tests --- lib/src/chart/line_chart/line_chart.dart | 39 ++++++++++++++----- lib/src/chart/line_chart/line_chart_data.dart | 29 ++++++++++---- .../chart/line_chart/line_chart_painter.dart | 23 ++++++----- .../chart/line_chart/line_chart_renderer.dart | 4 +- test/chart/data_pool.dart | 20 +++++++--- .../line_chart/line_chart_painter_test.dart | 32 ++++++++------- .../line_chart/line_chart_renderer_test.dart | 2 +- 7 files changed, 100 insertions(+), 49 deletions(-) diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index 3450e2b85..134a9e950 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -47,16 +47,22 @@ class _LineChartState extends AnimatedWidgetBaseState { List _lineBarsData = []; + /// Keeps index of bar and spot that currently is being dragging + (int barIndex, int spotIndex)? _draggingSpotIndexes; + + bool get _isAnyDraggable => + _lineBarsData.indexWhere((lineBarData) => lineBarData.isDraggable) != -1; + @override void initState() { - _lineBarsData = widget.data.lineBarsData; + _lineBarsData = List.from(widget.data.lineBarsData); super.initState(); } @override void didUpdateWidget(covariant LineChart oldWidget) { if (widget.data.lineBarsData != _lineBarsData) { - _lineBarsData = widget.data.lineBarsData; + _lineBarsData = List.from(widget.data.lineBarsData); } super.didUpdateWidget(oldWidget); } @@ -98,12 +104,14 @@ class _LineChartState extends AnimatedWidgetBaseState { _providedTouchCallback = lineTouchData.touchCallback; return widget.data.copyWith( lineBarsData: _lineBarsData, - lineTouchData: widget.data.lineTouchData - .copyWith(touchCallback: _handleBuiltInTouch), + lineTouchData: widget.data.lineTouchData.copyWith( + touchCallback: _handleBuiltInTouch, + distanceCalculator: _isAnyDraggable ? vectorDistanceCalculator : null, + ), ); } - return widget.data.copyWith(lineBarsData: _lineBarsData); + return widget.data; } void _handleBuiltInTouch( @@ -114,6 +122,20 @@ class _LineChartState extends AnimatedWidgetBaseState { return; } + if (event is FlPanEndEvent || event is FlLongPressEnd) { + setState(() { + _draggingSpotIndexes = null; + }); + } + + if (_draggingSpotIndexes != null) { + setState(() { + final (barIndex, spotIndex) = _draggingSpotIndexes!; + _lineBarsData[barIndex].spots[spotIndex] = + touchResponse!.touchedAxesPoint!; + }); + } + _providedTouchCallback?.call(event, touchResponse); if (!event.isInterestedForInteractions || touchResponse?.lineBarSpots == null || @@ -141,17 +163,16 @@ class _LineChartState extends AnimatedWidgetBaseState { ..add(ShowingTooltipIndicators(sortedLineSpots)); }); - if (event is FlPanStartEvent || event is FlPanUpdateEvent) { + if (event is FlPanStartEvent || event is FlLongPressStart) { final barIndex = touchResponse.lineBarSpots?.first.barIndex; final spotIndex = touchResponse.lineBarSpots?.first.spotIndex; - final newDataSpot = touchResponse.lineBarSpots?.first.touchedAxesPoint; - if (spotIndex != null && newDataSpot != null && barIndex != null) { + if (spotIndex != null && barIndex != null) { final isDraggable = widget.data.lineBarsData[barIndex].isDraggable; if (isDraggable) { setState(() { - _lineBarsData[barIndex].spots[spotIndex] = newDataSpot; + _draggingSpotIndexes = (barIndex, spotIndex); }); } } diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index 8c086af17..195734dbd 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -1,4 +1,5 @@ // coverage:ignore-file +import 'dart:math'; import 'dart:ui'; import 'package:equatable/equatable.dart'; @@ -222,7 +223,7 @@ class LineChartBarData with EquatableMixin { /// If you want to have a Step Line Chart style, just set [isStepLineChart] true, /// also you can tweak the [LineChartBarData.lineChartStepData]. LineChartBarData({ - this.spots = const [], + List spots = const [], this.show = true, Color? color, this.gradient, @@ -252,6 +253,7 @@ class LineChartBarData with EquatableMixin { FlSpot? mostBottom; FlSpot? firstValidSpot; + this.spots = List.from(spots); try { firstValidSpot = spots.firstWhere((element) => element != FlSpot.nullSpot); @@ -290,7 +292,7 @@ class LineChartBarData with EquatableMixin { /// /// You can have multiple lines by splitting them, /// put a [FlSpot.nullSpot] between each section. - final List spots; + late final List spots; /// We keep the most left spot to prevent redundant calculations late final FlSpot mostLeftSpot; @@ -380,6 +382,7 @@ class LineChartBarData with EquatableMixin { aboveBarData: BarAreaData.lerp(a.aboveBarData, b.aboveBarData, t), curveSmoothness: b.curveSmoothness, isCurved: b.isCurved, + isDraggable: b.isDraggable, isStrokeCapRound: b.isStrokeCapRound, isStrokeJoinRound: b.isStrokeJoinRound, preventCurveOverShooting: b.preventCurveOverShooting, @@ -991,6 +994,17 @@ double _xDistance(Offset touchPoint, Offset spotPixelCoordinates) { return (touchPoint.dx - spotPixelCoordinates.dx).abs(); } +/// distance calculator that calculates distance using vectors' math +double vectorDistanceCalculator( + Offset touchPoint, + Offset spotPixelCoordinates, +) { + return sqrt( + pow(touchPoint.dx - spotPixelCoordinates.dx, 2) + + pow(touchPoint.dy - spotPixelCoordinates.dy, 2), + ); +} + /// Default presentation of touched indicators. List defaultTouchedIndicators( LineChartBarData barData, @@ -1199,14 +1213,10 @@ class TouchLineBarSpot extends LineBarSpot { super.barIndex, super.spot, this.distance, - this.touchedAxesPoint, ); /// Distance in pixels from where the user taped final double distance; - - /// Position in spots' values converted from local position - final FlSpot touchedAxesPoint; } /// Holds data of showing each row item in the tooltip popup. @@ -1297,19 +1307,24 @@ class LineTouchResponse extends BaseTouchResponse { /// If touch happens, [LineChart] processes it internally and /// passes out a list of [lineBarSpots] it gives you information about the touched spot. /// They are sorted based on their distance to the touch event - const LineTouchResponse(this.lineBarSpots); + const LineTouchResponse(this.lineBarSpots, this.touchedAxesPoint); /// touch happened on these spots /// (if a single line provided on the chart, [lineBarSpots]'s length will be 1 always) final List? lineBarSpots; + /// Position in spots' values converted from local position + final FlSpot? touchedAxesPoint; + /// Copies current [LineTouchResponse] to a new [LineTouchResponse], /// and replaces provided values. LineTouchResponse copyWith({ List? lineBarSpots, + FlSpot? touchedAxesPoint, }) { return LineTouchResponse( lineBarSpots ?? this.lineBarSpots, + touchedAxesPoint ?? this.touchedAxesPoint, ); } } diff --git a/lib/src/chart/line_chart/line_chart_painter.dart b/lib/src/chart/line_chart/line_chart_painter.dart index edb2f0cd1..1b65da1ae 100644 --- a/lib/src/chart/line_chart/line_chart_painter.dart +++ b/lib/src/chart/line_chart/line_chart_painter.dart @@ -1221,7 +1221,7 @@ class LineChartPainter extends AxisChartPainter { /// Processes [localPosition] and checks /// the elements of the chart that are near the offset, /// then makes a [LineTouchResponse] from the elements that has been touched. - List? handleTouch( + LineTouchResponse handleTouch( Offset localPosition, Size size, PaintHolder holder, @@ -1244,9 +1244,20 @@ class LineChartPainter extends AxisChartPainter { } } + final axesPoint = getTouchedCoordinates( + localPosition.dx, + localPosition.dy, + size, + holder, + ); + touchedSpots.sort((a, b) => a.distance.compareTo(b.distance)); + final response = LineTouchResponse( + touchedSpots.isEmpty ? null : touchedSpots, + axesPoint, + ); - return touchedSpots.isEmpty ? null : touchedSpots; + return response; } /// find the nearest spot base on the touched offset @@ -1263,13 +1274,6 @@ class LineChartPainter extends AxisChartPainter { return null; } - final axesPoint = getTouchedCoordinates( - touchedPoint.dx, - touchedPoint.dy, - viewSize, - holder, - ); - /// Find the nearest spot (based on distanceCalculator) final sortedSpots = []; double? smallestDistance; @@ -1301,7 +1305,6 @@ class LineChartPainter extends AxisChartPainter { barDataPosition, sortedSpots.first, smallestDistance!, - axesPoint, ); } else { return null; diff --git a/lib/src/chart/line_chart/line_chart_renderer.dart b/lib/src/chart/line_chart/line_chart_renderer.dart index 9d57d6048..36edae197 100644 --- a/lib/src/chart/line_chart/line_chart_renderer.dart +++ b/lib/src/chart/line_chart/line_chart_renderer.dart @@ -103,11 +103,11 @@ class RenderLineChart extends RenderBaseChart { @override LineTouchResponse getResponseAtLocation(Offset localPosition) { - final touchedSpots = painter.handleTouch( + final touchedSpotsResponse = painter.handleTouch( localPosition, mockTestSize ?? size, paintHolder, ); - return LineTouchResponse(touchedSpots); + return touchedSpotsResponse; } } diff --git a/test/chart/data_pool.dart b/test/chart/data_pool.dart index 9dac57ad8..a7afe0304 100644 --- a/test/chart/data_pool.dart +++ b/test/chart/data_pool.dart @@ -329,7 +329,7 @@ class MockData { ); static final lineTouchResponse1 = - LineTouchResponse([lineBarSpot1, lineBarSpot2]); + LineTouchResponse([lineBarSpot1, lineBarSpot2], const FlSpot(1, 1)); static final barChartRodData1 = BarChartRodData(toY: 11); static final barChartRodData2 = BarChartRodData(toY: 22); @@ -1044,8 +1044,12 @@ final TouchLineBarSpot lineBarSpot1Clone = TouchLineBarSpot( 0, ); -final TouchLineBarSpot lineBarSpot2 = - TouchLineBarSpot(lineChartBarData1, 2, flSpot1, 2); +final TouchLineBarSpot lineBarSpot2 = TouchLineBarSpot( + lineChartBarData1, + 2, + flSpot1, + 2, +); final TouchLineBarSpot lineBarSpot3 = TouchLineBarSpot( lineChartBarData1, @@ -1059,12 +1063,14 @@ final LineTouchResponse lineTouchResponse1 = LineTouchResponse( lineBarSpot1, lineBarSpot2, ], + const FlSpot(1, 1), ); final LineTouchResponse lineTouchResponse1Clone = LineTouchResponse( [ lineBarSpot1Clone, lineBarSpot2, ], + const FlSpot(1, 1), ); final LineTouchResponse lineTouchResponse2 = LineTouchResponse( @@ -1072,17 +1078,18 @@ final LineTouchResponse lineTouchResponse2 = LineTouchResponse( lineBarSpot2, lineBarSpot1, ], + const FlSpot(1, 1), ); -const LineTouchResponse lineTouchResponse3 = LineTouchResponse( - [], -); +const LineTouchResponse lineTouchResponse3 = + LineTouchResponse([], FlSpot(1, 1)); final LineTouchResponse lineTouchResponse4 = LineTouchResponse( [ lineBarSpot1, lineBarSpot2, ], + const FlSpot(1, 1), ); final LineTouchResponse lineTouchResponse5 = LineTouchResponse( @@ -1090,6 +1097,7 @@ final LineTouchResponse lineTouchResponse5 = LineTouchResponse( lineBarSpot1, lineBarSpot2, ], + const FlSpot(1, 1), ); const TouchedSpotIndicatorData touchedSpotIndicatorData1 = diff --git a/test/chart/line_chart/line_chart_painter_test.dart b/test/chart/line_chart/line_chart_painter_test.dart index 7cad6c080..6f854625c 100644 --- a/test/chart/line_chart/line_chart_painter_test.dart +++ b/test/chart/line_chart/line_chart_painter_test.dart @@ -2805,7 +2805,7 @@ void main() { PaintHolder(data, data, TextScaler.noScaling); final touchResponse = lineChartPainter.handleTouch(const Offset(35, 0), viewSize, holder); - expect(touchResponse, null); + expect(touchResponse.lineBarSpots, null); }); test('test 2', () { @@ -2863,21 +2863,25 @@ void main() { PaintHolder(data, data, TextScaler.noScaling); expect( lineChartPainter - .handleTouch(const Offset(30, 0), viewSize, holder)! + .handleTouch(const Offset(30, 0), viewSize, holder) + .lineBarSpots! .length, 1, ); expect( - lineChartPainter.handleTouch( - const Offset(29.99, 0), - viewSize, - holder, - ), + lineChartPainter + .handleTouch( + const Offset(29.99, 0), + viewSize, + holder, + ) + .lineBarSpots, null, ); expect( lineChartPainter - .handleTouch(const Offset(10, 0), viewSize, holder)! + .handleTouch(const Offset(10, 0), viewSize, holder) + .lineBarSpots! .length, 2, ); @@ -2938,14 +2942,14 @@ void main() { PaintHolder(data, data, TextScaler.noScaling); final result1 = - lineChartPainter.handleTouch(const Offset(11, 0), viewSize, holder)!; - expect(result1[0].barIndex, 0); - expect(result1[1].barIndex, 1); + lineChartPainter.handleTouch(const Offset(11, 0), viewSize, holder); + expect(result1.lineBarSpots![0].barIndex, 0); + expect(result1.lineBarSpots![1].barIndex, 1); final result2 = - lineChartPainter.handleTouch(const Offset(12, 0), viewSize, holder)!; - expect(result2[0].barIndex, 1); - expect(result2[1].barIndex, 0); + lineChartPainter.handleTouch(const Offset(12, 0), viewSize, holder); + expect(result2.lineBarSpots![0].barIndex, 1); + expect(result2.lineBarSpots![1].barIndex, 0); }); }); diff --git a/test/chart/line_chart/line_chart_renderer_test.dart b/test/chart/line_chart/line_chart_renderer_test.dart index dde9635ea..1f6c6ca2a 100644 --- a/test/chart/line_chart/line_chart_renderer_test.dart +++ b/test/chart/line_chart/line_chart_renderer_test.dart @@ -97,7 +97,7 @@ void main() { 'size': inv.positionalArguments[1] as Size, 'paint_holder': inv.positionalArguments[2] as PaintHolder, }); - return MockData.lineTouchResponse1.lineBarSpots; + return MockData.lineTouchResponse1; }); final touchResponse = renderLineChart.getResponseAtLocation(MockData.offset1); From b060874a64beaec9ee6f1cb48e6f8f3ec899c246 Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sat, 26 Aug 2023 21:06:58 +0200 Subject: [PATCH 131/149] Add dragSpotUpdatedCallback functionality --- lib/src/chart/line_chart/line_chart.dart | 14 +++++++- lib/src/chart/line_chart/line_chart_data.dart | 34 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index 134a9e950..45fcae9b3 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -41,6 +41,8 @@ class _LineChartState extends AnimatedWidgetBaseState { /// but we need to keep the provided callback to notify it too. BaseTouchCallback? _providedTouchCallback; + DragSpotUpdatedCallback? _dragSpotUpdatedCallback; + final List _showingTouchedTooltips = []; final Map> _showingTouchedIndicators = {}; @@ -102,6 +104,7 @@ class _LineChartState extends AnimatedWidgetBaseState { final lineTouchData = widget.data.lineTouchData; if (lineTouchData.enabled && lineTouchData.handleBuiltInTouches) { _providedTouchCallback = lineTouchData.touchCallback; + _dragSpotUpdatedCallback = lineTouchData.dragSpotUpdatedCallback; return widget.data.copyWith( lineBarsData: _lineBarsData, lineTouchData: widget.data.lineTouchData.copyWith( @@ -122,18 +125,25 @@ class _LineChartState extends AnimatedWidgetBaseState { return; } + // Cancel dragging if (event is FlPanEndEvent || event is FlLongPressEnd) { setState(() { _draggingSpotIndexes = null; }); } + // if indexes of dragging spot exist, changes it's position if (_draggingSpotIndexes != null) { + final (barIndex, spotIndex) = _draggingSpotIndexes!; setState(() { - final (barIndex, spotIndex) = _draggingSpotIndexes!; _lineBarsData[barIndex].spots[spotIndex] = touchResponse!.touchedAxesPoint!; }); + _dragSpotUpdatedCallback?.call(UpdatedDragSpotsData( + barIndex, + spotIndex, + _lineBarsData[barIndex].spots, + )); } _providedTouchCallback?.call(event, touchResponse); @@ -163,6 +173,8 @@ class _LineChartState extends AnimatedWidgetBaseState { ..add(ShowingTooltipIndicators(sortedLineSpots)); }); + // If there is needed event and any lineBar with .isDraggable flag exists, + // sets indexes of needed spot and starts dragging process. if (event is FlPanStartEvent || event is FlLongPressStart) { final barIndex = touchResponse.lineBarSpots?.first.barIndex; final spotIndex = touchResponse.lineBarSpots?.first.spotIndex; diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index 195734dbd..c28277d4f 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -880,6 +880,7 @@ class LineTouchData extends FlTouchData with EquatableMixin { BaseTouchCallback? touchCallback, MouseCursorResolver? mouseCursorResolver, Duration? longPressDuration, + this.dragSpotUpdatedCallback, this.touchTooltipData = const LineTouchTooltipData(), this.getTouchedSpotIndicator = defaultTouchedIndicators, this.touchSpotThreshold = 10, @@ -900,6 +901,8 @@ class LineTouchData extends FlTouchData with EquatableMixin { /// Configs of how touch indicator looks like. final GetTouchedSpotIndicator getTouchedSpotIndicator; + final DragSpotUpdatedCallback? dragSpotUpdatedCallback; + /// Distance threshold to handle the touch event. final double touchSpotThreshold; @@ -924,6 +927,7 @@ class LineTouchData extends FlTouchData with EquatableMixin { bool? enabled, BaseTouchCallback? touchCallback, MouseCursorResolver? mouseCursorResolver, + DragSpotUpdatedCallback? dragSpotUpdatedCallback, Duration? longPressDuration, LineTouchTooltipData? touchTooltipData, GetTouchedSpotIndicator? getTouchedSpotIndicator, @@ -937,6 +941,8 @@ class LineTouchData extends FlTouchData with EquatableMixin { enabled: enabled ?? this.enabled, touchCallback: touchCallback ?? this.touchCallback, mouseCursorResolver: mouseCursorResolver ?? this.mouseCursorResolver, + dragSpotUpdatedCallback: + dragSpotUpdatedCallback ?? this.dragSpotUpdatedCallback, longPressDuration: longPressDuration ?? this.longPressDuration, touchTooltipData: touchTooltipData ?? this.touchTooltipData, getTouchedSpotIndicator: @@ -963,6 +969,7 @@ class LineTouchData extends FlTouchData with EquatableMixin { handleBuiltInTouches, getTouchLineStart, getTouchLineEnd, + dragSpotUpdatedCallback, ]; } @@ -989,6 +996,8 @@ typedef CalculateTouchDistance = double Function( Offset spotPixelCoordinates, ); +typedef DragSpotUpdatedCallback = void Function(UpdatedDragSpotsData); + /// Default distanceCalculator only considers distance on x axis double _xDistance(Offset touchPoint, Offset spotPixelCoordinates) { return (touchPoint.dx - spotPixelCoordinates.dx).abs(); @@ -1206,6 +1215,31 @@ class LineBarSpot extends FlSpot with EquatableMixin { ]; } +/// Contains information about spots that have been updated using dragging feature. +class UpdatedDragSpotsData with EquatableMixin { + const UpdatedDragSpotsData( + this.updatedBarIndex, + this.updatedSpotIndex, + this.newSpots, + ); + + /// Index of updated bar + final int updatedBarIndex; + + /// Index of updated spot + final int updatedSpotIndex; + + /// New list of spots in updated line bar + final List newSpots; + + @override + List get props => [ + updatedBarIndex, + updatedSpotIndex, + newSpots, + ]; +} + /// A [LineBarSpot] that holds information about the event that selected it class TouchLineBarSpot extends LineBarSpot { TouchLineBarSpot( From b4819230039a2235a604e7c1f29a22bdd58bbe1b Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sat, 26 Aug 2023 21:16:48 +0200 Subject: [PATCH 132/149] Update changelog --- lib/src/chart/line_chart/line_chart.dart | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index 45fcae9b3..c5fcf1659 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -139,11 +139,13 @@ class _LineChartState extends AnimatedWidgetBaseState { _lineBarsData[barIndex].spots[spotIndex] = touchResponse!.touchedAxesPoint!; }); - _dragSpotUpdatedCallback?.call(UpdatedDragSpotsData( - barIndex, - spotIndex, - _lineBarsData[barIndex].spots, - )); + _dragSpotUpdatedCallback?.call( + UpdatedDragSpotsData( + barIndex, + spotIndex, + _lineBarsData[barIndex].spots, + ), + ); } _providedTouchCallback?.call(event, touchResponse); From 0cd35907b70cf52321f6a1b3136a4da6046f9fdf Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sat, 26 Aug 2023 21:46:12 +0200 Subject: [PATCH 133/149] Add sample of draggable line chart --- .../presentation/samples/chart_samples.dart | 2 + .../samples/line/line_chart_sample12.dart | 132 ++++++++++++++++++ lib/src/chart/line_chart/line_chart.dart | 24 ++-- lib/src/chart/line_chart/line_chart_data.dart | 14 +- 4 files changed, 155 insertions(+), 17 deletions(-) create mode 100644 example/lib/presentation/samples/line/line_chart_sample12.dart diff --git a/example/lib/presentation/samples/chart_samples.dart b/example/lib/presentation/samples/chart_samples.dart index 98e090148..ca42b9c70 100644 --- a/example/lib/presentation/samples/chart_samples.dart +++ b/example/lib/presentation/samples/chart_samples.dart @@ -12,6 +12,7 @@ import 'chart_sample.dart'; import 'line/line_chart_sample1.dart'; import 'line/line_chart_sample10.dart'; import 'line/line_chart_sample11.dart'; +import 'line/line_chart_sample12.dart'; import 'line/line_chart_sample2.dart'; import 'line/line_chart_sample3.dart'; import 'line/line_chart_sample4.dart'; @@ -41,6 +42,7 @@ class ChartSamples { LineChartSample(9, (context) => LineChartSample9()), LineChartSample(10, (context) => const LineChartSample10()), LineChartSample(11, (context) => const LineChartSample11()), + LineChartSample(11, (context) => const LineChartSample12()), ], ChartType.bar: [ BarChartSample(1, (context) => BarChartSample1()), diff --git a/example/lib/presentation/samples/line/line_chart_sample12.dart b/example/lib/presentation/samples/line/line_chart_sample12.dart new file mode 100644 index 000000000..102f644a4 --- /dev/null +++ b/example/lib/presentation/samples/line/line_chart_sample12.dart @@ -0,0 +1,132 @@ +import 'package:fl_chart/fl_chart.dart'; +import 'package:fl_chart_app/presentation/resources/app_colors.dart'; +import 'package:flutter/material.dart'; + +class LineChartSample12 extends StatefulWidget { + const LineChartSample12({super.key}); + + @override + State createState() => _LineChartSample12State(); +} + +class _LineChartSample12State extends State { + List get spots1 => [ + const FlSpot(1, 3), + const FlSpot(2, 2), + const FlSpot(4, 5), + const FlSpot(6, 4), + ]; + List get spots2 => [ + const FlSpot(1, 1), + const FlSpot(2, 4), + const FlSpot(3, 6), + const FlSpot(5, 3), + ]; + + UpdatedDragSpotsData? _lastUpdate; + + void _onUpdated(UpdatedDragSpotsData newUpdate) { + setState(() { + _lastUpdate = newUpdate; + }); + } + + String get _formattedLastSpotValue { + if (_lastUpdate == null) { + return 'Updated spot: None'; + } + + final flSpot = _lastUpdate!.newSpots[_lastUpdate!.updatedSpotIndex]; + + return 'new X: ${flSpot.x.toStringAsFixed(2)}, new Y: ${flSpot.y.toStringAsFixed(2)}'; + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + const SizedBox(height: 12), + Text( + 'Last updated bar index: ${_lastUpdate?.updatedBarIndex ?? 'none'}', + style: const TextStyle( + color: AppColors.mainTextColor2, + fontSize: 12, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 12), + Text( + 'Last updated spot index: ${_lastUpdate?.updatedSpotIndex ?? 'none'}', + style: const TextStyle( + color: AppColors.mainTextColor2, + fontSize: 12, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 12), + Text( + _formattedLastSpotValue, + style: const TextStyle( + color: AppColors.mainTextColor2, + fontSize: 12, + fontWeight: FontWeight.bold, + ), + ), + AspectRatio( + aspectRatio: 1, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 24.0, + vertical: 10, + ), + child: LayoutBuilder(builder: (context, constraints) { + return LineChart( + LineChartData( + minY: 0, + minX: 0, + maxX: 8, + maxY: 8, + lineTouchData: LineTouchData( + enabled: true, + handleBuiltInTouches: true, + dragSpotUpdateFinishedCallback: _onUpdated, + getTouchedSpotIndicator: + (LineChartBarData barData, List spotIndexes) { + return spotIndexes.map((index) {}).toList(); + }, + touchTooltipData: LineTouchTooltipData( + tooltipBgColor: Colors.transparent, + getTooltipItems: (List lineBarsSpot) { + return lineBarsSpot.map((lineBarSpot) {}).toList(); + }, + ), + ), + lineBarsData: [ + LineChartBarData( + spots: spots1, + isCurved: true, + isDraggable: true, + ), + LineChartBarData( + spots: spots2, + isCurved: true, + isDraggable: false, + color: Colors.red, + ), + ], + gridData: const FlGridData(show: false), + borderData: FlBorderData( + show: true, + border: Border.all( + color: AppColors.borderColor, + ), + ), + ), + ); + }), + ), + ), + ], + ); + } +} diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index c5fcf1659..d1a8e3f54 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -3,6 +3,7 @@ import 'package:fl_chart/src/chart/base/axis_chart/axis_chart_scaffold_widget.da import 'package:fl_chart/src/chart/line_chart/line_chart_helper.dart'; import 'package:fl_chart/src/chart/line_chart/line_chart_renderer.dart'; import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; /// Renders a line chart as a widget, using provided [LineChartData]. @@ -41,7 +42,7 @@ class _LineChartState extends AnimatedWidgetBaseState { /// but we need to keep the provided callback to notify it too. BaseTouchCallback? _providedTouchCallback; - DragSpotUpdatedCallback? _dragSpotUpdatedCallback; + DragSpotUpdateFinishedCallback? _dragSpotUpdatedCallback; final List _showingTouchedTooltips = []; @@ -63,7 +64,7 @@ class _LineChartState extends AnimatedWidgetBaseState { @override void didUpdateWidget(covariant LineChart oldWidget) { - if (widget.data.lineBarsData != _lineBarsData) { + if (!listEquals(oldWidget.data.lineBarsData, widget.data.lineBarsData)) { _lineBarsData = List.from(widget.data.lineBarsData); } super.didUpdateWidget(oldWidget); @@ -104,7 +105,7 @@ class _LineChartState extends AnimatedWidgetBaseState { final lineTouchData = widget.data.lineTouchData; if (lineTouchData.enabled && lineTouchData.handleBuiltInTouches) { _providedTouchCallback = lineTouchData.touchCallback; - _dragSpotUpdatedCallback = lineTouchData.dragSpotUpdatedCallback; + _dragSpotUpdatedCallback = lineTouchData.dragSpotUpdateFinishedCallback; return widget.data.copyWith( lineBarsData: _lineBarsData, lineTouchData: widget.data.lineTouchData.copyWith( @@ -127,6 +128,16 @@ class _LineChartState extends AnimatedWidgetBaseState { // Cancel dragging if (event is FlPanEndEvent || event is FlLongPressEnd) { + if (_draggingSpotIndexes != null) { + final (barIndex, spotIndex) = _draggingSpotIndexes!; + _dragSpotUpdatedCallback?.call( + UpdatedDragSpotsData( + barIndex, + spotIndex, + _lineBarsData[barIndex].spots, + ), + ); + } setState(() { _draggingSpotIndexes = null; }); @@ -139,13 +150,6 @@ class _LineChartState extends AnimatedWidgetBaseState { _lineBarsData[barIndex].spots[spotIndex] = touchResponse!.touchedAxesPoint!; }); - _dragSpotUpdatedCallback?.call( - UpdatedDragSpotsData( - barIndex, - spotIndex, - _lineBarsData[barIndex].spots, - ), - ); } _providedTouchCallback?.call(event, touchResponse); diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index c28277d4f..f729cdef4 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -880,7 +880,7 @@ class LineTouchData extends FlTouchData with EquatableMixin { BaseTouchCallback? touchCallback, MouseCursorResolver? mouseCursorResolver, Duration? longPressDuration, - this.dragSpotUpdatedCallback, + this.dragSpotUpdateFinishedCallback, this.touchTooltipData = const LineTouchTooltipData(), this.getTouchedSpotIndicator = defaultTouchedIndicators, this.touchSpotThreshold = 10, @@ -901,7 +901,7 @@ class LineTouchData extends FlTouchData with EquatableMixin { /// Configs of how touch indicator looks like. final GetTouchedSpotIndicator getTouchedSpotIndicator; - final DragSpotUpdatedCallback? dragSpotUpdatedCallback; + final DragSpotUpdateFinishedCallback? dragSpotUpdateFinishedCallback; /// Distance threshold to handle the touch event. final double touchSpotThreshold; @@ -927,7 +927,7 @@ class LineTouchData extends FlTouchData with EquatableMixin { bool? enabled, BaseTouchCallback? touchCallback, MouseCursorResolver? mouseCursorResolver, - DragSpotUpdatedCallback? dragSpotUpdatedCallback, + DragSpotUpdateFinishedCallback? dragSpotUpdateFinishedCallback, Duration? longPressDuration, LineTouchTooltipData? touchTooltipData, GetTouchedSpotIndicator? getTouchedSpotIndicator, @@ -941,8 +941,8 @@ class LineTouchData extends FlTouchData with EquatableMixin { enabled: enabled ?? this.enabled, touchCallback: touchCallback ?? this.touchCallback, mouseCursorResolver: mouseCursorResolver ?? this.mouseCursorResolver, - dragSpotUpdatedCallback: - dragSpotUpdatedCallback ?? this.dragSpotUpdatedCallback, + dragSpotUpdateFinishedCallback: + dragSpotUpdateFinishedCallback ?? this.dragSpotUpdateFinishedCallback, longPressDuration: longPressDuration ?? this.longPressDuration, touchTooltipData: touchTooltipData ?? this.touchTooltipData, getTouchedSpotIndicator: @@ -969,7 +969,7 @@ class LineTouchData extends FlTouchData with EquatableMixin { handleBuiltInTouches, getTouchLineStart, getTouchLineEnd, - dragSpotUpdatedCallback, + dragSpotUpdateFinishedCallback, ]; } @@ -996,7 +996,7 @@ typedef CalculateTouchDistance = double Function( Offset spotPixelCoordinates, ); -typedef DragSpotUpdatedCallback = void Function(UpdatedDragSpotsData); +typedef DragSpotUpdateFinishedCallback = void Function(UpdatedDragSpotsData); /// Default distanceCalculator only considers distance on x axis double _xDistance(Offset touchPoint, Offset spotPixelCoordinates) { From cd3e422ae0aa8febdda2cc9432b60586d1a8d45f Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sat, 26 Aug 2023 22:32:35 +0200 Subject: [PATCH 134/149] minor fixes --- example/lib/presentation/samples/chart_samples.dart | 2 +- lib/src/chart/line_chart/line_chart.dart | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/example/lib/presentation/samples/chart_samples.dart b/example/lib/presentation/samples/chart_samples.dart index ca42b9c70..e058a1e8d 100644 --- a/example/lib/presentation/samples/chart_samples.dart +++ b/example/lib/presentation/samples/chart_samples.dart @@ -42,7 +42,7 @@ class ChartSamples { LineChartSample(9, (context) => LineChartSample9()), LineChartSample(10, (context) => const LineChartSample10()), LineChartSample(11, (context) => const LineChartSample11()), - LineChartSample(11, (context) => const LineChartSample12()), + LineChartSample(12, (context) => const LineChartSample12()), ], ChartType.bar: [ BarChartSample(1, (context) => BarChartSample1()), diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index d1a8e3f54..d19e33d12 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -64,7 +64,18 @@ class _LineChartState extends AnimatedWidgetBaseState { @override void didUpdateWidget(covariant LineChart oldWidget) { - if (!listEquals(oldWidget.data.lineBarsData, widget.data.lineBarsData)) { + final oldSpots = oldWidget.data.lineBarsData + .map((e) => e.spots) + .toList() + .expand((list) => list) + .toList(); + final currentSpots = oldWidget.data.lineBarsData + .map((e) => e.spots) + .toList() + .expand((list) => list) + .toList(); + + if (!listEquals(oldSpots, currentSpots)) { _lineBarsData = List.from(widget.data.lineBarsData); } super.didUpdateWidget(oldWidget); From fc35f04230aab7939d26fcbe29b00880e98fca21 Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sat, 26 Aug 2023 23:31:00 +0200 Subject: [PATCH 135/149] Change the comparing logic in didUpdateWidget --- lib/src/chart/line_chart/line_chart.dart | 14 +++++++++++++- lib/src/chart/line_chart/line_chart_data.dart | 1 + 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index d19e33d12..f7b912b9e 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -58,12 +58,24 @@ class _LineChartState extends AnimatedWidgetBaseState { @override void initState() { - _lineBarsData = List.from(widget.data.lineBarsData); + _lineBarsData = List.from( + widget.data.lineBarsData + .map((lineBarData) => lineBarData.copyWith()) + .toList(), + ); super.initState(); } @override void didUpdateWidget(covariant LineChart oldWidget) { + if (!listEquals(oldWidget.data.lineBarsData, widget.data.lineBarsData)) { + _lineBarsData = List.from( + widget.data.lineBarsData + .map((lineBarData) => lineBarData.copyWith()) + .toList(), + ); + } + final oldSpots = oldWidget.data.lineBarsData .map((e) => e.spots) .toList() diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index f729cdef4..dd9d66196 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -474,6 +474,7 @@ class LineChartBarData with EquatableMixin { shadow, isStepLineChart, lineChartStepData, + isDraggable, ]; } From 74f7ed515ac059582d6d00e4ac8b96fd4d7aaec0 Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sun, 27 Aug 2023 00:06:49 +0200 Subject: [PATCH 136/149] Removed unnecessary logic --- lib/src/chart/line_chart/line_chart.dart | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index f7b912b9e..b31c46e6a 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -75,21 +75,6 @@ class _LineChartState extends AnimatedWidgetBaseState { .toList(), ); } - - final oldSpots = oldWidget.data.lineBarsData - .map((e) => e.spots) - .toList() - .expand((list) => list) - .toList(); - final currentSpots = oldWidget.data.lineBarsData - .map((e) => e.spots) - .toList() - .expand((list) => list) - .toList(); - - if (!listEquals(oldSpots, currentSpots)) { - _lineBarsData = List.from(widget.data.lineBarsData); - } super.didUpdateWidget(oldWidget); } From c298aac17f2e3be046b6a5924b8036ace99c8de5 Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sun, 1 Oct 2023 14:13:21 +0200 Subject: [PATCH 137/149] Add draggable callbacks --- lib/src/chart/line_chart/line_chart.dart | 23 ++++++++++++++++--- lib/src/chart/line_chart/line_chart_data.dart | 23 ++++++++++++++++--- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index b31c46e6a..c1764ae76 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -42,7 +42,9 @@ class _LineChartState extends AnimatedWidgetBaseState { /// but we need to keep the provided callback to notify it too. BaseTouchCallback? _providedTouchCallback; - DragSpotUpdateFinishedCallback? _dragSpotUpdatedCallback; + DragSpotUpdateCallback? _dragSpotUpdateFinishedCallback; + DragSpotUpdateCallback? _dragSpotUpdateCallback; + DragSpotUpdateCallback? _dragSpotUpdateStartedCallback; final List _showingTouchedTooltips = []; @@ -113,7 +115,8 @@ class _LineChartState extends AnimatedWidgetBaseState { final lineTouchData = widget.data.lineTouchData; if (lineTouchData.enabled && lineTouchData.handleBuiltInTouches) { _providedTouchCallback = lineTouchData.touchCallback; - _dragSpotUpdatedCallback = lineTouchData.dragSpotUpdateFinishedCallback; + _dragSpotUpdateFinishedCallback = + lineTouchData.dragSpotUpdateFinishedCallback; return widget.data.copyWith( lineBarsData: _lineBarsData, lineTouchData: widget.data.lineTouchData.copyWith( @@ -138,7 +141,7 @@ class _LineChartState extends AnimatedWidgetBaseState { if (event is FlPanEndEvent || event is FlLongPressEnd) { if (_draggingSpotIndexes != null) { final (barIndex, spotIndex) = _draggingSpotIndexes!; - _dragSpotUpdatedCallback?.call( + _dragSpotUpdateFinishedCallback?.call( UpdatedDragSpotsData( barIndex, spotIndex, @@ -158,6 +161,13 @@ class _LineChartState extends AnimatedWidgetBaseState { _lineBarsData[barIndex].spots[spotIndex] = touchResponse!.touchedAxesPoint!; }); + _dragSpotUpdateCallback?.call( + UpdatedDragSpotsData( + barIndex, + spotIndex, + _lineBarsData[barIndex].spots, + ), + ); } _providedTouchCallback?.call(event, touchResponse); @@ -201,6 +211,13 @@ class _LineChartState extends AnimatedWidgetBaseState { _draggingSpotIndexes = (barIndex, spotIndex); }); } + _dragSpotUpdateStartedCallback?.call( + UpdatedDragSpotsData( + barIndex, + spotIndex, + _lineBarsData[barIndex].spots, + ), + ); } } } diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index dd9d66196..e1f8606bf 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -882,6 +882,8 @@ class LineTouchData extends FlTouchData with EquatableMixin { MouseCursorResolver? mouseCursorResolver, Duration? longPressDuration, this.dragSpotUpdateFinishedCallback, + this.dragSpotUpdateCallback, + this.dragSpotUpdateStartedCallback, this.touchTooltipData = const LineTouchTooltipData(), this.getTouchedSpotIndicator = defaultTouchedIndicators, this.touchSpotThreshold = 10, @@ -902,7 +904,14 @@ class LineTouchData extends FlTouchData with EquatableMixin { /// Configs of how touch indicator looks like. final GetTouchedSpotIndicator getTouchedSpotIndicator; - final DragSpotUpdateFinishedCallback? dragSpotUpdateFinishedCallback; + /// Action when dragging of draggable spot is finished. + final DragSpotUpdateCallback? dragSpotUpdateFinishedCallback; + + /// Action when draggable spot has been updated. + final DragSpotUpdateCallback? dragSpotUpdateCallback; + + /// Action when dragging of draggable spot has been started + final DragSpotUpdateCallback? dragSpotUpdateStartedCallback; /// Distance threshold to handle the touch event. final double touchSpotThreshold; @@ -928,7 +937,9 @@ class LineTouchData extends FlTouchData with EquatableMixin { bool? enabled, BaseTouchCallback? touchCallback, MouseCursorResolver? mouseCursorResolver, - DragSpotUpdateFinishedCallback? dragSpotUpdateFinishedCallback, + DragSpotUpdateCallback? dragSpotUpdateFinishedCallback, + DragSpotUpdateCallback? dragSpotUpdateCallback, + DragSpotUpdateCallback? dragSpotUpdateStartedCallback, Duration? longPressDuration, LineTouchTooltipData? touchTooltipData, GetTouchedSpotIndicator? getTouchedSpotIndicator, @@ -944,6 +955,10 @@ class LineTouchData extends FlTouchData with EquatableMixin { mouseCursorResolver: mouseCursorResolver ?? this.mouseCursorResolver, dragSpotUpdateFinishedCallback: dragSpotUpdateFinishedCallback ?? this.dragSpotUpdateFinishedCallback, + dragSpotUpdateCallback: + dragSpotUpdateCallback ?? this.dragSpotUpdateCallback, + dragSpotUpdateStartedCallback: + dragSpotUpdateStartedCallback ?? this.dragSpotUpdateStartedCallback, longPressDuration: longPressDuration ?? this.longPressDuration, touchTooltipData: touchTooltipData ?? this.touchTooltipData, getTouchedSpotIndicator: @@ -971,6 +986,8 @@ class LineTouchData extends FlTouchData with EquatableMixin { getTouchLineStart, getTouchLineEnd, dragSpotUpdateFinishedCallback, + dragSpotUpdateCallback, + dragSpotUpdateStartedCallback, ]; } @@ -997,7 +1014,7 @@ typedef CalculateTouchDistance = double Function( Offset spotPixelCoordinates, ); -typedef DragSpotUpdateFinishedCallback = void Function(UpdatedDragSpotsData); +typedef DragSpotUpdateCallback = void Function(UpdatedDragSpotsData); /// Default distanceCalculator only considers distance on x axis double _xDistance(Offset touchPoint, Offset spotPixelCoordinates) { From ba182179276d9a7d618f0351e4410079a0d29932 Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sat, 26 Aug 2023 18:09:34 +0200 Subject: [PATCH 138/149] Add draggable logic for LineChart --- lib/src/chart/line_chart/line_chart_data.dart | 4 ++++ lib/src/chart/line_chart/line_chart_painter.dart | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index e1f8606bf..c1f3b9e1b 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -1265,10 +1265,14 @@ class TouchLineBarSpot extends LineBarSpot { super.barIndex, super.spot, this.distance, + this.touchedAxesPoint, ); /// Distance in pixels from where the user taped final double distance; + + /// Position in spots' values converted from local position + final FlSpot touchedAxesPoint; } /// Holds data of showing each row item in the tooltip popup. diff --git a/lib/src/chart/line_chart/line_chart_painter.dart b/lib/src/chart/line_chart/line_chart_painter.dart index 1b65da1ae..40b519e38 100644 --- a/lib/src/chart/line_chart/line_chart_painter.dart +++ b/lib/src/chart/line_chart/line_chart_painter.dart @@ -1274,6 +1274,13 @@ class LineChartPainter extends AxisChartPainter { return null; } + final axesPoint = getTouchedCoordinates( + touchedPoint.dx, + touchedPoint.dy, + viewSize, + holder, + ); + /// Find the nearest spot (based on distanceCalculator) final sortedSpots = []; double? smallestDistance; @@ -1305,6 +1312,7 @@ class LineChartPainter extends AxisChartPainter { barDataPosition, sortedSpots.first, smallestDistance!, + axesPoint, ); } else { return null; From b4767433c8352e879cc63224662f3fbbfa131890 Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sat, 26 Aug 2023 20:41:27 +0200 Subject: [PATCH 139/149] Remake logic of updating spot's position and adjust tests --- lib/src/chart/line_chart/line_chart_data.dart | 4 ---- lib/src/chart/line_chart/line_chart_painter.dart | 8 -------- 2 files changed, 12 deletions(-) diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index c1f3b9e1b..e1f8606bf 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -1265,14 +1265,10 @@ class TouchLineBarSpot extends LineBarSpot { super.barIndex, super.spot, this.distance, - this.touchedAxesPoint, ); /// Distance in pixels from where the user taped final double distance; - - /// Position in spots' values converted from local position - final FlSpot touchedAxesPoint; } /// Holds data of showing each row item in the tooltip popup. diff --git a/lib/src/chart/line_chart/line_chart_painter.dart b/lib/src/chart/line_chart/line_chart_painter.dart index 40b519e38..1b65da1ae 100644 --- a/lib/src/chart/line_chart/line_chart_painter.dart +++ b/lib/src/chart/line_chart/line_chart_painter.dart @@ -1274,13 +1274,6 @@ class LineChartPainter extends AxisChartPainter { return null; } - final axesPoint = getTouchedCoordinates( - touchedPoint.dx, - touchedPoint.dy, - viewSize, - holder, - ); - /// Find the nearest spot (based on distanceCalculator) final sortedSpots = []; double? smallestDistance; @@ -1312,7 +1305,6 @@ class LineChartPainter extends AxisChartPainter { barDataPosition, sortedSpots.first, smallestDistance!, - axesPoint, ); } else { return null; From 0d5026c6e101c8403e923c4534458ff71b824c21 Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sun, 1 Oct 2023 14:41:15 +0200 Subject: [PATCH 140/149] Add initializations for drag feature callbacks --- lib/src/chart/line_chart/line_chart.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index c1764ae76..cd8c4eded 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -117,6 +117,9 @@ class _LineChartState extends AnimatedWidgetBaseState { _providedTouchCallback = lineTouchData.touchCallback; _dragSpotUpdateFinishedCallback = lineTouchData.dragSpotUpdateFinishedCallback; + _dragSpotUpdateCallback = lineTouchData.dragSpotUpdateCallback; + _dragSpotUpdateStartedCallback = + lineTouchData.dragSpotUpdateStartedCallback; return widget.data.copyWith( lineBarsData: _lineBarsData, lineTouchData: widget.data.lineTouchData.copyWith( From e4509e03ca1f44eb14d481d7127a549b291e65de Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sat, 26 Aug 2023 18:09:34 +0200 Subject: [PATCH 141/149] Add draggable logic for LineChart --- lib/src/chart/line_chart/line_chart_data.dart | 4 ++++ lib/src/chart/line_chart/line_chart_painter.dart | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index e1f8606bf..c1f3b9e1b 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -1265,10 +1265,14 @@ class TouchLineBarSpot extends LineBarSpot { super.barIndex, super.spot, this.distance, + this.touchedAxesPoint, ); /// Distance in pixels from where the user taped final double distance; + + /// Position in spots' values converted from local position + final FlSpot touchedAxesPoint; } /// Holds data of showing each row item in the tooltip popup. diff --git a/lib/src/chart/line_chart/line_chart_painter.dart b/lib/src/chart/line_chart/line_chart_painter.dart index 1b65da1ae..40b519e38 100644 --- a/lib/src/chart/line_chart/line_chart_painter.dart +++ b/lib/src/chart/line_chart/line_chart_painter.dart @@ -1274,6 +1274,13 @@ class LineChartPainter extends AxisChartPainter { return null; } + final axesPoint = getTouchedCoordinates( + touchedPoint.dx, + touchedPoint.dy, + viewSize, + holder, + ); + /// Find the nearest spot (based on distanceCalculator) final sortedSpots = []; double? smallestDistance; @@ -1305,6 +1312,7 @@ class LineChartPainter extends AxisChartPainter { barDataPosition, sortedSpots.first, smallestDistance!, + axesPoint, ); } else { return null; From a32517543ed8f7ba9486929f3cc06936fbf68c1d Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sat, 26 Aug 2023 20:41:27 +0200 Subject: [PATCH 142/149] Remake logic of updating spot's position and adjust tests --- lib/src/chart/line_chart/line_chart_data.dart | 4 ---- lib/src/chart/line_chart/line_chart_painter.dart | 8 -------- 2 files changed, 12 deletions(-) diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index c1f3b9e1b..e1f8606bf 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -1265,14 +1265,10 @@ class TouchLineBarSpot extends LineBarSpot { super.barIndex, super.spot, this.distance, - this.touchedAxesPoint, ); /// Distance in pixels from where the user taped final double distance; - - /// Position in spots' values converted from local position - final FlSpot touchedAxesPoint; } /// Holds data of showing each row item in the tooltip popup. diff --git a/lib/src/chart/line_chart/line_chart_painter.dart b/lib/src/chart/line_chart/line_chart_painter.dart index 40b519e38..1b65da1ae 100644 --- a/lib/src/chart/line_chart/line_chart_painter.dart +++ b/lib/src/chart/line_chart/line_chart_painter.dart @@ -1274,13 +1274,6 @@ class LineChartPainter extends AxisChartPainter { return null; } - final axesPoint = getTouchedCoordinates( - touchedPoint.dx, - touchedPoint.dy, - viewSize, - holder, - ); - /// Find the nearest spot (based on distanceCalculator) final sortedSpots = []; double? smallestDistance; @@ -1312,7 +1305,6 @@ class LineChartPainter extends AxisChartPainter { barDataPosition, sortedSpots.first, smallestDistance!, - axesPoint, ); } else { return null; From 916c1e15f91a0cbcedc8531f01d5fb342f46cc37 Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sat, 26 Aug 2023 23:31:00 +0200 Subject: [PATCH 143/149] Change the comparing logic in didUpdateWidget --- lib/src/chart/line_chart/line_chart.dart | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index cd8c4eded..cc29ee913 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -77,6 +77,21 @@ class _LineChartState extends AnimatedWidgetBaseState { .toList(), ); } + + final oldSpots = oldWidget.data.lineBarsData + .map((e) => e.spots) + .toList() + .expand((list) => list) + .toList(); + final currentSpots = oldWidget.data.lineBarsData + .map((e) => e.spots) + .toList() + .expand((list) => list) + .toList(); + + if (!listEquals(oldSpots, currentSpots)) { + _lineBarsData = List.from(widget.data.lineBarsData); + } super.didUpdateWidget(oldWidget); } From 9d283be79f7ce2e7d739a773fdf2f3b13343c238 Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Sun, 27 Aug 2023 00:06:49 +0200 Subject: [PATCH 144/149] Removed unnecessary logic --- lib/src/chart/line_chart/line_chart.dart | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index cc29ee913..cd8c4eded 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -77,21 +77,6 @@ class _LineChartState extends AnimatedWidgetBaseState { .toList(), ); } - - final oldSpots = oldWidget.data.lineBarsData - .map((e) => e.spots) - .toList() - .expand((list) => list) - .toList(); - final currentSpots = oldWidget.data.lineBarsData - .map((e) => e.spots) - .toList() - .expand((list) => list) - .toList(); - - if (!listEquals(oldSpots, currentSpots)) { - _lineBarsData = List.from(widget.data.lineBarsData); - } super.didUpdateWidget(oldWidget); } From 6870cd4c6329296e0e8bb32f09356b4bc0d5f0bf Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Fri, 29 Mar 2024 16:32:05 +0100 Subject: [PATCH 145/149] fix example --- example/lib/presentation/samples/line/line_chart_sample12.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/example/lib/presentation/samples/line/line_chart_sample12.dart b/example/lib/presentation/samples/line/line_chart_sample12.dart index 102f644a4..63ea72625 100644 --- a/example/lib/presentation/samples/line/line_chart_sample12.dart +++ b/example/lib/presentation/samples/line/line_chart_sample12.dart @@ -95,7 +95,6 @@ class _LineChartSample12State extends State { return spotIndexes.map((index) {}).toList(); }, touchTooltipData: LineTouchTooltipData( - tooltipBgColor: Colors.transparent, getTooltipItems: (List lineBarsSpot) { return lineBarsSpot.map((lineBarSpot) {}).toList(); }, From 04f18f26813f45f233622cfd663015569d5f2d85 Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Fri, 29 Mar 2024 17:51:36 +0100 Subject: [PATCH 146/149] Fix after rebase logic --- lib/src/chart/line_chart/line_chart.dart | 33 +++++++++++++++++++----- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index cd8c4eded..56b8af258 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -45,11 +45,12 @@ class _LineChartState extends AnimatedWidgetBaseState { DragSpotUpdateCallback? _dragSpotUpdateFinishedCallback; DragSpotUpdateCallback? _dragSpotUpdateCallback; DragSpotUpdateCallback? _dragSpotUpdateStartedCallback; - final List _showingTouchedTooltips = []; final Map> _showingTouchedIndicators = {}; + final _lineChartHelper = LineChartHelper(); + List _lineBarsData = []; /// Keeps index of bar and spot that currently is being dragging @@ -112,7 +113,26 @@ class _LineChartState extends AnimatedWidgetBaseState { } LineChartData _getData() { - final lineTouchData = widget.data.lineTouchData; + var newData = widget.data; + + /// Calculate minX, maxX, minY, maxY for [LineChartData] if they are null, + /// it is necessary to render the chart correctly. + if (newData.minX.isNaN || + newData.maxX.isNaN || + newData.minY.isNaN || + newData.maxY.isNaN) { + final values = _lineChartHelper.calculateMaxAxisValues( + newData.lineBarsData, + ); + newData = newData.copyWith( + minX: newData.minX.isNaN ? values.minX : newData.minX, + maxX: newData.maxX.isNaN ? values.maxX : newData.maxX, + minY: newData.minY.isNaN ? values.minY : newData.minY, + maxY: newData.maxY.isNaN ? values.maxY : newData.maxY, + ); + } + + final lineTouchData = newData.lineTouchData; if (lineTouchData.enabled && lineTouchData.handleBuiltInTouches) { _providedTouchCallback = lineTouchData.touchCallback; _dragSpotUpdateFinishedCallback = @@ -120,16 +140,16 @@ class _LineChartState extends AnimatedWidgetBaseState { _dragSpotUpdateCallback = lineTouchData.dragSpotUpdateCallback; _dragSpotUpdateStartedCallback = lineTouchData.dragSpotUpdateStartedCallback; - return widget.data.copyWith( + newData = newData.copyWith( lineBarsData: _lineBarsData, - lineTouchData: widget.data.lineTouchData.copyWith( + lineTouchData: newData.lineTouchData.copyWith( touchCallback: _handleBuiltInTouch, - distanceCalculator: _isAnyDraggable ? vectorDistanceCalculator : null, + distanceCalculator: true ? vectorDistanceCalculator : null, ), ); } - return widget.data; + return newData; } void _handleBuiltInTouch( @@ -174,6 +194,7 @@ class _LineChartState extends AnimatedWidgetBaseState { } _providedTouchCallback?.call(event, touchResponse); + if (!event.isInterestedForInteractions || touchResponse?.lineBarSpots == null || touchResponse!.lineBarSpots!.isEmpty) { From 9357bf2e0d6150174f6ec44a2ad8e40b92feabd8 Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Fri, 29 Mar 2024 17:58:15 +0100 Subject: [PATCH 147/149] Fix tests --- lib/src/chart/line_chart/line_chart.dart | 4 +- lib/src/chart/line_chart/line_chart_data.dart | 2 + .../bar_chart_renderer_test.mocks.dart | 149 ++++++---- .../line_chart_painter_test.mocks.dart | 257 ++++++++++------- .../line_chart_renderer_test.mocks.dart | 265 +++++++++++------- .../scatter_chart_renderer_test.mocks.dart | 133 ++++++--- 6 files changed, 512 insertions(+), 298 deletions(-) diff --git a/lib/src/chart/line_chart/line_chart.dart b/lib/src/chart/line_chart/line_chart.dart index 56b8af258..d184da65f 100644 --- a/lib/src/chart/line_chart/line_chart.dart +++ b/lib/src/chart/line_chart/line_chart.dart @@ -57,7 +57,7 @@ class _LineChartState extends AnimatedWidgetBaseState { (int barIndex, int spotIndex)? _draggingSpotIndexes; bool get _isAnyDraggable => - _lineBarsData.indexWhere((lineBarData) => lineBarData.isDraggable) != -1; + _lineBarsData.any((lineBarData) => lineBarData.isDraggable); @override void initState() { @@ -144,7 +144,7 @@ class _LineChartState extends AnimatedWidgetBaseState { lineBarsData: _lineBarsData, lineTouchData: newData.lineTouchData.copyWith( touchCallback: _handleBuiltInTouch, - distanceCalculator: true ? vectorDistanceCalculator : null, + distanceCalculator: _isAnyDraggable ? vectorDistanceCalculator : null, ), ); } diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index e1f8606bf..a52e7b8d8 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -413,6 +413,7 @@ class LineChartBarData with EquatableMixin { Gradient? gradient, double? barWidth, bool? isCurved, + bool? isDraggable, double? curveSmoothness, bool? preventCurveOverShooting, double? preventCurveOvershootingThreshold, @@ -434,6 +435,7 @@ class LineChartBarData with EquatableMixin { gradient: gradient ?? this.gradient, barWidth: barWidth ?? this.barWidth, isCurved: isCurved ?? this.isCurved, + isDraggable: isDraggable ?? this.isDraggable, curveSmoothness: curveSmoothness ?? this.curveSmoothness, preventCurveOverShooting: preventCurveOverShooting ?? this.preventCurveOverShooting, diff --git a/test/chart/bar_chart/bar_chart_renderer_test.mocks.dart b/test/chart/bar_chart/bar_chart_renderer_test.mocks.dart index 7e43d8ba3..1a2250b13 100644 --- a/test/chart/bar_chart/bar_chart_renderer_test.mocks.dart +++ b/test/chart/bar_chart/bar_chart_renderer_test.mocks.dart @@ -3,20 +3,20 @@ // Do not manually edit this file. // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:typed_data' as _i7; +import 'dart:typed_data' as _i8; import 'dart:ui' as _i2; -import 'package:fl_chart/fl_chart.dart' as _i13; -import 'package:fl_chart/src/chart/bar_chart/bar_chart_painter.dart' as _i10; +import 'package:fl_chart/fl_chart.dart' as _i7; +import 'package:fl_chart/src/chart/bar_chart/bar_chart_painter.dart' as _i11; import 'package:fl_chart/src/chart/base/base_chart/base_chart_painter.dart' - as _i12; -import 'package:fl_chart/src/utils/canvas_wrapper.dart' as _i11; + as _i13; +import 'package:fl_chart/src/utils/canvas_wrapper.dart' as _i12; import 'package:flutter/foundation.dart' as _i5; -import 'package:flutter/gestures.dart' as _i8; +import 'package:flutter/gestures.dart' as _i9; import 'package:flutter/material.dart' as _i6; import 'package:flutter/rendering.dart' as _i3; import 'package:flutter/src/rendering/layer.dart' as _i4; -import 'package:flutter/src/widgets/notification_listener.dart' as _i9; +import 'package:flutter/src/widgets/notification_listener.dart' as _i10; import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: type=lint @@ -139,6 +139,16 @@ class _FakeDiagnosticsNode_7 extends _i1.SmartFake super.toString(); } +class _FakeFlSpot_8 extends _i1.SmartFake implements _i7.FlSpot { + _FakeFlSpot_8( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + /// A class which mocks [Canvas]. /// /// See the documentation for Mockito's code generation for more information. @@ -257,7 +267,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ); @override - void transform(_i7.Float64List? matrix4) => super.noSuchMethod( + void transform(_i8.Float64List? matrix4) => super.noSuchMethod( Invocation.method( #transform, [matrix4], @@ -266,13 +276,13 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ); @override - _i7.Float64List getTransform() => (super.noSuchMethod( + _i8.Float64List getTransform() => (super.noSuchMethod( Invocation.method( #getTransform, [], ), - returnValue: _i7.Float64List(0), - ) as _i7.Float64List); + returnValue: _i8.Float64List(0), + ) as _i8.Float64List); @override void clipRect( @@ -619,7 +629,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { @override void drawRawPoints( _i2.PointMode? pointMode, - _i7.Float32List? points, + _i8.Float32List? points, _i2.Paint? paint, ) => super.noSuchMethod( @@ -681,9 +691,9 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { @override void drawRawAtlas( _i2.Image? atlas, - _i7.Float32List? rstTransforms, - _i7.Float32List? rects, - _i7.Int32List? colors, + _i8.Float32List? rstTransforms, + _i8.Float32List? rects, + _i8.Int32List? colors, _i2.BlendMode? blendMode, _i2.Rect? cullRect, _i2.Paint? paint, @@ -975,7 +985,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { _i4.TransformLayer? pushTransform( bool? needsCompositing, _i2.Offset? offset, - _i8.Matrix4? transform, + _i9.Matrix4? transform, _i3.PaintingContextCallback? painter, { _i4.TransformLayer? oldLayer, }) => @@ -1152,7 +1162,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ); @override - void dispatchNotification(_i9.Notification? notification) => + void dispatchNotification(_i10.Notification? notification) => super.noSuchMethod( Invocation.method( #dispatchNotification, @@ -1235,7 +1245,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { /// A class which mocks [BarChartPainter]. /// /// See the documentation for Mockito's code generation for more information. -class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { +class MockBarChartPainter extends _i1.Mock implements _i11.BarChartPainter { MockBarChartPainter() { _i1.throwOnMissingStub(this); } @@ -1243,8 +1253,8 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { @override void paint( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1259,10 +1269,10 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { ); @override - List<_i10.GroupBarsPosition> calculateGroupAndBarsPosition( + List<_i11.GroupBarsPosition> calculateGroupAndBarsPosition( _i2.Size? viewSize, List? groupsX, - List<_i13.BarChartGroupData>? barGroups, + List<_i7.BarChartGroupData>? barGroups, ) => (super.noSuchMethod( Invocation.method( @@ -1273,14 +1283,14 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { barGroups, ], ), - returnValue: <_i10.GroupBarsPosition>[], - ) as List<_i10.GroupBarsPosition>); + returnValue: <_i11.GroupBarsPosition>[], + ) as List<_i11.GroupBarsPosition>); @override void drawBars( - _i11.CanvasWrapper? canvasWrapper, - List<_i10.GroupBarsPosition>? groupBarsPosition, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + List<_i11.GroupBarsPosition>? groupBarsPosition, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1297,14 +1307,14 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { @override void drawTouchTooltip( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - List<_i10.GroupBarsPosition>? groupPositions, - _i13.BarTouchTooltipData? tooltipData, - _i13.BarChartGroupData? showOnBarGroup, + _i12.CanvasWrapper? canvasWrapper, + List<_i11.GroupBarsPosition>? groupPositions, + _i7.BarTouchTooltipData? tooltipData, + _i7.BarChartGroupData? showOnBarGroup, int? barGroupIndex, - _i13.BarChartRodData? showOnRodData, + _i7.BarChartRodData? showOnRodData, int? barRodIndex, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1326,14 +1336,14 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { @override void drawStackItemBorderStroke( - _i11.CanvasWrapper? canvasWrapper, - _i13.BarChartRodStackItem? stackItem, + _i12.CanvasWrapper? canvasWrapper, + _i7.BarChartRodStackItem? stackItem, int? index, int? rodStacksSize, double? barThickSize, _i2.RRect? barRRect, _i2.Size? drawSize, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1353,10 +1363,10 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { ); @override - _i13.BarTouchedSpot? handleTouch( + _i7.BarTouchedSpot? handleTouch( _i2.Offset? localPosition, _i2.Size? viewSize, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => (super.noSuchMethod(Invocation.method( #handleTouch, @@ -1365,12 +1375,12 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { viewSize, holder, ], - )) as _i13.BarTouchedSpot?); + )) as _i7.BarTouchedSpot?); @override void drawGrid( - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1385,8 +1395,8 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { @override void drawBackground( - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1401,8 +1411,8 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { @override void drawRangeAnnotation( - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1418,8 +1428,8 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { @override void drawExtraLines( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1436,8 +1446,8 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { @override void drawHorizontalLines( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.BarChartData>? holder, _i2.Size? viewSize, ) => super.noSuchMethod( @@ -1456,8 +1466,8 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { @override void drawVerticalLines( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.BarChartData>? holder, _i2.Size? viewSize, ) => super.noSuchMethod( @@ -1477,7 +1487,7 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { double getPixelX( double? spotX, _i2.Size? viewSize, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -1495,7 +1505,7 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { double getPixelY( double? spotY, _i2.Size? viewSize, - _i12.PaintHolder<_i13.BarChartData>? holder, + _i13.PaintHolder<_i7.BarChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -1509,11 +1519,42 @@ class MockBarChartPainter extends _i1.Mock implements _i10.BarChartPainter { returnValue: 0.0, ) as double); + @override + _i7.FlSpot getTouchedCoordinates( + double? pixelX, + double? pixelY, + _i2.Size? viewSize, + _i13.PaintHolder<_i7.BarChartData>? holder, + ) => + (super.noSuchMethod( + Invocation.method( + #getTouchedCoordinates, + [ + pixelX, + pixelY, + viewSize, + holder, + ], + ), + returnValue: _FakeFlSpot_8( + this, + Invocation.method( + #getTouchedCoordinates, + [ + pixelX, + pixelY, + viewSize, + holder, + ], + ), + ), + ) as _i7.FlSpot); + @override double getTooltipLeft( double? dx, double? tooltipWidth, - _i13.FLHorizontalAlignment? tooltipHorizontalAlignment, + _i7.FLHorizontalAlignment? tooltipHorizontalAlignment, double? tooltipHorizontalOffset, ) => (super.noSuchMethod( diff --git a/test/chart/line_chart/line_chart_painter_test.mocks.dart b/test/chart/line_chart/line_chart_painter_test.mocks.dart index a01595352..77198e4ab 100644 --- a/test/chart/line_chart/line_chart_painter_test.mocks.dart +++ b/test/chart/line_chart/line_chart_painter_test.mocks.dart @@ -3,14 +3,14 @@ // Do not manually edit this file. // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:typed_data' as _i5; +import 'dart:typed_data' as _i6; import 'dart:ui' as _i2; -import 'package:fl_chart/fl_chart.dart' as _i7; +import 'package:fl_chart/fl_chart.dart' as _i5; import 'package:fl_chart/src/chart/base/base_chart/base_chart_painter.dart' as _i11; import 'package:fl_chart/src/chart/line_chart/line_chart_painter.dart' as _i10; -import 'package:fl_chart/src/utils/canvas_wrapper.dart' as _i6; +import 'package:fl_chart/src/utils/canvas_wrapper.dart' as _i7; import 'package:fl_chart/src/utils/utils.dart' as _i8; import 'package:flutter/cupertino.dart' as _i3; import 'package:flutter/foundation.dart' as _i4; @@ -155,6 +155,27 @@ class _FakePath_9 extends _i1.SmartFake implements _i2.Path { ); } +class _FakeLineTouchResponse_10 extends _i1.SmartFake + implements _i5.LineTouchResponse { + _FakeLineTouchResponse_10( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeFlSpot_11 extends _i1.SmartFake implements _i5.FlSpot { + _FakeFlSpot_11( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + /// A class which mocks [Canvas]. /// /// See the documentation for Mockito's code generation for more information. @@ -273,7 +294,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ); @override - void transform(_i5.Float64List? matrix4) => super.noSuchMethod( + void transform(_i6.Float64List? matrix4) => super.noSuchMethod( Invocation.method( #transform, [matrix4], @@ -282,13 +303,13 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ); @override - _i5.Float64List getTransform() => (super.noSuchMethod( + _i6.Float64List getTransform() => (super.noSuchMethod( Invocation.method( #getTransform, [], ), - returnValue: _i5.Float64List(0), - ) as _i5.Float64List); + returnValue: _i6.Float64List(0), + ) as _i6.Float64List); @override void clipRect( @@ -635,7 +656,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { @override void drawRawPoints( _i2.PointMode? pointMode, - _i5.Float32List? points, + _i6.Float32List? points, _i2.Paint? paint, ) => super.noSuchMethod( @@ -697,9 +718,9 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { @override void drawRawAtlas( _i2.Image? atlas, - _i5.Float32List? rstTransforms, - _i5.Float32List? rects, - _i5.Int32List? colors, + _i6.Float32List? rstTransforms, + _i6.Float32List? rects, + _i6.Int32List? colors, _i2.BlendMode? blendMode, _i2.Rect? cullRect, _i2.Paint? paint, @@ -744,7 +765,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { /// A class which mocks [CanvasWrapper]. /// /// See the documentation for Mockito's code generation for more information. -class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { +class MockCanvasWrapper extends _i1.Mock implements _i7.CanvasWrapper { MockCanvasWrapper() { _i1.throwOnMissingStub(this); } @@ -1027,8 +1048,8 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { @override void drawDot( - _i7.FlDotPainter? painter, - _i7.FlSpot? spot, + _i5.FlDotPainter? painter, + _i5.FlSpot? spot, _i2.Offset? offset, ) => super.noSuchMethod( @@ -1049,7 +1070,7 @@ class MockCanvasWrapper extends _i1.Mock implements _i6.CanvasWrapper { _i2.Offset? rotationOffset = _i2.Offset.zero, _i2.Offset? drawOffset = _i2.Offset.zero, required double? angle, - required _i6.DrawCallback? drawCallback, + required _i7.DrawCallback? drawCallback, }) => super.noSuchMethod( Invocation.method( @@ -1487,8 +1508,8 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void paint( _i3.BuildContext? context, - _i6.CanvasWrapper? canvasWrapper, - _i11.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i11.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1504,8 +1525,8 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void clipToBorder( - _i6.CanvasWrapper? canvasWrapper, - _i11.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i11.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1520,9 +1541,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawBarLine( - _i6.CanvasWrapper? canvasWrapper, - _i7.LineChartBarData? barData, - _i11.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i5.LineChartBarData? barData, + _i11.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1538,10 +1559,10 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawBetweenBarsArea( - _i6.CanvasWrapper? canvasWrapper, - _i7.LineChartData? data, - _i7.BetweenBarsData? betweenBarsData, - _i11.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i5.LineChartData? data, + _i5.BetweenBarsData? betweenBarsData, + _i11.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1558,9 +1579,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawDots( - _i6.CanvasWrapper? canvasWrapper, - _i7.LineChartBarData? barData, - _i11.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i5.LineChartBarData? barData, + _i11.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1576,9 +1597,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawTouchedSpotsIndicator( - _i6.CanvasWrapper? canvasWrapper, + _i7.CanvasWrapper? canvasWrapper, List<_i10.LineIndexDrawingInfo>? lineIndexDrawingInfo, - _i11.PaintHolder<_i7.LineChartData>? holder, + _i11.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1595,9 +1616,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override _i2.Path generateBarPath( _i2.Size? viewSize, - _i7.LineChartBarData? barData, - List<_i7.FlSpot>? barSpots, - _i11.PaintHolder<_i7.LineChartData>? holder, { + _i5.LineChartBarData? barData, + List<_i5.FlSpot>? barSpots, + _i11.PaintHolder<_i5.LineChartData>? holder, { _i2.Path? appendToPath, }) => (super.noSuchMethod( @@ -1629,9 +1650,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override _i2.Path generateNormalBarPath( _i2.Size? viewSize, - _i7.LineChartBarData? barData, - List<_i7.FlSpot>? barSpots, - _i11.PaintHolder<_i7.LineChartData>? holder, { + _i5.LineChartBarData? barData, + List<_i5.FlSpot>? barSpots, + _i11.PaintHolder<_i5.LineChartData>? holder, { _i2.Path? appendToPath, }) => (super.noSuchMethod( @@ -1663,9 +1684,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override _i2.Path generateStepBarPath( _i2.Size? viewSize, - _i7.LineChartBarData? barData, - List<_i7.FlSpot>? barSpots, - _i11.PaintHolder<_i7.LineChartData>? holder, { + _i5.LineChartBarData? barData, + List<_i5.FlSpot>? barSpots, + _i11.PaintHolder<_i5.LineChartData>? holder, { _i2.Path? appendToPath, }) => (super.noSuchMethod( @@ -1697,10 +1718,10 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override _i2.Path generateBelowBarPath( _i2.Size? viewSize, - _i7.LineChartBarData? barData, + _i5.LineChartBarData? barData, _i2.Path? barPath, - List<_i7.FlSpot>? barSpots, - _i11.PaintHolder<_i7.LineChartData>? holder, { + List<_i5.FlSpot>? barSpots, + _i11.PaintHolder<_i5.LineChartData>? holder, { bool? fillCompletely = false, }) => (super.noSuchMethod( @@ -1734,10 +1755,10 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override _i2.Path generateAboveBarPath( _i2.Size? viewSize, - _i7.LineChartBarData? barData, + _i5.LineChartBarData? barData, _i2.Path? barPath, - List<_i7.FlSpot>? barSpots, - _i11.PaintHolder<_i7.LineChartData>? holder, { + List<_i5.FlSpot>? barSpots, + _i11.PaintHolder<_i5.LineChartData>? holder, { bool? fillCompletely = false, }) => (super.noSuchMethod( @@ -1770,11 +1791,11 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawBelowBar( - _i6.CanvasWrapper? canvasWrapper, + _i7.CanvasWrapper? canvasWrapper, _i2.Path? belowBarPath, _i2.Path? filledAboveBarPath, - _i11.PaintHolder<_i7.LineChartData>? holder, - _i7.LineChartBarData? barData, + _i11.PaintHolder<_i5.LineChartData>? holder, + _i5.LineChartBarData? barData, ) => super.noSuchMethod( Invocation.method( @@ -1792,11 +1813,11 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawAboveBar( - _i6.CanvasWrapper? canvasWrapper, + _i7.CanvasWrapper? canvasWrapper, _i2.Path? aboveBarPath, _i2.Path? filledBelowBarPath, - _i11.PaintHolder<_i7.LineChartData>? holder, - _i7.LineChartBarData? barData, + _i11.PaintHolder<_i5.LineChartData>? holder, + _i5.LineChartBarData? barData, ) => super.noSuchMethod( Invocation.method( @@ -1814,11 +1835,11 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawBetweenBar( - _i6.CanvasWrapper? canvasWrapper, + _i7.CanvasWrapper? canvasWrapper, _i2.Path? barPath, - _i7.BetweenBarsData? betweenBarsData, + _i5.BetweenBarsData? betweenBarsData, _i2.Rect? aroundRect, - _i11.PaintHolder<_i7.LineChartData>? holder, + _i11.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1836,9 +1857,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawBarShadow( - _i6.CanvasWrapper? canvasWrapper, + _i7.CanvasWrapper? canvasWrapper, _i2.Path? barPath, - _i7.LineChartBarData? barData, + _i5.LineChartBarData? barData, ) => super.noSuchMethod( Invocation.method( @@ -1854,10 +1875,10 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawBar( - _i6.CanvasWrapper? canvasWrapper, + _i7.CanvasWrapper? canvasWrapper, _i2.Path? barPath, - _i7.LineChartBarData? barData, - _i11.PaintHolder<_i7.LineChartData>? holder, + _i5.LineChartBarData? barData, + _i11.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1875,11 +1896,11 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawTouchTooltip( _i3.BuildContext? context, - _i6.CanvasWrapper? canvasWrapper, - _i7.LineTouchTooltipData? tooltipData, - _i7.FlSpot? showOnSpot, - _i7.ShowingTooltipIndicators? showingTooltipSpots, - _i11.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i5.LineTouchTooltipData? tooltipData, + _i5.FlSpot? showOnSpot, + _i5.ShowingTooltipIndicators? showingTooltipSpots, + _i11.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1898,9 +1919,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override double getBarLineXLength( - _i7.LineChartBarData? barData, + _i5.LineChartBarData? barData, _i2.Size? chartUsableSize, - _i11.PaintHolder<_i7.LineChartData>? holder, + _i11.PaintHolder<_i5.LineChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -1915,27 +1936,40 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ) as double); @override - List<_i7.TouchLineBarSpot>? handleTouch( + _i5.LineTouchResponse handleTouch( _i2.Offset? localPosition, _i2.Size? size, - _i11.PaintHolder<_i7.LineChartData>? holder, + _i11.PaintHolder<_i5.LineChartData>? holder, ) => - (super.noSuchMethod(Invocation.method( - #handleTouch, - [ - localPosition, - size, - holder, - ], - )) as List<_i7.TouchLineBarSpot>?); + (super.noSuchMethod( + Invocation.method( + #handleTouch, + [ + localPosition, + size, + holder, + ], + ), + returnValue: _FakeLineTouchResponse_10( + this, + Invocation.method( + #handleTouch, + [ + localPosition, + size, + holder, + ], + ), + ), + ) as _i5.LineTouchResponse); @override - _i7.TouchLineBarSpot? getNearestTouchedSpot( + _i5.TouchLineBarSpot? getNearestTouchedSpot( _i2.Size? viewSize, _i2.Offset? touchedPoint, - _i7.LineChartBarData? barData, + _i5.LineChartBarData? barData, int? barDataPosition, - _i11.PaintHolder<_i7.LineChartData>? holder, + _i11.PaintHolder<_i5.LineChartData>? holder, ) => (super.noSuchMethod(Invocation.method( #getNearestTouchedSpot, @@ -1946,12 +1980,12 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { barDataPosition, holder, ], - )) as _i7.TouchLineBarSpot?); + )) as _i5.TouchLineBarSpot?); @override void drawGrid( - _i6.CanvasWrapper? canvasWrapper, - _i11.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i11.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1966,8 +2000,8 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawBackground( - _i6.CanvasWrapper? canvasWrapper, - _i11.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i11.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1982,8 +2016,8 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawRangeAnnotation( - _i6.CanvasWrapper? canvasWrapper, - _i11.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i11.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1999,8 +2033,8 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawExtraLines( _i3.BuildContext? context, - _i6.CanvasWrapper? canvasWrapper, - _i11.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i11.PaintHolder<_i5.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -2017,8 +2051,8 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawHorizontalLines( _i3.BuildContext? context, - _i6.CanvasWrapper? canvasWrapper, - _i11.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i11.PaintHolder<_i5.LineChartData>? holder, _i2.Size? viewSize, ) => super.noSuchMethod( @@ -2037,8 +2071,8 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawVerticalLines( _i3.BuildContext? context, - _i6.CanvasWrapper? canvasWrapper, - _i11.PaintHolder<_i7.LineChartData>? holder, + _i7.CanvasWrapper? canvasWrapper, + _i11.PaintHolder<_i5.LineChartData>? holder, _i2.Size? viewSize, ) => super.noSuchMethod( @@ -2058,7 +2092,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { double getPixelX( double? spotX, _i2.Size? viewSize, - _i11.PaintHolder<_i7.LineChartData>? holder, + _i11.PaintHolder<_i5.LineChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -2076,7 +2110,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { double getPixelY( double? spotY, _i2.Size? viewSize, - _i11.PaintHolder<_i7.LineChartData>? holder, + _i11.PaintHolder<_i5.LineChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -2090,11 +2124,42 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { returnValue: 0.0, ) as double); + @override + _i5.FlSpot getTouchedCoordinates( + double? pixelX, + double? pixelY, + _i2.Size? viewSize, + _i11.PaintHolder<_i5.LineChartData>? holder, + ) => + (super.noSuchMethod( + Invocation.method( + #getTouchedCoordinates, + [ + pixelX, + pixelY, + viewSize, + holder, + ], + ), + returnValue: _FakeFlSpot_11( + this, + Invocation.method( + #getTouchedCoordinates, + [ + pixelX, + pixelY, + viewSize, + holder, + ], + ), + ), + ) as _i5.FlSpot); + @override double getTooltipLeft( double? dx, double? tooltipWidth, - _i7.FLHorizontalAlignment? tooltipHorizontalAlignment, + _i5.FLHorizontalAlignment? tooltipHorizontalAlignment, double? tooltipHorizontalOffset, ) => (super.noSuchMethod( diff --git a/test/chart/line_chart/line_chart_renderer_test.mocks.dart b/test/chart/line_chart/line_chart_renderer_test.mocks.dart index b3e9c938c..92534f121 100644 --- a/test/chart/line_chart/line_chart_renderer_test.mocks.dart +++ b/test/chart/line_chart/line_chart_renderer_test.mocks.dart @@ -3,20 +3,20 @@ // Do not manually edit this file. // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:typed_data' as _i7; +import 'dart:typed_data' as _i8; import 'dart:ui' as _i2; -import 'package:fl_chart/fl_chart.dart' as _i13; +import 'package:fl_chart/fl_chart.dart' as _i7; import 'package:fl_chart/src/chart/base/base_chart/base_chart_painter.dart' - as _i12; -import 'package:fl_chart/src/chart/line_chart/line_chart_painter.dart' as _i10; -import 'package:fl_chart/src/utils/canvas_wrapper.dart' as _i11; + as _i13; +import 'package:fl_chart/src/chart/line_chart/line_chart_painter.dart' as _i11; +import 'package:fl_chart/src/utils/canvas_wrapper.dart' as _i12; import 'package:flutter/foundation.dart' as _i5; -import 'package:flutter/gestures.dart' as _i8; +import 'package:flutter/gestures.dart' as _i9; import 'package:flutter/material.dart' as _i6; import 'package:flutter/rendering.dart' as _i3; import 'package:flutter/src/rendering/layer.dart' as _i4; -import 'package:flutter/src/widgets/notification_listener.dart' as _i9; +import 'package:flutter/src/widgets/notification_listener.dart' as _i10; import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: type=lint @@ -149,6 +149,27 @@ class _FakePath_8 extends _i1.SmartFake implements _i2.Path { ); } +class _FakeLineTouchResponse_9 extends _i1.SmartFake + implements _i7.LineTouchResponse { + _FakeLineTouchResponse_9( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeFlSpot_10 extends _i1.SmartFake implements _i7.FlSpot { + _FakeFlSpot_10( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + /// A class which mocks [Canvas]. /// /// See the documentation for Mockito's code generation for more information. @@ -267,7 +288,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ); @override - void transform(_i7.Float64List? matrix4) => super.noSuchMethod( + void transform(_i8.Float64List? matrix4) => super.noSuchMethod( Invocation.method( #transform, [matrix4], @@ -276,13 +297,13 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ); @override - _i7.Float64List getTransform() => (super.noSuchMethod( + _i8.Float64List getTransform() => (super.noSuchMethod( Invocation.method( #getTransform, [], ), - returnValue: _i7.Float64List(0), - ) as _i7.Float64List); + returnValue: _i8.Float64List(0), + ) as _i8.Float64List); @override void clipRect( @@ -629,7 +650,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { @override void drawRawPoints( _i2.PointMode? pointMode, - _i7.Float32List? points, + _i8.Float32List? points, _i2.Paint? paint, ) => super.noSuchMethod( @@ -691,9 +712,9 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { @override void drawRawAtlas( _i2.Image? atlas, - _i7.Float32List? rstTransforms, - _i7.Float32List? rects, - _i7.Int32List? colors, + _i8.Float32List? rstTransforms, + _i8.Float32List? rects, + _i8.Int32List? colors, _i2.BlendMode? blendMode, _i2.Rect? cullRect, _i2.Paint? paint, @@ -985,7 +1006,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { _i4.TransformLayer? pushTransform( bool? needsCompositing, _i2.Offset? offset, - _i8.Matrix4? transform, + _i9.Matrix4? transform, _i3.PaintingContextCallback? painter, { _i4.TransformLayer? oldLayer, }) => @@ -1162,7 +1183,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ); @override - void dispatchNotification(_i9.Notification? notification) => + void dispatchNotification(_i10.Notification? notification) => super.noSuchMethod( Invocation.method( #dispatchNotification, @@ -1245,7 +1266,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { /// A class which mocks [LineChartPainter]. /// /// See the documentation for Mockito's code generation for more information. -class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { +class MockLineChartPainter extends _i1.Mock implements _i11.LineChartPainter { MockLineChartPainter() { _i1.throwOnMissingStub(this); } @@ -1253,8 +1274,8 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void paint( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1270,8 +1291,8 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void clipToBorder( - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1286,9 +1307,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawBarLine( - _i11.CanvasWrapper? canvasWrapper, - _i13.LineChartBarData? barData, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i7.LineChartBarData? barData, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1304,10 +1325,10 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawBetweenBarsArea( - _i11.CanvasWrapper? canvasWrapper, - _i13.LineChartData? data, - _i13.BetweenBarsData? betweenBarsData, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i7.LineChartData? data, + _i7.BetweenBarsData? betweenBarsData, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1324,9 +1345,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawDots( - _i11.CanvasWrapper? canvasWrapper, - _i13.LineChartBarData? barData, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i7.LineChartBarData? barData, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1342,9 +1363,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawTouchedSpotsIndicator( - _i11.CanvasWrapper? canvasWrapper, - List<_i10.LineIndexDrawingInfo>? lineIndexDrawingInfo, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + List<_i11.LineIndexDrawingInfo>? lineIndexDrawingInfo, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1361,9 +1382,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override _i2.Path generateBarPath( _i2.Size? viewSize, - _i13.LineChartBarData? barData, - List<_i13.FlSpot>? barSpots, - _i12.PaintHolder<_i13.LineChartData>? holder, { + _i7.LineChartBarData? barData, + List<_i7.FlSpot>? barSpots, + _i13.PaintHolder<_i7.LineChartData>? holder, { _i2.Path? appendToPath, }) => (super.noSuchMethod( @@ -1395,9 +1416,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override _i2.Path generateNormalBarPath( _i2.Size? viewSize, - _i13.LineChartBarData? barData, - List<_i13.FlSpot>? barSpots, - _i12.PaintHolder<_i13.LineChartData>? holder, { + _i7.LineChartBarData? barData, + List<_i7.FlSpot>? barSpots, + _i13.PaintHolder<_i7.LineChartData>? holder, { _i2.Path? appendToPath, }) => (super.noSuchMethod( @@ -1429,9 +1450,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override _i2.Path generateStepBarPath( _i2.Size? viewSize, - _i13.LineChartBarData? barData, - List<_i13.FlSpot>? barSpots, - _i12.PaintHolder<_i13.LineChartData>? holder, { + _i7.LineChartBarData? barData, + List<_i7.FlSpot>? barSpots, + _i13.PaintHolder<_i7.LineChartData>? holder, { _i2.Path? appendToPath, }) => (super.noSuchMethod( @@ -1463,10 +1484,10 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override _i2.Path generateBelowBarPath( _i2.Size? viewSize, - _i13.LineChartBarData? barData, + _i7.LineChartBarData? barData, _i2.Path? barPath, - List<_i13.FlSpot>? barSpots, - _i12.PaintHolder<_i13.LineChartData>? holder, { + List<_i7.FlSpot>? barSpots, + _i13.PaintHolder<_i7.LineChartData>? holder, { bool? fillCompletely = false, }) => (super.noSuchMethod( @@ -1500,10 +1521,10 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override _i2.Path generateAboveBarPath( _i2.Size? viewSize, - _i13.LineChartBarData? barData, + _i7.LineChartBarData? barData, _i2.Path? barPath, - List<_i13.FlSpot>? barSpots, - _i12.PaintHolder<_i13.LineChartData>? holder, { + List<_i7.FlSpot>? barSpots, + _i13.PaintHolder<_i7.LineChartData>? holder, { bool? fillCompletely = false, }) => (super.noSuchMethod( @@ -1536,11 +1557,11 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawBelowBar( - _i11.CanvasWrapper? canvasWrapper, + _i12.CanvasWrapper? canvasWrapper, _i2.Path? belowBarPath, _i2.Path? filledAboveBarPath, - _i12.PaintHolder<_i13.LineChartData>? holder, - _i13.LineChartBarData? barData, + _i13.PaintHolder<_i7.LineChartData>? holder, + _i7.LineChartBarData? barData, ) => super.noSuchMethod( Invocation.method( @@ -1558,11 +1579,11 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawAboveBar( - _i11.CanvasWrapper? canvasWrapper, + _i12.CanvasWrapper? canvasWrapper, _i2.Path? aboveBarPath, _i2.Path? filledBelowBarPath, - _i12.PaintHolder<_i13.LineChartData>? holder, - _i13.LineChartBarData? barData, + _i13.PaintHolder<_i7.LineChartData>? holder, + _i7.LineChartBarData? barData, ) => super.noSuchMethod( Invocation.method( @@ -1580,11 +1601,11 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawBetweenBar( - _i11.CanvasWrapper? canvasWrapper, + _i12.CanvasWrapper? canvasWrapper, _i2.Path? barPath, - _i13.BetweenBarsData? betweenBarsData, + _i7.BetweenBarsData? betweenBarsData, _i2.Rect? aroundRect, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1602,9 +1623,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawBarShadow( - _i11.CanvasWrapper? canvasWrapper, + _i12.CanvasWrapper? canvasWrapper, _i2.Path? barPath, - _i13.LineChartBarData? barData, + _i7.LineChartBarData? barData, ) => super.noSuchMethod( Invocation.method( @@ -1620,10 +1641,10 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawBar( - _i11.CanvasWrapper? canvasWrapper, + _i12.CanvasWrapper? canvasWrapper, _i2.Path? barPath, - _i13.LineChartBarData? barData, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i7.LineChartBarData? barData, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1641,11 +1662,11 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawTouchTooltip( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i13.LineTouchTooltipData? tooltipData, - _i13.FlSpot? showOnSpot, - _i13.ShowingTooltipIndicators? showingTooltipSpots, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i7.LineTouchTooltipData? tooltipData, + _i7.FlSpot? showOnSpot, + _i7.ShowingTooltipIndicators? showingTooltipSpots, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1664,9 +1685,9 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override double getBarLineXLength( - _i13.LineChartBarData? barData, + _i7.LineChartBarData? barData, _i2.Size? chartUsableSize, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -1681,27 +1702,40 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { ) as double); @override - List<_i13.TouchLineBarSpot>? handleTouch( + _i7.LineTouchResponse handleTouch( _i2.Offset? localPosition, _i2.Size? size, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => - (super.noSuchMethod(Invocation.method( - #handleTouch, - [ - localPosition, - size, - holder, - ], - )) as List<_i13.TouchLineBarSpot>?); + (super.noSuchMethod( + Invocation.method( + #handleTouch, + [ + localPosition, + size, + holder, + ], + ), + returnValue: _FakeLineTouchResponse_9( + this, + Invocation.method( + #handleTouch, + [ + localPosition, + size, + holder, + ], + ), + ), + ) as _i7.LineTouchResponse); @override - _i13.TouchLineBarSpot? getNearestTouchedSpot( + _i7.TouchLineBarSpot? getNearestTouchedSpot( _i2.Size? viewSize, _i2.Offset? touchedPoint, - _i13.LineChartBarData? barData, + _i7.LineChartBarData? barData, int? barDataPosition, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => (super.noSuchMethod(Invocation.method( #getNearestTouchedSpot, @@ -1712,12 +1746,12 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { barDataPosition, holder, ], - )) as _i13.TouchLineBarSpot?); + )) as _i7.TouchLineBarSpot?); @override void drawGrid( - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1732,8 +1766,8 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawBackground( - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1748,8 +1782,8 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawRangeAnnotation( - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1765,8 +1799,8 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawExtraLines( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1783,8 +1817,8 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawHorizontalLines( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.LineChartData>? holder, _i2.Size? viewSize, ) => super.noSuchMethod( @@ -1803,8 +1837,8 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { @override void drawVerticalLines( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.LineChartData>? holder, _i2.Size? viewSize, ) => super.noSuchMethod( @@ -1824,7 +1858,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { double getPixelX( double? spotX, _i2.Size? viewSize, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -1842,7 +1876,7 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { double getPixelY( double? spotY, _i2.Size? viewSize, - _i12.PaintHolder<_i13.LineChartData>? holder, + _i13.PaintHolder<_i7.LineChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -1856,11 +1890,42 @@ class MockLineChartPainter extends _i1.Mock implements _i10.LineChartPainter { returnValue: 0.0, ) as double); + @override + _i7.FlSpot getTouchedCoordinates( + double? pixelX, + double? pixelY, + _i2.Size? viewSize, + _i13.PaintHolder<_i7.LineChartData>? holder, + ) => + (super.noSuchMethod( + Invocation.method( + #getTouchedCoordinates, + [ + pixelX, + pixelY, + viewSize, + holder, + ], + ), + returnValue: _FakeFlSpot_10( + this, + Invocation.method( + #getTouchedCoordinates, + [ + pixelX, + pixelY, + viewSize, + holder, + ], + ), + ), + ) as _i7.FlSpot); + @override double getTooltipLeft( double? dx, double? tooltipWidth, - _i13.FLHorizontalAlignment? tooltipHorizontalAlignment, + _i7.FLHorizontalAlignment? tooltipHorizontalAlignment, double? tooltipHorizontalOffset, ) => (super.noSuchMethod( diff --git a/test/chart/scatter_chart/scatter_chart_renderer_test.mocks.dart b/test/chart/scatter_chart/scatter_chart_renderer_test.mocks.dart index d6380b076..39c81ba53 100644 --- a/test/chart/scatter_chart/scatter_chart_renderer_test.mocks.dart +++ b/test/chart/scatter_chart/scatter_chart_renderer_test.mocks.dart @@ -3,21 +3,21 @@ // Do not manually edit this file. // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:typed_data' as _i7; +import 'dart:typed_data' as _i8; import 'dart:ui' as _i2; -import 'package:fl_chart/fl_chart.dart' as _i13; +import 'package:fl_chart/fl_chart.dart' as _i7; import 'package:fl_chart/src/chart/base/base_chart/base_chart_painter.dart' - as _i12; + as _i13; import 'package:fl_chart/src/chart/scatter_chart/scatter_chart_painter.dart' - as _i10; -import 'package:fl_chart/src/utils/canvas_wrapper.dart' as _i11; + as _i11; +import 'package:fl_chart/src/utils/canvas_wrapper.dart' as _i12; import 'package:flutter/foundation.dart' as _i5; -import 'package:flutter/gestures.dart' as _i8; +import 'package:flutter/gestures.dart' as _i9; import 'package:flutter/material.dart' as _i6; import 'package:flutter/rendering.dart' as _i3; import 'package:flutter/src/rendering/layer.dart' as _i4; -import 'package:flutter/src/widgets/notification_listener.dart' as _i9; +import 'package:flutter/src/widgets/notification_listener.dart' as _i10; import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: type=lint @@ -140,6 +140,16 @@ class _FakeDiagnosticsNode_7 extends _i1.SmartFake super.toString(); } +class _FakeFlSpot_8 extends _i1.SmartFake implements _i7.FlSpot { + _FakeFlSpot_8( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + /// A class which mocks [Canvas]. /// /// See the documentation for Mockito's code generation for more information. @@ -258,7 +268,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ); @override - void transform(_i7.Float64List? matrix4) => super.noSuchMethod( + void transform(_i8.Float64List? matrix4) => super.noSuchMethod( Invocation.method( #transform, [matrix4], @@ -267,13 +277,13 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { ); @override - _i7.Float64List getTransform() => (super.noSuchMethod( + _i8.Float64List getTransform() => (super.noSuchMethod( Invocation.method( #getTransform, [], ), - returnValue: _i7.Float64List(0), - ) as _i7.Float64List); + returnValue: _i8.Float64List(0), + ) as _i8.Float64List); @override void clipRect( @@ -620,7 +630,7 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { @override void drawRawPoints( _i2.PointMode? pointMode, - _i7.Float32List? points, + _i8.Float32List? points, _i2.Paint? paint, ) => super.noSuchMethod( @@ -682,9 +692,9 @@ class MockCanvas extends _i1.Mock implements _i2.Canvas { @override void drawRawAtlas( _i2.Image? atlas, - _i7.Float32List? rstTransforms, - _i7.Float32List? rects, - _i7.Int32List? colors, + _i8.Float32List? rstTransforms, + _i8.Float32List? rects, + _i8.Int32List? colors, _i2.BlendMode? blendMode, _i2.Rect? cullRect, _i2.Paint? paint, @@ -976,7 +986,7 @@ class MockPaintingContext extends _i1.Mock implements _i3.PaintingContext { _i4.TransformLayer? pushTransform( bool? needsCompositing, _i2.Offset? offset, - _i8.Matrix4? transform, + _i9.Matrix4? transform, _i3.PaintingContextCallback? painter, { _i4.TransformLayer? oldLayer, }) => @@ -1153,7 +1163,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { ); @override - void dispatchNotification(_i9.Notification? notification) => + void dispatchNotification(_i10.Notification? notification) => super.noSuchMethod( Invocation.method( #dispatchNotification, @@ -1237,7 +1247,7 @@ class MockBuildContext extends _i1.Mock implements _i6.BuildContext { /// /// See the documentation for Mockito's code generation for more information. class MockScatterChartPainter extends _i1.Mock - implements _i10.ScatterChartPainter { + implements _i11.ScatterChartPainter { MockScatterChartPainter() { _i1.throwOnMissingStub(this); } @@ -1245,8 +1255,8 @@ class MockScatterChartPainter extends _i1.Mock @override void paint( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1263,8 +1273,8 @@ class MockScatterChartPainter extends _i1.Mock @override void drawSpots( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1281,8 +1291,8 @@ class MockScatterChartPainter extends _i1.Mock @override void drawTouchTooltips( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1299,10 +1309,10 @@ class MockScatterChartPainter extends _i1.Mock @override void drawTouchTooltip( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i13.ScatterTouchTooltipData? tooltipData, - _i13.ScatterSpot? showOnSpot, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i7.ScatterTouchTooltipData? tooltipData, + _i7.ScatterSpot? showOnSpot, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1319,10 +1329,10 @@ class MockScatterChartPainter extends _i1.Mock ); @override - _i13.ScatterTouchedSpot? handleTouch( + _i7.ScatterTouchedSpot? handleTouch( _i2.Offset? localPosition, _i2.Size? viewSize, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => (super.noSuchMethod(Invocation.method( #handleTouch, @@ -1331,12 +1341,12 @@ class MockScatterChartPainter extends _i1.Mock viewSize, holder, ], - )) as _i13.ScatterTouchedSpot?); + )) as _i7.ScatterTouchedSpot?); @override void drawGrid( - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1351,8 +1361,8 @@ class MockScatterChartPainter extends _i1.Mock @override void drawBackground( - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1367,8 +1377,8 @@ class MockScatterChartPainter extends _i1.Mock @override void drawRangeAnnotation( - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1384,8 +1394,8 @@ class MockScatterChartPainter extends _i1.Mock @override void drawExtraLines( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => super.noSuchMethod( Invocation.method( @@ -1402,8 +1412,8 @@ class MockScatterChartPainter extends _i1.Mock @override void drawHorizontalLines( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.ScatterChartData>? holder, _i2.Size? viewSize, ) => super.noSuchMethod( @@ -1422,8 +1432,8 @@ class MockScatterChartPainter extends _i1.Mock @override void drawVerticalLines( _i6.BuildContext? context, - _i11.CanvasWrapper? canvasWrapper, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i12.CanvasWrapper? canvasWrapper, + _i13.PaintHolder<_i7.ScatterChartData>? holder, _i2.Size? viewSize, ) => super.noSuchMethod( @@ -1443,7 +1453,7 @@ class MockScatterChartPainter extends _i1.Mock double getPixelX( double? spotX, _i2.Size? viewSize, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -1461,7 +1471,7 @@ class MockScatterChartPainter extends _i1.Mock double getPixelY( double? spotY, _i2.Size? viewSize, - _i12.PaintHolder<_i13.ScatterChartData>? holder, + _i13.PaintHolder<_i7.ScatterChartData>? holder, ) => (super.noSuchMethod( Invocation.method( @@ -1475,11 +1485,42 @@ class MockScatterChartPainter extends _i1.Mock returnValue: 0.0, ) as double); + @override + _i7.FlSpot getTouchedCoordinates( + double? pixelX, + double? pixelY, + _i2.Size? viewSize, + _i13.PaintHolder<_i7.ScatterChartData>? holder, + ) => + (super.noSuchMethod( + Invocation.method( + #getTouchedCoordinates, + [ + pixelX, + pixelY, + viewSize, + holder, + ], + ), + returnValue: _FakeFlSpot_8( + this, + Invocation.method( + #getTouchedCoordinates, + [ + pixelX, + pixelY, + viewSize, + holder, + ], + ), + ), + ) as _i7.FlSpot); + @override double getTooltipLeft( double? dx, double? tooltipWidth, - _i13.FLHorizontalAlignment? tooltipHorizontalAlignment, + _i7.FLHorizontalAlignment? tooltipHorizontalAlignment, double? tooltipHorizontalOffset, ) => (super.noSuchMethod( From b60e4fe9c482ca4ed8af7a33e36ce882def6914e Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Fri, 29 Mar 2024 22:42:04 +0100 Subject: [PATCH 148/149] Adjust data tests --- test/chart/data_pool.dart | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/chart/data_pool.dart b/test/chart/data_pool.dart index a7afe0304..da2a15a66 100644 --- a/test/chart/data_pool.dart +++ b/test/chart/data_pool.dart @@ -1029,6 +1029,7 @@ final LineChartBarData lineChartBarData9 = LineChartBarData( preventCurveOverShooting: true, preventCurveOvershootingThreshold: 1.2, showingIndicators: [0, 1], + isDraggable: true, ); final TouchLineBarSpot lineBarSpot1 = TouchLineBarSpot( @@ -1292,6 +1293,9 @@ const LineTouchTooltipData lineTouchTooltipData7 = LineTouchTooltipData( ); void lineTouchCallback(FlTouchEvent event, LineTouchResponse? response) {} +void dragSpotUpdateFinishedCallback(UpdatedDragSpotsData data) {} +void dragSpotUpdateCallback(UpdatedDragSpotsData data) {} +void dragSpotUpdateStartedCallback(UpdatedDragSpotsData data) {} List getTouchedSpotIndicator( LineChartBarData barData, @@ -1319,6 +1323,9 @@ const LineTouchData lineTouchData2 = LineTouchData( handleBuiltInTouches: false, touchSpotThreshold: 12, touchTooltipData: lineTouchTooltipData1, + dragSpotUpdateCallback: dragSpotUpdateCallback, + dragSpotUpdateFinishedCallback: dragSpotUpdateCallback, + dragSpotUpdateStartedCallback: dragSpotUpdateCallback, ); const LineTouchData lineTouchData3 = LineTouchData( touchCallback: lineTouchCallback, From 2ae12342dbde4d052216b7bf511649c3db6f9e7f Mon Sep 17 00:00:00 2001 From: Ruslan Zaripov Date: Fri, 29 Mar 2024 22:44:35 +0100 Subject: [PATCH 149/149] Update CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e4befda0..fd972f727 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,6 @@ ## newVersion +* **FEATURE** (by @G33kFreak) Add drag spots feature for LineChart, [#1420](https://github.com/imaNNeo/fl_chart/issues/1420) + ## 0.67.0 * **FEATURE** (by @julien4215) Add direction property to the [HorizontalLineLabel](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#horizontallinelabel) and [VerticalLineLabel](https://github.com/imaNNeo/fl_chart/blob/main/repo_files/documentations/base_chart.md#verticallinelabel), #1574

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 Date: Sat, 13 Jan 2024 13:29:16 +0100 Subject: [PATCH 094/149] Fix readme issue --- README.md | 2 +- .../images/{landing_logo.jpg => landing_logo.png} | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename repo_files/images/{landing_logo.jpg => landing_logo.png} (100%) diff --git a/README.md b/README.md index 53b7b8f03..c58231e23 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ ### Overview 📊 FL Chart is a highly customizable Flutter chart library that supports **[Line Chart](https://app.flchart.dev/#/line)**, **[Bar Chart](https://app.flchart.dev/#/bar)**, **[Pie Chart](https://app.flchart.dev/#/pie)**, **[Scatter Chart](https://app.flchart.dev/#/scatter)**, and **[Radar Chart](https://app.flchart.dev/#/radar)**. -[![FL Chart Overview Video Thumbnail](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/landing_logo.png)](https://youtu.be/hVRU-kpKNjQ) +[![FL Chart Overview Video Thumbnail](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/overview_thumbnail.png)](https://youtu.be/hVRU-kpKNjQ) ### Chart Types diff --git a/repo_files/images/landing_logo.jpg b/repo_files/images/landing_logo.png similarity index 100% rename from repo_files/images/landing_logo.jpg rename to repo_files/images/landing_logo.png From 3858b0bff76d4596fd3934613e0355fc0ea26f89 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Sat, 13 Jan 2024 14:00:06 +0100 Subject: [PATCH 095/149] Decrease thumbnail video size --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c58231e23..95756e022 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ ### Overview 📊 FL Chart is a highly customizable Flutter chart library that supports **[Line Chart](https://app.flchart.dev/#/line)**, **[Bar Chart](https://app.flchart.dev/#/bar)**, **[Pie Chart](https://app.flchart.dev/#/pie)**, **[Scatter Chart](https://app.flchart.dev/#/scatter)**, and **[Radar Chart](https://app.flchart.dev/#/radar)**. -[![FL Chart Overview Video Thumbnail](https://github.com/imaNNeo/fl_chart/raw/main/repo_files/images/overview_thumbnail.png)](https://youtu.be/hVRU-kpKNjQ) +[

*6!FWMlOfG=);LKA(ZXFdFUlF$ZkHU|~Se3?^rU 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ͻ}dSVZ4f7ZQ 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%0DMVSj*2m+xam9_t_S962jXG6oa_+^~HFNR;qeqKx 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 z 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