diff --git a/packages/flutter/lib/src/material/slider.dart b/packages/flutter/lib/src/material/slider.dart index 61acbf04eee65..34b806c87c64e 100644 --- a/packages/flutter/lib/src/material/slider.dart +++ b/packages/flutter/lib/src/material/slider.dart @@ -1484,6 +1484,9 @@ class _RenderSlider extends RenderBox with RelayoutWhenSystemFontsChangeMixin { } void _startInteraction(Offset globalPosition) { + if (!_state.mounted) { + return; + } _state.showValueIndicator(); if (!_active && isInteractive) { switch (allowedInteraction) { diff --git a/packages/flutter/test/material/slider_test.dart b/packages/flutter/test/material/slider_test.dart index a8bf69325ccea..3b7de2c878590 100644 --- a/packages/flutter/test/material/slider_test.dart +++ b/packages/flutter/test/material/slider_test.dart @@ -3654,16 +3654,22 @@ void main() { child: ValueListenableBuilder( valueListenable: shouldShowSliderListenable, builder: (BuildContext context, bool shouldShowSlider, _) { - return shouldShowSlider - ? Slider( - value: value, - onChanged: (double newValue) { - setState(() { - value = newValue; - }); - }, - ) - : const SizedBox.shrink(); + return GestureDetector( + behavior: HitTestBehavior.translucent, + // Note: it is important that `onTap` is non-null so + // [GestureDetector] will register tap events. + onTap: () {}, + child: shouldShowSlider + ? Slider( + value: value, + onChanged: (double newValue) { + setState(() { + value = newValue; + }); + }, + ) + : const SizedBox.expand(), + ); }, ), ), @@ -3674,20 +3680,19 @@ void main() { ), ); + // Move Slider. final TestGesture gesture = await tester - .startGesture(tester.getRect(find.byType(Slider)).centerLeft); + .startGesture(tester.getRect(find.byType(Slider)).center); + await gesture.moveBy(const Offset(1.0, 0.0)); + await tester.pumpAndSettle(); - // Intentionally not calling `await tester.pumpAndSettle()` to allow drag - // event performed on `Slider` before it is about to get unmounted. + // Hide Slider. Slider will dispose and unmount. shouldShowSliderListenable.value = false; - - await tester.drag(find.byType(Slider), const Offset(1.0, 0.0)); await tester.pumpAndSettle(); - expect(value, equals(0.0)); - - // This is supposed to trigger animation on `Slider` if it is mounted. - await gesture.up(); + // Move Slider after unmounted. + await gesture.moveBy(const Offset(1.0, 0.0)); + await tester.pumpAndSettle(); expect(tester.takeException(), null); });