diff --git a/packages/flutter/lib/src/material/slider.dart b/packages/flutter/lib/src/material/slider.dart index 80ee4825c4..bb63e2f46a 100644 --- a/packages/flutter/lib/src/material/slider.dart +++ b/packages/flutter/lib/src/material/slider.dart @@ -817,6 +817,11 @@ class _SliderState extends State with TickerProviderStateMixin { ?? MaterialStateProperty.resolveAs(defaults.overlayColor, states); } + TextStyle valueIndicatorTextStyle = sliderTheme.valueIndicatorTextStyle ?? defaults.valueIndicatorTextStyle!; + if (MediaQuery.boldTextOf(context)) { + valueIndicatorTextStyle = valueIndicatorTextStyle.merge(const TextStyle(fontWeight: FontWeight.bold)); + } + sliderTheme = sliderTheme.copyWith( trackHeight: sliderTheme.trackHeight ?? defaults.trackHeight, activeTrackColor: widget.activeColor ?? sliderTheme.activeTrackColor ?? defaults.activeTrackColor, @@ -839,7 +844,7 @@ class _SliderState extends State with TickerProviderStateMixin { overlayShape: sliderTheme.overlayShape ?? defaultOverlayShape, valueIndicatorShape: valueIndicatorShape, showValueIndicator: sliderTheme.showValueIndicator ?? defaultShowValueIndicator, - valueIndicatorTextStyle: sliderTheme.valueIndicatorTextStyle ?? defaults.valueIndicatorTextStyle, + valueIndicatorTextStyle: valueIndicatorTextStyle, ); final MouseCursor effectiveMouseCursor = MaterialStateProperty.resolveAs(widget.mouseCursor, states) ?? sliderTheme.mouseCursor?.resolve(states) diff --git a/packages/flutter/test/material/slider_test.dart b/packages/flutter/test/material/slider_test.dart index ec3ef60ef8..bc0e5d6a6d 100644 --- a/packages/flutter/test/material/slider_test.dart +++ b/packages/flutter/test/material/slider_test.dart @@ -49,6 +49,36 @@ class LoggingThumbShape extends SliderComponentShape { } } +// A value indicator shape to log labelPainter text. +class LoggingValueIndicatorShape extends SliderComponentShape { + LoggingValueIndicatorShape(this.logLabel); + + final List logLabel; + + @override + Size getPreferredSize(bool isEnabled, bool isDiscrete) { + return const Size(10.0, 10.0); + } + + @override + void paint( + PaintingContext context, + Offset offset, { + required Animation activationAnimation, + required Animation enableAnimation, + required bool isDiscrete, + required TextPainter labelPainter, + required RenderBox parentBox, + required SliderThemeData sliderTheme, + required TextDirection textDirection, + required double value, + required double textScaleFactor, + required Size sizeWithOverflow, + }) { + logLabel.add(labelPainter.text!); + } +} + class TallSliderTickMarkShape extends SliderTickMarkShape { @override Size getPreferredSize({required SliderThemeData sliderTheme, required bool isEnabled}) { @@ -975,6 +1005,79 @@ void main() { } }); + testWidgets('Slider value indicator respects bold text', (WidgetTester tester) async { + final Key sliderKey = UniqueKey(); + double value = 0.0; + final List log = []; + final LoggingValueIndicatorShape loggingValueIndicatorShape = LoggingValueIndicatorShape(log); + + Widget buildSlider({ bool boldText = false }) { + return MaterialApp( + home: Directionality( + textDirection: TextDirection.ltr, + child: StatefulBuilder( + builder: (BuildContext context, StateSetter setState) { + return MediaQuery( + data: MediaQueryData(boldText: boldText), + child: Material( + child: Theme( + data: Theme.of(context).copyWith( + sliderTheme: Theme.of(context).sliderTheme.copyWith( + showValueIndicator: ShowValueIndicator.always, + valueIndicatorShape: loggingValueIndicatorShape, + ), + ), + child: Center( + child: OverflowBox( + maxWidth: double.infinity, + maxHeight: double.infinity, + child: Slider( + key: sliderKey, + max: 100.0, + divisions: 4, + label: '${value.round()}', + value: value, + onChanged: (double newValue) { + setState(() { + value = newValue; + }); + }, + ), + ), + ), + ), + ), + ); + }, + ), + ), + ); + } + // Normal text + await tester.pumpWidget(buildSlider()); + Offset center = tester.getCenter(find.byType(Slider)); + TestGesture gesture = await tester.startGesture(center); + await tester.pumpAndSettle(); + + expect(log.last.toPlainText(), '50'); + expect(log.last.style!.fontWeight, FontWeight.w500); + + await gesture.up(); + await tester.pumpAndSettle(); + + // Bold text + await tester.pumpWidget(buildSlider(boldText: true)); + center = tester.getCenter(find.byType(Slider)); + gesture = await tester.startGesture(center); + await tester.pumpAndSettle(); + + expect(log.last.toPlainText(), '50'); + expect(log.last.style!.fontWeight, FontWeight.w700); + + await gesture.up(); + await tester.pumpAndSettle(); + }); + testWidgets('Tick marks are skipped when they are too dense', (WidgetTester tester) async { Widget buildSlider({ required int divisions,