From c42c9fdc184036a47d16be7447869d6638b96ec0 Mon Sep 17 00:00:00 2001 From: Aron Metzig Date: Thu, 16 Feb 2023 00:54:15 +0100 Subject: [PATCH 1/5] fixed memory leak in widget logic --- lib/src/chart.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/src/chart.dart b/lib/src/chart.dart index d79fb77..68e779c 100644 --- a/lib/src/chart.dart +++ b/lib/src/chart.dart @@ -74,6 +74,8 @@ class _ChartState extends State with TickerProviderStateMixin { @override void dispose() { _controller.dispose(); + widget.layers.forEach((e) => e.dispose()); + _disposeOldLayers(); super.dispose(); } From 41a50886cb4c46043eb70a381b1c7c57b632c1c8 Mon Sep 17 00:00:00 2001 From: Aron Metzig Date: Thu, 16 Feb 2023 00:54:39 +0100 Subject: [PATCH 2/5] Fixed memory leaks in animation logic --- lib/src/chart.dart | 1 - .../animation/chart_color_animation.dart | 18 ++++++++++-------- .../animation/chart_position_animation.dart | 17 +++++++++-------- .../models/animation/chart_size_animation.dart | 17 +++++++++-------- .../animation/chart_text_style_animation.dart | 18 ++++++++++-------- 5 files changed, 38 insertions(+), 33 deletions(-) diff --git a/lib/src/chart.dart b/lib/src/chart.dart index 68e779c..0d1c2cf 100644 --- a/lib/src/chart.dart +++ b/lib/src/chart.dart @@ -75,7 +75,6 @@ class _ChartState extends State with TickerProviderStateMixin { void dispose() { _controller.dispose(); widget.layers.forEach((e) => e.dispose()); - _disposeOldLayers(); super.dispose(); } diff --git a/lib/src/models/animation/chart_color_animation.dart b/lib/src/models/animation/chart_color_animation.dart index 9554e93..8a0192d 100644 --- a/lib/src/models/animation/chart_color_animation.dart +++ b/lib/src/models/animation/chart_color_animation.dart @@ -3,6 +3,8 @@ part of 'chart_animation.dart'; /// Provides color animation values. class ChartColorAnimation implements ChartAnimation { Animation? _animation; + CurvedAnimation? _listener; + Color _lastColor = Colors.transparent; ChartColorAnimation(); @@ -21,6 +23,7 @@ class ChartColorAnimation implements ChartAnimation { @override void dispose() { _animation = null; + _listener?.dispose(); } /// Initialize animation. @@ -31,15 +34,14 @@ class ChartColorAnimation implements ChartAnimation { Color? initialColor, ChartColorAnimation? oldAnimation, }) { - final Animation animation = ColorTween( + _listener?.dispose(); + _listener = CurvedAnimation( + parent: controller, + curve: curve, + ); + _animation = ColorTween( begin: oldAnimation?._lastColor ?? initialColor ?? Colors.transparent, end: color, - ).animate( - CurvedAnimation( - parent: controller, - curve: curve, - ), - ); - _animation = animation; + ).animate(_listener!); } } diff --git a/lib/src/models/animation/chart_position_animation.dart b/lib/src/models/animation/chart_position_animation.dart index 199784b..255227a 100644 --- a/lib/src/models/animation/chart_position_animation.dart +++ b/lib/src/models/animation/chart_position_animation.dart @@ -3,6 +3,7 @@ part of 'chart_animation.dart'; /// Provides position animation values. class ChartPositionAnimation implements ChartAnimation { Animation? _animation; + CurvedAnimation? _listener; Offset _lastPosition = Offset.zero; ChartPositionAnimation(); @@ -21,6 +22,7 @@ class ChartPositionAnimation implements ChartAnimation { @override void dispose() { _animation = null; + _listener?.dispose(); } /// Initialize animation. @@ -31,15 +33,14 @@ class ChartPositionAnimation implements ChartAnimation { Offset? initialPosition, ChartPositionAnimation? oldAnimation, }) { - final Animation animation = Tween( + _listener?.dispose(); + _listener = CurvedAnimation( + parent: controller, + curve: curve, + ); + _animation = Tween( begin: oldAnimation?._lastPosition ?? initialPosition ?? position, end: position, - ).animate( - CurvedAnimation( - parent: controller, - curve: curve, - ), - ); - _animation = animation; + ).animate(_listener!); } } diff --git a/lib/src/models/animation/chart_size_animation.dart b/lib/src/models/animation/chart_size_animation.dart index bb42268..cb6130a 100644 --- a/lib/src/models/animation/chart_size_animation.dart +++ b/lib/src/models/animation/chart_size_animation.dart @@ -3,6 +3,7 @@ part of 'chart_animation.dart'; /// Provides size animation values. class ChartSizeAnimation implements ChartAnimation { Animation? _animation; + CurvedAnimation? _listener; Size _lastSize = Size.zero; ChartSizeAnimation(); @@ -21,6 +22,7 @@ class ChartSizeAnimation implements ChartAnimation { @override void dispose() { _animation = null; + _listener?.dispose(); } /// Initialize animation. @@ -31,15 +33,14 @@ class ChartSizeAnimation implements ChartAnimation { Size? initialSize, ChartSizeAnimation? oldAnimation, }) { - final Animation animation = Tween( + _listener?.dispose(); + _listener = CurvedAnimation( + parent: controller, + curve: curve, + ); + _animation = Tween( begin: oldAnimation?._lastSize ?? initialSize ?? size, end: size, - ).animate( - CurvedAnimation( - parent: controller, - curve: curve, - ), - ); - _animation = animation; + ).animate(_listener!); } } diff --git a/lib/src/models/animation/chart_text_style_animation.dart b/lib/src/models/animation/chart_text_style_animation.dart index b51e556..2b14aab 100644 --- a/lib/src/models/animation/chart_text_style_animation.dart +++ b/lib/src/models/animation/chart_text_style_animation.dart @@ -3,6 +3,8 @@ part of 'chart_animation.dart'; /// Provides text style animation values. class ChartTextStyleAnimation implements ChartAnimation { Animation? _animation; + CurvedAnimation? _listener; + TextStyle _lastTextStyle = const TextStyle( color: Colors.transparent, ); @@ -26,6 +28,7 @@ class ChartTextStyleAnimation implements ChartAnimation { @override void dispose() { _animation = null; + _listener?.dispose(); } /// Initialize animation. @@ -36,19 +39,18 @@ class ChartTextStyleAnimation implements ChartAnimation { TextStyle? initialTextSyle, ChartTextStyleAnimation? oldAnimation, }) { - final Animation animation = TextStyleTween( + _listener?.dispose(); + _listener = CurvedAnimation( + parent: controller, + curve: curve, + ); + _animation = TextStyleTween( begin: oldAnimation?._lastTextStyle ?? initialTextSyle ?? const TextStyle( color: Colors.transparent, ), end: textStyle, - ).animate( - CurvedAnimation( - parent: controller, - curve: curve, - ), - ); - _animation = animation; + ).animate(_listener!); } } From 294095016d1bf04a49ac99037588b027fa7786d2 Mon Sep 17 00:00:00 2001 From: Aron Metzig Date: Thu, 16 Feb 2023 12:56:27 +0100 Subject: [PATCH 3/5] typed generic --- lib/src/chart.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/chart.dart b/lib/src/chart.dart index 0d1c2cf..d5d4aae 100644 --- a/lib/src/chart.dart +++ b/lib/src/chart.dart @@ -87,7 +87,7 @@ class _ChartState extends State with TickerProviderStateMixin { Expanded( child: AnimatedBuilder( animation: _controller, - builder: (_, __) => ChartTouchDetector( + builder: (_, __) => ChartTouchDetector( onShapes: () => _touchableShapes, onTap: ((touchPosition, data) => setState(() { _touchedData = data == null From 4988452bf89b56f35980367d5da0d4775fce4368 Mon Sep 17 00:00:00 2001 From: Aron Metzig Date: Thu, 16 Feb 2023 12:57:53 +0100 Subject: [PATCH 4/5] bumped version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index c485130..7ee7044 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: mrx_charts description: Simple, high-performance Flutter charts with beautiful animations. -version: 0.1.3 +version: 0.1.4 repository: https://github.com/merixstudio/mrx-flutter-charts issue_tracker: https://github.com/merixstudio/mrx-flutter-charts/issues homepage: From 1e6e767054aa784b8402293bdb1d502a6c941868 Mon Sep 17 00:00:00 2001 From: Aron Metzig Date: Thu, 16 Feb 2023 13:28:35 +0100 Subject: [PATCH 5/5] fix memory leak for touch events --- lib/src/models/line/chart_line_data_item.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/src/models/line/chart_line_data_item.dart b/lib/src/models/line/chart_line_data_item.dart index 341d30c..b7687de 100644 --- a/lib/src/models/line/chart_line_data_item.dart +++ b/lib/src/models/line/chart_line_data_item.dart @@ -61,6 +61,7 @@ class ChartLineDataItem extends ChartDataItem { @override void dispose() { _value.dispose(); + _touch.dispose(); } /// Initialize touch area animations.