From 73bdf810cdd06de0ad56504c39b044e37de4b664 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Mon, 26 Aug 2024 23:56:07 +0200 Subject: [PATCH 01/18] Update the `become a hero` to `become a sponsor` --- README.md | 4 ++-- repo_files/sponsors/become_a_sponsor_dark.png | Bin 0 -> 12328 bytes repo_files/sponsors/become_a_sponsor_light.png | Bin 0 -> 18056 bytes 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 repo_files/sponsors/become_a_sponsor_dark.png create mode 100644 repo_files/sponsors/become_a_sponsor_light.png diff --git a/README.md b/README.md index b631acb95..ee939fa84 100644 --- a/README.md +++ b/README.md @@ -19,8 +19,8 @@ Your financial support acts as fuel for fl_chart's development. [Support here](h - - + + Become a sponsor diff --git a/repo_files/sponsors/become_a_sponsor_dark.png b/repo_files/sponsors/become_a_sponsor_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..899c81625122f8366e44d022da3ae3204b4c5ac1 GIT binary patch literal 12328 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⩔Loqvq_pW{9z^-7x_y z8SYFkgAlaaEymDy5liiQ0YMq0=!THhU(~4ocwBNgn}b%Hu)~*6TTK`Q5&YEu(o?gg Y2wafD0DIhwcN^T@-C@4ry!Th!y%uW* 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 Date: Mon, 17 Jun 2024 11:13:14 +0200 Subject: [PATCH 02/18] Adding min/maxIncluded to SideTitles --- lib/src/chart/base/axis_chart/axis_chart_data.dart | 5 +++++ 1 file changed, 5 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 a6064b737..110741c3b 100644 --- a/lib/src/chart/base/axis_chart/axis_chart_data.dart +++ b/lib/src/chart/base/axis_chart/axis_chart_data.dart @@ -161,6 +161,8 @@ class SideTitles with EquatableMixin { this.getTitlesWidget = defaultGetTitle, this.reservedSize = 22, this.interval, + this.minIncluded = true, + this.maxIncluded = true, }) : assert(interval != 0, "SideTitles.interval couldn't be zero"); /// Determines showing or hiding this side titles @@ -178,6 +180,9 @@ class SideTitles with EquatableMixin { /// we try to find a suitable value to set as [interval] under the hood. final double? interval; + final bool minIncluded; + final bool maxIncluded; + /// Lerps a [SideTitles] based on [t] value, check [Tween.lerp]. static SideTitles lerp(SideTitles a, SideTitles b, double t) { return SideTitles( From 4e850062b9520559f8107aebc5d45369aae72366 Mon Sep 17 00:00:00 2001 From: Stefan Czesla Date: Mon, 17 Jun 2024 11:16:07 +0200 Subject: [PATCH 03/18] Passing min/maxIncluded to AxisChartHelper().iterateThroughAxis --- .../chart/base/axis_chart/side_titles/side_titles_widget.dart | 2 ++ 1 file changed, 2 insertions(+) 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 aa3f58ea5..c1363b39a 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 @@ -133,6 +133,8 @@ class SideTitlesWidget extends StatelessWidget { final axisValues = AxisChartHelper().iterateThroughAxis( min: axisMin, max: axisMax, + minIncluded: sideTitles.minIncluded, + maxIncluded: sideTitles.maxIncluded, baseLine: axisBaseLine, interval: interval, ); From c9ee05784c1e3d3bb19eee5b83d0dac32385af76 Mon Sep 17 00:00:00 2001 From: Stefan Czesla Date: Mon, 17 Jun 2024 14:04:00 +0200 Subject: [PATCH 04/18] A little docu on logic --- lib/src/chart/base/axis_chart/axis_chart_helper.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/src/chart/base/axis_chart/axis_chart_helper.dart b/lib/src/chart/base/axis_chart/axis_chart_helper.dart index 4d16a411b..b287b6730 100644 --- a/lib/src/chart/base/axis_chart/axis_chart_helper.dart +++ b/lib/src/chart/base/axis_chart/axis_chart_helper.dart @@ -32,6 +32,8 @@ class AxisChartHelper { var axisSeek = initialValue; final firstPositionOverlapsWithMin = axisSeek == min; if (!minIncluded && firstPositionOverlapsWithMin) { + // If inital value is equal to data minimum, + // move first label one interval further axisSeek += interval; } final diff = max - min; @@ -43,6 +45,7 @@ class AxisChartHelper { final epsilon = interval / 100000; if (minIncluded && !firstPositionOverlapsWithMin) { + // Data minimum shall be included and is not yet covered yield min; } while (axisSeek <= end + epsilon) { From a2473001871f3dccb4a4397a6accf62708064910 Mon Sep 17 00:00:00 2001 From: Stefan Czesla Date: Mon, 17 Jun 2024 14:04:32 +0200 Subject: [PATCH 05/18] Completing support if min/maxIncluded in SideTitles (copy etc.) --- lib/src/chart/base/axis_chart/axis_chart_data.dart | 12 ++++++++++++ 1 file changed, 12 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 110741c3b..9fee0a2db 100644 --- a/lib/src/chart/base/axis_chart/axis_chart_data.dart +++ b/lib/src/chart/base/axis_chart/axis_chart_data.dart @@ -180,7 +180,11 @@ class SideTitles with EquatableMixin { /// we try to find a suitable value to set as [interval] under the hood. final double? interval; + /// If true (default), a title for the minimum data value is included + /// independent of the sampling interval final bool minIncluded; + /// If true (default), a title for the maximum data value is included + /// independent of the sampling interval final bool maxIncluded; /// Lerps a [SideTitles] based on [t] value, check [Tween.lerp]. @@ -190,6 +194,8 @@ class SideTitles with EquatableMixin { getTitlesWidget: b.getTitlesWidget, reservedSize: lerpDouble(a.reservedSize, b.reservedSize, t)!, interval: lerpDouble(a.interval, b.interval, t), + minIncluded: b.minIncluded, + maxIncluded: b.maxIncluded, ); } @@ -200,12 +206,16 @@ class SideTitles with EquatableMixin { GetTitleWidgetFunction? getTitlesWidget, double? reservedSize, double? interval, + bool? minIncluded, + bool? maxIncluded, }) { return SideTitles( showTitles: showTitles ?? this.showTitles, getTitlesWidget: getTitlesWidget ?? this.getTitlesWidget, reservedSize: reservedSize ?? this.reservedSize, interval: interval ?? this.interval, + minIncluded: minIncluded ?? this.minIncluded, + maxIncluded: maxIncluded ?? this.maxIncluded, ); } @@ -216,6 +226,8 @@ class SideTitles with EquatableMixin { getTitlesWidget, reservedSize, interval, + minIncluded, + maxIncluded, ]; } From 3792e94afc210eb711a375e5b4bf1a67f76395c3 Mon Sep 17 00:00:00 2001 From: Stefan Czesla Date: Mon, 17 Jun 2024 14:13:03 +0200 Subject: [PATCH 06/18] Added inclusion of min/maxIncluded into SideTitles to documentation --- repo_files/documentations/base_chart.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/repo_files/documentations/base_chart.md b/repo_files/documentations/base_chart.md index 7f40ca0d0..1017f9327 100644 --- a/repo_files/documentations/base_chart.md +++ b/repo_files/documentations/base_chart.md @@ -31,6 +31,9 @@ |getTitlesWidget| A function to retrieve the title widget with given value on the related axis.|defaultGetTitle| |reservedSize| It determines the maximum space that your titles need, |22| |interval| Texts are showing with provided `interval`. If you don't provide anything, we try to find a suitable value to set as `interval` under the hood. | null | +|minIncluded| Determines whether to include title for minimum data value | true | +|maxIncluded| Determines whether to include title for maximum data value | true | + ### SideTitleFitInsideData |PropName |Description |default value| From ed1bdcb1b0a4f272994ebde2abe103359a8d527c Mon Sep 17 00:00:00 2001 From: Stefan Czesla Date: Mon, 24 Jun 2024 23:12:51 +0200 Subject: [PATCH 07/18] Adding unit test to check forwarding of minIncluded/maxIncluded via sideTitles --- .../side_titles/side_titles_test.dart | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 test/chart/base/axis_chart/side_titles/side_titles_test.dart diff --git a/test/chart/base/axis_chart/side_titles/side_titles_test.dart b/test/chart/base/axis_chart/side_titles/side_titles_test.dart new file mode 100644 index 000000000..116d7d62f --- /dev/null +++ b/test/chart/base/axis_chart/side_titles/side_titles_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'; + +void main() { + final data = [ + const FlSpot(0, 0.5), + const FlSpot(1, 1.3), + const FlSpot(2, 1.9), + ]; + + const viewSize = Size(400, 400); + + testWidgets( + 'Test the effect of minIncluded and maxIncluded in sideTitles', + (WidgetTester tester) async { + + // Minimum/maximum included + final mima = [[true, true], [true, false], [false, true], [false, false]]; + + for(final e in mima) { + + final titlesData = FlTitlesData( + leftTitles: AxisTitles( + sideTitles: SideTitles( + showTitles: true, + minIncluded: e[0], + maxIncluded: e[1], + reservedSize: 50, + interval: 1, + ),), + rightTitles: const AxisTitles(), + topTitles: const AxisTitles(), + bottomTitles: const AxisTitles(), + ); + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: Center( + child: SizedBox( + width: viewSize.width, + height: viewSize.height, + child: LineChart( + LineChartData( + titlesData: titlesData, + lineBarsData: [ + LineChartBarData( + spots: data, + ), + ], + ), + ), + ), + ), + ), + ), + ); + // Number of expected text widgets (titles) on the y-axis + expect(find.byType(Text), findsNWidgets((e[0] ? 1 : 0) + (e[1] ? 1 : 0) + 1)); + // Always there + expect(find.text('1'), findsOneWidget); + if(e[0]) { + // Minimum included + expect(find.text('0.5'), findsOneWidget); + } + if(e[1]) { + // Maximum included + expect(find.text('1.9'), findsOneWidget); + } + } + }, + ); +} From 39985b0f15c05ea90fa1813bbf06ff59f3556a77 Mon Sep 17 00:00:00 2001 From: Stefan Czesla Date: Mon, 24 Jun 2024 23:30:02 +0200 Subject: [PATCH 08/18] Adding change #906 change to CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f7e04b81..f0f2c2416 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## newVersion * **BUGFIX** Fix a memory leak issue in the axis-based charts, there was a logic to calculate and cache the minX, maxX, minY and maxY properties to reduce the computation cost. But it caused some memory issues, as we don't have a quick solution for this, we disabled the caching logic for now, later we can move the calculation logic to the render objects to keep and update them only when the data is changed, #1106, #1693 * **BUGFIX** Fix showing grid lines even when there is no line to show in the LineChart, #1691 +* **Improvement** (by @sczesla) Allow users to control minIncluded and maxIncluded using SideTitles, #906 ## 0.68.0 * **Improvement** (by @imaNNeo) Update LineChartSample6 to implement a way to show a tooltip on a single spot, #1620 From 9fc2628e3600e585d5ed8cda469b03128ac5bbd1 Mon Sep 17 00:00:00 2001 From: Stefan Czesla Date: Mon, 24 Jun 2024 23:43:38 +0200 Subject: [PATCH 09/18] Code formatting --- .../base/axis_chart/axis_chart_data.dart | 1 + .../side_titles/side_titles_test.dart | 25 ++++++++++++------- 2 files changed, 17 insertions(+), 9 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 9fee0a2db..156d98df1 100644 --- a/lib/src/chart/base/axis_chart/axis_chart_data.dart +++ b/lib/src/chart/base/axis_chart/axis_chart_data.dart @@ -183,6 +183,7 @@ class SideTitles with EquatableMixin { /// If true (default), a title for the minimum data value is included /// independent of the sampling interval final bool minIncluded; + /// If true (default), a title for the maximum data value is included /// independent of the sampling interval final bool maxIncluded; diff --git a/test/chart/base/axis_chart/side_titles/side_titles_test.dart b/test/chart/base/axis_chart/side_titles/side_titles_test.dart index 116d7d62f..72a283f17 100644 --- a/test/chart/base/axis_chart/side_titles/side_titles_test.dart +++ b/test/chart/base/axis_chart/side_titles/side_titles_test.dart @@ -13,13 +13,16 @@ void main() { testWidgets( 'Test the effect of minIncluded and maxIncluded in sideTitles', - (WidgetTester tester) async { - + (WidgetTester tester) async { // Minimum/maximum included - final mima = [[true, true], [true, false], [false, true], [false, false]]; - - for(final e in mima) { + final mima = [ + [true, true], + [true, false], + [false, true], + [false, false], + ]; + for (final e in mima) { final titlesData = FlTitlesData( leftTitles: AxisTitles( sideTitles: SideTitles( @@ -28,7 +31,8 @@ void main() { maxIncluded: e[1], reservedSize: 50, interval: 1, - ),), + ), + ), rightTitles: const AxisTitles(), topTitles: const AxisTitles(), bottomTitles: const AxisTitles(), @@ -57,14 +61,17 @@ void main() { ), ); // Number of expected text widgets (titles) on the y-axis - expect(find.byType(Text), findsNWidgets((e[0] ? 1 : 0) + (e[1] ? 1 : 0) + 1)); + expect( + find.byType(Text), + findsNWidgets((e[0] ? 1 : 0) + (e[1] ? 1 : 0) + 1), + ); // Always there expect(find.text('1'), findsOneWidget); - if(e[0]) { + if (e[0]) { // Minimum included expect(find.text('0.5'), findsOneWidget); } - if(e[1]) { + if (e[1]) { // Maximum included expect(find.text('1.9'), findsOneWidget); } From 5a9606bd6840f941d18715b7c7f385748f09e0e6 Mon Sep 17 00:00:00 2001 From: Kashiwa Date: Fri, 14 Jun 2024 19:01:03 +0800 Subject: [PATCH 10/18] Remove redundant import of 'dart:math' Removes the redundant import of 'dart:math'. The package was imported twice, once with an alias and once without. Only the alias import ('dart:math' as math) is kept for clarity and to avoid potential conflicts. --- lib/src/utils/utils.dart | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/lib/src/utils/utils.dart b/lib/src/utils/utils.dart index dc5cdffc8..8f63bf5a0 100644 --- a/lib/src/utils/utils.dart +++ b/lib/src/utils/utils.dart @@ -1,5 +1,4 @@ import 'dart:math' as math; -import 'dart:math'; import 'package:flutter/material.dart'; @@ -45,9 +44,9 @@ class Utils { Offset calculateRotationOffset(Size size, double degree) { final rotatedHeight = (size.width * math.sin(radians(degree))).abs() + - (size.height * cos(radians(degree))).abs(); - final rotatedWidth = (size.width * cos(radians(degree))).abs() + - (size.height * sin(radians(degree))).abs(); + (size.height * math.cos(radians(degree))).abs(); + final rotatedWidth = (size.width * math.cos(radians(degree))).abs() + + (size.height * math.sin(radians(degree))).abs(); return Offset( (size.width - rotatedWidth) / 2, (size.height - rotatedHeight) / 2, @@ -178,7 +177,7 @@ class Utils { precisionCount -= numbersToRemove; } - final pow10onPrecision = pow(10, precisionCount); + final pow10onPrecision = math.pow(10, precisionCount); input *= pow10onPrecision; return _roundIntervalAboveOne(input) / pow10onPrecision; } @@ -186,18 +185,18 @@ class Utils { double _roundIntervalAboveOne(double input) { assert(input >= 1.0); final decimalCount = input.toInt().toString().length - 1; - input /= pow(10, decimalCount); + input /= math.pow(10, decimalCount); final scaled = input >= 10 ? input.round() / 10 : input; if (scaled >= 7.6) { - return 10 * pow(10, decimalCount).toInt().toDouble(); + return 10 * math.pow(10, decimalCount).toInt().toDouble(); } else if (scaled >= 2.6) { - return 5 * pow(10, decimalCount).toInt().toDouble(); + return 5 * math.pow(10, decimalCount).toInt().toDouble(); } else if (scaled >= 1.6) { - return 2 * pow(10, decimalCount).toInt().toDouble(); + return 2 * math.pow(10, decimalCount).toInt().toDouble(); } else { - return 1 * pow(10, decimalCount).toInt().toDouble(); + return 1 * math.pow(10, decimalCount).toInt().toDouble(); } } From 37371d8bdcbaa8b2bf749fd1432d2fd36397e992 Mon Sep 17 00:00:00 2001 From: elizabethzhenliu Date: Tue, 28 May 2024 15:46:41 +0200 Subject: [PATCH 11/18] fixed touch detection to select topmost spot. Spots are rendered in order so the last spot in the list is on "top" for the viewer. If spots intersect, touch should return the upmost spot, which we accomplish by reversing the loop for touch selection. --- lib/src/chart/scatter_chart/scatter_chart_painter.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/src/chart/scatter_chart/scatter_chart_painter.dart b/lib/src/chart/scatter_chart/scatter_chart_painter.dart index 109091ae2..ad7117037 100644 --- a/lib/src/chart/scatter_chart/scatter_chart_painter.dart +++ b/lib/src/chart/scatter_chart/scatter_chart_painter.dart @@ -364,7 +364,8 @@ class ScatterChartPainter extends AxisChartPainter { ) { final data = holder.data; - for (var i = 0; i < data.scatterSpots.length; i++) { + for (var i = data.scatterSpots.length - 1; i >= 0; i--) { + // Reverse the loop to check the topmost spot first final spot = data.scatterSpots[i]; final spotPixelX = getPixelX(spot.x, viewSize, holder); From 99ae675184f1ce36b871a2245155c591c046e76e Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Tue, 27 Aug 2024 00:30:28 +0200 Subject: [PATCH 12/18] Update CHANGELOG.md --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f0f2c2416..6b0f3389d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,8 @@ ## newVersion * **BUGFIX** Fix a memory leak issue in the axis-based charts, there was a logic to calculate and cache the minX, maxX, minY and maxY properties to reduce the computation cost. But it caused some memory issues, as we don't have a quick solution for this, we disabled the caching logic for now, later we can move the calculation logic to the render objects to keep and update them only when the data is changed, #1106, #1693 * **BUGFIX** Fix showing grid lines even when there is no line to show in the LineChart, #1691 -* **Improvement** (by @sczesla) Allow users to control minIncluded and maxIncluded using SideTitles, #906 +* **IMPROVEMENT** (by @sczesla) Allow users to control minIncluded and maxIncluded using SideTitles, #906 +* **IMPROVEMENT** (by @elizabethzhenliu) Reverse the touch order in ScatterChart, so now the top spots are touched first ## 0.68.0 * **Improvement** (by @imaNNeo) Update LineChartSample6 to implement a way to show a tooltip on a single spot, #1620 From a6b2d24e607d580926863ec19511800c6d965e5c Mon Sep 17 00:00:00 2001 From: neer-pathak Date: Sun, 19 May 2024 14:37:12 +0530 Subject: [PATCH 13/18] fix: Linux Example App Build --- example/linux/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/linux/CMakeLists.txt b/example/linux/CMakeLists.txt index 49b2e3101..228a43f98 100644 --- a/example/linux/CMakeLists.txt +++ b/example/linux/CMakeLists.txt @@ -4,7 +4,7 @@ project(runner LANGUAGES CXX) # The name of the executable created for the application. Change this to change # the on-disk name of your application. -set(BINARY_NAME "FL Chart App") +set(BINARY_NAME "fLChartApp") # The unique GTK application identifier for this application. See: # https://wiki.gnome.org/HowDoI/ChooseApplicationID set(APPLICATION_ID "dev.flchart.app") From f5af4e5152f46e0852f70b949a0d4609d12ede22 Mon Sep 17 00:00:00 2001 From: Tobias Rump Date: Mon, 13 May 2024 22:17:41 +0200 Subject: [PATCH 14/18] Update bar_chart.md to fix #1608 --- 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 0e19d47b6..aa72cd1a0 100644 --- a/repo_files/documentations/bar_chart.md +++ b/repo_files/documentations/bar_chart.md @@ -19,7 +19,7 @@ When you change the chart's state, it animates to the new state internally (usin |:---------------|:---------------|:-------| |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 `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| +|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.spaceEvenly| |titlesData| check the [FlTitlesData](base_chart.md#FlTitlesData)|FlTitlesData()| |axisTitleData| check the [FlAxisTitleData](base_chart.md#FlAxisTitleData)| FlAxisTitleData()| |rangeAnnotations| show range annotations behind the chart, check [RangeAnnotations](base_chart.md#RangeAnnotations) | RangeAnnotations()| From b0a50a4c13bdf833eac9cf6f73853e0fe4243e34 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Tue, 27 Aug 2024 00:34:09 +0200 Subject: [PATCH 15/18] Update CHANGELOG.md --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b0f3389d..ca3b2e0f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,10 @@ * **BUGFIX** Fix a memory leak issue in the axis-based charts, there was a logic to calculate and cache the minX, maxX, minY and maxY properties to reduce the computation cost. But it caused some memory issues, as we don't have a quick solution for this, we disabled the caching logic for now, later we can move the calculation logic to the render objects to keep and update them only when the data is changed, #1106, #1693 * **BUGFIX** Fix showing grid lines even when there is no line to show in the LineChart, #1691 * **IMPROVEMENT** (by @sczesla) Allow users to control minIncluded and maxIncluded using SideTitles, #906 -* **IMPROVEMENT** (by @elizabethzhenliu) Reverse the touch order in ScatterChart, so now the top spots are touched first +* **IMPROVEMENT** (by @elizabethzhenliu) Reverse the touch order in ScatterChart, so now the top spots are touched first, #1675 +* **IMPROVEMENT** (by @ksw2000) Remove redundant math import, #1683 +* **IMPROVEMENT** (by @Neer-Pathak) Fix linux example build issue, #1668 +* **IMPROVEMENT** (by @TobiasRump) Update the bar chart documentation, #1662 ## 0.68.0 * **Improvement** (by @imaNNeo) Update LineChartSample6 to implement a way to show a tooltip on a single spot, #1620 From 12b1a8520ec5a14c5e559a8b533d18e7dcd39448 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Tue, 27 Aug 2024 00:41:57 +0200 Subject: [PATCH 16/18] Update CHANGELOG.md --- CHANGELOG.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca3b2e0f5..ff6456304 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ -## newVersion -* **BUGFIX** Fix a memory leak issue in the axis-based charts, there was a logic to calculate and cache the minX, maxX, minY and maxY properties to reduce the computation cost. But it caused some memory issues, as we don't have a quick solution for this, we disabled the caching logic for now, later we can move the calculation logic to the render objects to keep and update them only when the data is changed, #1106, #1693 -* **BUGFIX** Fix showing grid lines even when there is no line to show in the LineChart, #1691 +## 0.69.0 +* **BUGFIX** (by @imaNNeo) Fix a memory leak issue in the axis-based charts, there was a logic to calculate and cache the minX, maxX, minY and maxY properties to reduce the computation cost. But it caused some memory issues, as we don't have a quick solution for this, we disabled the caching logic for now, later we can move the calculation logic to the render objects to keep and update them only when the data is changed, #1106, #1693 +* **BUGFIX** (by @imaNNeo) Fix showing grid lines even when there is no line to show in the LineChart, #1691 * **IMPROVEMENT** (by @sczesla) Allow users to control minIncluded and maxIncluded using SideTitles, #906 * **IMPROVEMENT** (by @elizabethzhenliu) Reverse the touch order in ScatterChart, so now the top spots are touched first, #1675 * **IMPROVEMENT** (by @ksw2000) Remove redundant math import, #1683 From c0b76b86758bcaaca9bdb3da969f76f3ad47f2a0 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Tue, 27 Aug 2024 00:41:57 +0200 Subject: [PATCH 17/18] Bump version to 0.69.0 --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 2c8058f95..fc4cd4a67 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.68.0 +version: 0.69.0 homepage: https://flchart.dev/ repository: https://github.com/imaNNeo/fl_chart issue_tracker: https://github.com/imaNNeo/fl_chart/issues From 15c66cf7ae59f2c1cf46445d0c681e0e623396ab Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Sun, 8 Sep 2024 19:47:37 +0200 Subject: [PATCH 18/18] Upgrade example/ dependencies --- example/macos/Podfile.lock | 6 +++--- example/macos/Runner/AppDelegate.swift | 2 +- example/pubspec.yaml | 18 +++++++++--------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/example/macos/Podfile.lock b/example/macos/Podfile.lock index bf60fa4d3..8fc3fc4ef 100644 --- a/example/macos/Podfile.lock +++ b/example/macos/Podfile.lock @@ -26,9 +26,9 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 - package_info_plus: 02d7a575e80f194102bef286361c6c326e4c29ce - path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 - url_launcher_macos: d2691c7dd33ed713bf3544850a623080ec693d95 + package_info_plus: fa739dd842b393193c5ca93c26798dff6e3d0e0c + path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 + url_launcher_macos: 5f437abeda8c85500ceb03f5c1938a8c5a705399 PODFILE CHECKSUM: 353c8bcc5d5b0994e508d035b5431cfe18c1dea7 diff --git a/example/macos/Runner/AppDelegate.swift b/example/macos/Runner/AppDelegate.swift index d53ef6437..8e02df288 100644 --- a/example/macos/Runner/AppDelegate.swift +++ b/example/macos/Runner/AppDelegate.swift @@ -1,7 +1,7 @@ import Cocoa import FlutterMacOS -@NSApplicationMain +@main class AppDelegate: FlutterAppDelegate { override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { return true diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 29165d565..4c1d636ff 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -10,24 +10,24 @@ dependencies: sdk: flutter flutter_web_plugins: sdk: flutter - cupertino_icons: ^1.0.6 - google_fonts: ^6.1.0 - flutter_svg: ^2.0.7 - universal_platform: ^1.0.0+1 + cupertino_icons: ^1.0.8 + google_fonts: ^6.2.1 + flutter_svg: ^2.0.10+1 + universal_platform: ^1.1.0 flutter_staggered_grid_view: ^0.7.0 - url_launcher: ^6.1.14 - go_router: ^11.1.2 + url_launcher: ^6.3.0 + go_router: ^14.2.7 dartx: ^1.2.0 fl_chart: path: ../ - flutter_bloc: ^8.1.3 - package_info_plus: ^4.2.0 + flutter_bloc: ^8.1.6 + package_info_plus: ^8.0.2 equatable: ^2.0.5 dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^2.0.3 + flutter_lints: ^4.0.0 flutter: uses-material-design: true