From 134043c2271975626b6c1736805af8e2f949a1d3 Mon Sep 17 00:00:00 2001 From: karolinaoparczyk Date: Tue, 22 Jul 2025 12:00:52 +0200 Subject: [PATCH 1/2] Add mounted checks before setState calls to prevent runtime errors --- lib/src/view/flutter_slider_widget.dart | 38 ++++++++++++++++++------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/lib/src/view/flutter_slider_widget.dart b/lib/src/view/flutter_slider_widget.dart index 0d97dd9..e012d32 100644 --- a/lib/src/view/flutter_slider_widget.dart +++ b/lib/src/view/flutter_slider_widget.dart @@ -435,8 +435,9 @@ class _FlutterSliderState extends State _arrangeHandlersPosition(); _drawHatchMark(); - - setState(() {}); + if (mounted) { + setState(() {}); + } }); } @@ -1042,7 +1043,10 @@ class _FlutterSliderState extends State if (widget.lockHandlers || lockedHandlersDragOffset > 0) { _lockedHandlers('leftHandler'); } - setState(() {}); + + if (mounted) { + setState(() {}); + } if (selectedByTap) { _callbacks('onDragging', 0); @@ -1290,7 +1294,9 @@ class _FlutterSliderState extends State _lockedHandlers('rightHandler'); } - setState(() {}); + if (mounted) { + setState(() {}); + } if (selectedByTap) { _callbacks('onDragging', 1); @@ -1503,7 +1509,9 @@ class _FlutterSliderState extends State _leftHandlerScaleAnimationController!.forward(); - setState(() {}); + if (mounted) { + setState(() {}); + } _callbacks('onDragStarted', 0); }, @@ -1523,7 +1531,9 @@ class _FlutterSliderState extends State _hideTooltips(); - setState(() {}); + if (mounted) { + setState(() {}); + } _callbacks('onDragCompleted', 0); }, @@ -1630,7 +1640,9 @@ class _FlutterSliderState extends State _leftTooltipAnimationController.forward(); } - setState(() {}); + if (mounted) { + setState(() {}); + } } if (widget.rangeSlider == false) _leftHandlerScaleAnimationController!.forward(); @@ -1662,7 +1674,9 @@ class _FlutterSliderState extends State _hideTooltips(); - setState(() {}); + if (mounted) { + setState(() {}); + } _callbacks('onDragCompleted', 1); }, @@ -1770,7 +1784,9 @@ class _FlutterSliderState extends State __dragging = false; - setState(() {}); + if (mounted) { + setState(() {}); + } }, onPointerMove: (_) { __dragging = true; @@ -1911,7 +1927,9 @@ class _FlutterSliderState extends State } } - setState(() {}); + if (mounted) { + setState(() {}); + } }, child: Draggable( axis: widget.axis, From e90805ab1c5a692ad83f96d848c4543eff2e99cc Mon Sep 17 00:00:00 2001 From: karolinaoparczyk Date: Tue, 22 Jul 2025 12:41:13 +0200 Subject: [PATCH 2/2] Enhance mounted checks with early returns --- lib/src/view/flutter_slider_widget.dart | 62 ++++++++++++++----------- 1 file changed, 34 insertions(+), 28 deletions(-) diff --git a/lib/src/view/flutter_slider_widget.dart b/lib/src/view/flutter_slider_widget.dart index e012d32..9703436 100644 --- a/lib/src/view/flutter_slider_widget.dart +++ b/lib/src/view/flutter_slider_widget.dart @@ -912,8 +912,9 @@ class _FlutterSliderState extends State {double lockedHandlersDragOffset = 0, double tappedPositionWithPadding = 0, bool selectedByTap = false}) { - if (widget.disabled || (widget.handler != null && widget.handler!.disabled)) - return; + if (!mounted || + widget.disabled || + (widget.handler != null && widget.handler!.disabled)) return; _handlersDistance = widget.lockDistance ?? _upperValue! - _lowerValue!; @@ -1044,9 +1045,7 @@ class _FlutterSliderState extends State _lockedHandlers('leftHandler'); } - if (mounted) { - setState(() {}); - } + setState(() {}); if (selectedByTap) { _callbacks('onDragging', 0); @@ -1168,7 +1167,8 @@ class _FlutterSliderState extends State void _rightHandlerMove(PointerEvent pointer, {double tappedPositionWithPadding = 0, bool selectedByTap = false}) { - if (widget.disabled || + if (!mounted || + widget.disabled || (widget.rightHandler != null && widget.rightHandler!.disabled)) return; _handlersDistance = widget.lockDistance ?? _upperValue! - _lowerValue!; @@ -1294,9 +1294,7 @@ class _FlutterSliderState extends State _lockedHandlers('rightHandler'); } - if (mounted) { - setState(() {}); - } + setState(() {}); if (selectedByTap) { _callbacks('onDragging', 1); @@ -1483,12 +1481,15 @@ class _FlutterSliderState extends State ), feedback: Container()), onPointerMove: (_) { + if (!mounted) return; + __dragging = true; _leftHandlerMove(_); }, onPointerDown: (_) { - if (widget.disabled || + if (!mounted || + widget.disabled || (widget.handler != null && widget.handler!.disabled)) return; _renderBoxInitialization(); @@ -1509,13 +1510,13 @@ class _FlutterSliderState extends State _leftHandlerScaleAnimationController!.forward(); - if (mounted) { - setState(() {}); - } + setState(() {}); _callbacks('onDragStarted', 0); }, onPointerUp: (_) { + if (!mounted) return; + __dragging = false; _adjustLeftHandlerPosition(); @@ -1531,9 +1532,7 @@ class _FlutterSliderState extends State _hideTooltips(); - if (mounted) { - setState(() {}); - } + setState(() {}); _callbacks('onDragCompleted', 0); }, @@ -1569,6 +1568,8 @@ class _FlutterSliderState extends State } void _hideTooltips() { + if (!mounted) return; + if (!_tooltipData.alwaysShowTooltip!) { _leftTooltipOpacity = 0; _rightTooltipOpacity = 0; @@ -1612,6 +1613,8 @@ class _FlutterSliderState extends State // color: Colors.blue.withOpacity(0.7), )), onPointerMove: (_) { + if (!mounted) return; + __dragging = true; if (!_tooltipData.disabled! && @@ -1621,6 +1624,7 @@ class _FlutterSliderState extends State _rightHandlerMove(_); }, onPointerDown: (_) { + if (!mounted) return; if (widget.disabled || (widget.rightHandler != null && widget.rightHandler!.disabled)) return; @@ -1640,9 +1644,7 @@ class _FlutterSliderState extends State _leftTooltipAnimationController.forward(); } - if (mounted) { - setState(() {}); - } + setState(() {}); } if (widget.rangeSlider == false) _leftHandlerScaleAnimationController!.forward(); @@ -1652,6 +1654,8 @@ class _FlutterSliderState extends State _callbacks('onDragStarted', 1); }, onPointerUp: (_) { + if (!mounted) return; + __dragging = false; _adjustRightHandlerPosition(); @@ -1674,9 +1678,7 @@ class _FlutterSliderState extends State _hideTooltips(); - if (mounted) { - setState(() {}); - } + setState(() {}); _callbacks('onDragCompleted', 1); }, @@ -1713,6 +1715,8 @@ class _FlutterSliderState extends State void _stopHandlerAnimation( {Animation? animation, AnimationController? controller}) { + if (!mounted) return; + if (widget.handlerAnimation.reverseCurve != null) { if (animation!.isCompleted) controller!.reverse(); @@ -1742,6 +1746,8 @@ class _FlutterSliderState extends State opacity: 0, child: Listener( onPointerUp: (_) { + if (!mounted) return; + if (widget.selectByTap && !__dragging) { tappedPositionWithPadding = _distance(); if (_distanceFromLeftHandler! < _distanceFromRightHandler!) { @@ -1784,11 +1790,11 @@ class _FlutterSliderState extends State __dragging = false; - if (mounted) { - setState(() {}); - } + setState(() {}); }, onPointerMove: (_) { + if (!mounted) return; + __dragging = true; if (_slidingByActiveTrackBar) { @@ -1831,6 +1837,8 @@ class _FlutterSliderState extends State } }, onPointerDown: (_) { + if (!mounted) return; + _leftTapAndSlide = false; _rightTapAndSlide = false; _slidingByActiveTrackBar = false; @@ -1927,9 +1935,7 @@ class _FlutterSliderState extends State } } - if (mounted) { - setState(() {}); - } + setState(() {}); }, child: Draggable( axis: widget.axis,