diff --git a/packages/flutter/lib/src/material/slider.dart b/packages/flutter/lib/src/material/slider.dart index f525dfcf0a..b4404e12c4 100644 --- a/packages/flutter/lib/src/material/slider.dart +++ b/packages/flutter/lib/src/material/slider.dart @@ -713,6 +713,7 @@ class _SliderState extends State with TickerProviderStateMixin { if (focused != _focused) { setState(() { _focused = focused; }); } + showValueIndicator(); } bool _hovering = false; diff --git a/packages/flutter/test/material/slider_test.dart b/packages/flutter/test/material/slider_test.dart index 5ed7412aba..aab8060de2 100644 --- a/packages/flutter/test/material/slider_test.dart +++ b/packages/flutter/test/material/slider_test.dart @@ -4484,12 +4484,12 @@ void main() { ), ); - // Slider does not show value indicator initially. + // Slider shows value indicator initially on focus. await tester.pumpAndSettle(); RenderBox valueIndicatorBox = tester.renderObject(find.byType(Overlay)); expect( valueIndicatorBox, - isNot(paints..scale()..path(color: theme.colorScheme.primary)), + paints..scale()..path(color: theme.colorScheme.primary), ); // Right arrow (increase) @@ -4548,4 +4548,54 @@ void main() { paints..scale()..path(color: theme.colorScheme.primary), ); }, variant: TargetPlatformVariant.desktop()); + + testWidgets('Value indicator label is shown when focused', (WidgetTester tester) async { + double value = 0.5; + final FocusNode focusNode = FocusNode(); + addTearDown(focusNode.dispose); + + Widget buildApp() { + return MaterialApp( + home: Material( + child: Center( + child: StatefulBuilder(builder: (BuildContext context, StateSetter setState) { + return Slider( + value: value, + focusNode: focusNode, + divisions: 5, + label: value.toStringAsFixed(1), + onChanged: + (double newValue) { + setState(() { + value = newValue; + }); + } + ); + }), + ), + ), + ); + } + await tester.pumpWidget(buildApp()); + + // Slider does not show value indicator without focus. + await tester.pumpAndSettle(); + expect(focusNode.hasFocus, false); + RenderBox valueIndicatorBox = tester.renderObject(find.byType(Overlay)); + expect( + valueIndicatorBox, + isNot(paints..path(color: const Color(0xff000000))..paragraph()), + ); + + focusNode.requestFocus(); + await tester.pumpAndSettle(); + expect(focusNode.hasFocus, true); + + // Slider shows value indicator when focused. + valueIndicatorBox = tester.renderObject(find.byType(Overlay)); + expect( + valueIndicatorBox, + paints..path(color: const Color(0xff000000))..paragraph(), + ); + }, variant: TargetPlatformVariant.desktop()); }