Revert "[Material] Update the Slider and RangeSlider to the latest Material spec (#44351)" (#45268)
This reverts commit 421bf64703b5c0fae7196923da0561f6a4c6ec79.
Was causing severe breakages in Google.
diff --git a/examples/flutter_gallery/lib/demo/material/slider_demo.dart b/examples/flutter_gallery/lib/demo/material/slider_demo.dart
index aae6417..3ba93ec 100644
--- a/examples/flutter_gallery/lib/demo/material/slider_demo.dart
+++ b/examples/flutter_gallery/lib/demo/material/slider_demo.dart
@@ -69,7 +69,6 @@
@required SliderThemeData sliderTheme,
TextDirection textDirection,
Thumb thumb,
- bool isPressed,
}) {
final Canvas canvas = context.canvas;
final ColorTween colorTween = ColorTween(
@@ -131,8 +130,6 @@
SliderThemeData sliderTheme,
TextDirection textDirection,
double value,
- double textScaleFactor,
- Size sizeWithOverflow,
}) {
final Canvas canvas = context.canvas;
final ColorTween colorTween = ColorTween(
@@ -172,8 +169,6 @@
SliderThemeData sliderTheme,
TextDirection textDirection,
double value,
- double textScaleFactor,
- Size sizeWithOverflow,
}) {
final Canvas canvas = context.canvas;
final ColorTween enableColor = ColorTween(
@@ -443,3 +438,4 @@
);
}
}
+
diff --git a/examples/flutter_gallery/lib/gallery/themes.dart b/examples/flutter_gallery/lib/gallery/themes.dart
index 3e66950..7843012 100644
--- a/examples/flutter_gallery/lib/gallery/themes.dart
+++ b/examples/flutter_gallery/lib/gallery/themes.dart
@@ -25,7 +25,6 @@
final ThemeData base = ThemeData(
brightness: Brightness.dark,
accentColorBrightness: Brightness.dark,
- colorScheme: colorScheme,
primaryColor: primaryColor,
primaryColorDark: const Color(0xFF0050a0),
primaryColorLight: secondaryColor,
diff --git a/examples/flutter_gallery/pubspec.yaml b/examples/flutter_gallery/pubspec.yaml
index 94a3801..a16a272 100644
--- a/examples/flutter_gallery/pubspec.yaml
+++ b/examples/flutter_gallery/pubspec.yaml
@@ -257,31 +257,31 @@
weight: 400
- family: LibreFranklin
fonts:
- - asset: packages/flutter_gallery_assets/fonts/librefranklin/LibreFranklin-Bold.ttf
- - asset: packages/flutter_gallery_assets/fonts/librefranklin/LibreFranklin-Light.ttf
- - asset: packages/flutter_gallery_assets/fonts/librefranklin/LibreFranklin-Medium.ttf
- - asset: packages/flutter_gallery_assets/fonts/librefranklin/LibreFranklin-Regular.ttf
+ - asset: packages/flutter_gallery_assets/fonts/librefranklin/LibreFranklin-Bold.ttf
+ - asset: packages/flutter_gallery_assets/fonts/librefranklin/LibreFranklin-Light.ttf
+ - asset: packages/flutter_gallery_assets/fonts/librefranklin/LibreFranklin-Medium.ttf
+ - asset: packages/flutter_gallery_assets/fonts/librefranklin/LibreFranklin-Regular.ttf
- family: Merriweather
fonts:
- - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-BlackItalic.ttf
- - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Italic.ttf
- - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Regular.ttf
- - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Light.ttf
+ - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-BlackItalic.ttf
+ - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Italic.ttf
+ - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Regular.ttf
+ - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Light.ttf
- family: Roboto Condensed
fonts:
- - asset: packages/rally_assets/RobotoCondensed-Light.ttf
- weight: 400
- - asset: packages/rally_assets/RobotoCondensed-Regular.ttf
- weight: 500
- - asset: packages/rally_assets/RobotoCondensed-Bold.ttf
- weight: 700
+ - asset: packages/rally_assets/RobotoCondensed-Light.ttf
+ weight: 400
+ - asset: packages/rally_assets/RobotoCondensed-Regular.ttf
+ weight: 500
+ - asset: packages/rally_assets/RobotoCondensed-Bold.ttf
+ weight: 700
- family: Eczar
fonts:
- - asset: packages/rally_assets/Eczar-Regular.ttf
- weight: 400
- - asset: packages/rally_assets/Eczar-SemiBold.ttf
- weight: 600
- - asset: packages/rally_assets/Eczar-Bold.ttf
- weight: 700
+ - asset: packages/rally_assets/Eczar-Regular.ttf
+ weight: 400
+ - asset: packages/rally_assets/Eczar-SemiBold.ttf
+ weight: 600
+ - asset: packages/rally_assets/Eczar-Bold.ttf
+ weight: 700
-# PUBSPEC CHECKSUM: de7e
\ No newline at end of file
+# PUBSPEC CHECKSUM: de7e
diff --git a/packages/flutter/lib/src/material/range_slider.dart b/packages/flutter/lib/src/material/range_slider.dart
index 9905277..565a108 100644
--- a/packages/flutter/lib/src/material/range_slider.dart
+++ b/packages/flutter/lib/src/material/range_slider.dart
@@ -519,12 +519,12 @@
return null;
};
- static const double _defaultTrackHeight = 4;
+ static const double _defaultTrackHeight = 2;
static const RangeSliderTrackShape _defaultTrackShape = RoundedRectRangeSliderTrackShape();
static const RangeSliderTickMarkShape _defaultTickMarkShape = RoundRangeSliderTickMarkShape();
static const SliderComponentShape _defaultOverlayShape = RoundSliderOverlayShape();
static const RangeSliderThumbShape _defaultThumbShape = RoundRangeSliderThumbShape();
- static const RangeSliderValueIndicatorShape _defaultValueIndicatorShape = RectangularRangeSliderValueIndicatorShape();
+ static const RangeSliderValueIndicatorShape _defaultValueIndicatorShape = PaddleRangeSliderValueIndicatorShape();
static const ShowValueIndicator _defaultShowValueIndicator = ShowValueIndicator.onlyForDiscrete;
static const double _defaultMinThumbSeparation = 8;
@@ -542,19 +542,6 @@
// colors come from the ThemeData.colorScheme. These colors, along with
// the default shapes and text styles are aligned to the Material
// Guidelines.
-
- // The value indicator color is not the same as the thumb and active track
- // (which can be defined by activeColor) if the
- // RectangularSliderValueIndicatorShape is used. In all other cases, the
- // value indicator is assumed to be the same as the active color.
- final RangeSliderValueIndicatorShape valueIndicatorShape = sliderTheme.rangeValueIndicatorShape ?? _defaultValueIndicatorShape;
- Color valueIndicatorColor;
- if (valueIndicatorShape is RectangularRangeSliderValueIndicatorShape) {
- valueIndicatorColor = sliderTheme.valueIndicatorColor ?? Color.alphaBlend(theme.colorScheme.onSurface.withOpacity(0.60), theme.colorScheme.surface.withOpacity(0.90));
- } else {
- valueIndicatorColor = widget.activeColor ?? sliderTheme.valueIndicatorColor ?? theme.colorScheme.primary;
- }
-
sliderTheme = sliderTheme.copyWith(
trackHeight: sliderTheme.trackHeight ?? _defaultTrackHeight,
activeTrackColor: widget.activeColor ?? sliderTheme.activeTrackColor ?? theme.colorScheme.primary,
@@ -569,13 +556,12 @@
overlappingShapeStrokeColor: sliderTheme.overlappingShapeStrokeColor ?? theme.colorScheme.surface,
disabledThumbColor: sliderTheme.disabledThumbColor ?? theme.colorScheme.onSurface.withOpacity(0.38),
overlayColor: widget.activeColor?.withOpacity(0.12) ?? sliderTheme.overlayColor ?? theme.colorScheme.primary.withOpacity(0.12),
- valueIndicatorColor: valueIndicatorColor,
- surfaceColor: sliderTheme.surfaceColor ?? theme.colorScheme.surface,
+ valueIndicatorColor: widget.activeColor ?? sliderTheme.valueIndicatorColor ?? theme.colorScheme.primary,
rangeTrackShape: sliderTheme.rangeTrackShape ?? _defaultTrackShape,
rangeTickMarkShape: sliderTheme.rangeTickMarkShape ?? _defaultTickMarkShape,
rangeThumbShape: sliderTheme.rangeThumbShape ?? _defaultThumbShape,
overlayShape: sliderTheme.overlayShape ?? _defaultOverlayShape,
- rangeValueIndicatorShape: valueIndicatorShape,
+ rangeValueIndicatorShape: sliderTheme.rangeValueIndicatorShape ?? _defaultValueIndicatorShape,
showValueIndicator: sliderTheme.showValueIndicator ?? _defaultShowValueIndicator,
valueIndicatorTextStyle: sliderTheme.valueIndicatorTextStyle ?? theme.textTheme.body2.copyWith(
color: theme.colorScheme.onPrimary,
@@ -584,18 +570,12 @@
thumbSelector: sliderTheme.thumbSelector ?? _defaultRangeThumbSelector,
);
- // This size is used as the max bounds for the painting of the value
- // indicators It must be kept in sync with the function with the same name
- // in slider.dart.
- Size _sizeWithOverflow() => MediaQuery.of(context).size;
-
return _RangeSliderRenderObjectWidget(
values: _unlerpRangeValues(widget.values),
divisions: widget.divisions,
labels: widget.labels,
sliderTheme: sliderTheme,
textScaleFactor: MediaQuery.of(context).textScaleFactor,
- sizeWithOverflow: _sizeWithOverflow(),
onChanged: (widget.onChanged != null) && (widget.max > widget.min) ? _handleChanged : null,
onChangeStart: widget.onChangeStart != null ? _handleDragStart : null,
onChangeEnd: widget.onChangeEnd != null ? _handleDragEnd : null,
@@ -613,7 +593,6 @@
this.labels,
this.sliderTheme,
this.textScaleFactor,
- this.sizeWithOverflow,
this.onChanged,
this.onChangeStart,
this.onChangeEnd,
@@ -626,7 +605,6 @@
final RangeLabels labels;
final SliderThemeData sliderTheme;
final double textScaleFactor;
- final Size sizeWithOverflow;
final ValueChanged<RangeValues> onChanged;
final ValueChanged<RangeValues> onChangeStart;
final ValueChanged<RangeValues> onChangeEnd;
@@ -642,7 +620,6 @@
sliderTheme: sliderTheme,
theme: Theme.of(context),
textScaleFactor: textScaleFactor,
- sizeWithOverflow: sizeWithOverflow,
onChanged: onChanged,
onChangeStart: onChangeStart,
onChangeEnd: onChangeEnd,
@@ -662,7 +639,6 @@
..sliderTheme = sliderTheme
..theme = Theme.of(context)
..textScaleFactor = textScaleFactor
- ..sizeWithOverflow = sizeWithOverflow
..onChanged = onChanged
..onChangeStart = onChangeStart
..onChangeEnd = onChangeEnd
@@ -680,7 +656,6 @@
SliderThemeData sliderTheme,
ThemeData theme,
double textScaleFactor,
- Size sizeWithOverflow,
TargetPlatform platform,
ValueChanged<RangeValues> onChanged,
RangeSemanticFormatterCallback semanticFormatterCallback,
@@ -701,7 +676,6 @@
_sliderTheme = sliderTheme,
_theme = theme,
_textScaleFactor = textScaleFactor,
- _sizeWithOverflow = sizeWithOverflow,
_onChanged = onChanged,
_state = state,
_textDirection = textDirection {
@@ -874,15 +848,6 @@
_updateLabelPainters();
}
- Size get sizeWithOverflow => _sizeWithOverflow;
- Size _sizeWithOverflow;
- set sizeWithOverflow(Size value) {
- if (value == sizeWithOverflow)
- return;
- _sizeWithOverflow = value;
- markNeedsPaint();
- }
-
ValueChanged<RangeValues> get onChanged => _onChanged;
ValueChanged<RangeValues> _onChanged;
set onChanged(ValueChanged<RangeValues> value) {
@@ -1230,11 +1195,8 @@
isEnabled: isEnabled,
);
- final bool startThumbSelected = _lastThumbSelection == Thumb.start;
- final bool endThumbSelected = _lastThumbSelection == Thumb.end;
-
if (!_overlayAnimation.isDismissed) {
- if (startThumbSelected) {
+ if (_lastThumbSelection == Thumb.start) {
_sliderTheme.overlayShape.paint(
context,
startThumbCenter,
@@ -1248,7 +1210,7 @@
value: startValue,
);
}
- if (endThumbSelected) {
+ if (_lastThumbSelection == Thumb.end) {
_sliderTheme.overlayShape.paint(
context,
endThumbCenter,
@@ -1269,7 +1231,7 @@
isEnabled: isEnabled,
sliderTheme: _sliderTheme,
).width;
- final double adjustedTrackWidth = trackRect.width - trackRect.height;
+ final double adjustedTrackWidth = trackRect.width - tickMarkWidth;
// If the tick marks would be too dense, don't bother painting them.
if (adjustedTrackWidth / divisions >= 3.0 * tickMarkWidth) {
final double dy = trackRect.center.dy;
@@ -1277,7 +1239,7 @@
final double value = i / divisions;
// The ticks are mapped to be within the track, so the tick mark width
// must be subtracted from the track width.
- final double dx = trackRect.left + value * adjustedTrackWidth + trackRect.height / 2;
+ final double dx = trackRect.left + value * adjustedTrackWidth + tickMarkWidth / 2;
final Offset tickMarkOffset = Offset(dx, dy);
_sliderTheme.rangeTickMarkShape.paint(
context,
@@ -1306,7 +1268,6 @@
final double bottomValue = isLastThumbStart ? endValue : startValue;
final double topValue = isLastThumbStart ? startValue : endValue;
final bool shouldPaintValueIndicators = isEnabled && labels != null && !_valueIndicatorAnimation.isDismissed && showValueIndicator;
- final Size resolvedSizeWithOverflow = sizeWithOverflow.isEmpty ? size : sizeWithOverflow;
if (shouldPaintValueIndicators) {
_sliderTheme.rangeValueIndicatorShape.paint(
@@ -1322,8 +1283,6 @@
textDirection: _textDirection,
thumb: bottomThumb,
value: bottomValue,
- textScaleFactor: textScaleFactor,
- sizeWithOverflow: resolvedSizeWithOverflow,
);
}
@@ -1337,7 +1296,6 @@
textDirection: textDirection,
sliderTheme: _sliderTheme,
thumb: bottomThumb,
- isPressed: bottomThumb == Thumb.start ? startThumbSelected : endThumbSelected,
);
if (shouldPaintValueIndicators) {
@@ -1346,29 +1304,15 @@
center: startThumbCenter,
labelPainter: _startLabelPainter,
activationAnimation: _valueIndicatorAnimation,
- textScaleFactor: textScaleFactor,
- sizeWithOverflow: resolvedSizeWithOverflow,
);
final double endOffset = sliderTheme.rangeValueIndicatorShape.getHorizontalShift(
parentBox: this,
center: endThumbCenter,
labelPainter: _endLabelPainter,
activationAnimation: _valueIndicatorAnimation,
- textScaleFactor: textScaleFactor,
- sizeWithOverflow: resolvedSizeWithOverflow,
);
- final double startHalfWidth = sliderTheme.rangeValueIndicatorShape.getPreferredSize(
- isEnabled,
- isDiscrete,
- labelPainter: _startLabelPainter,
- textScaleFactor: textScaleFactor,
- ).width / 2;
- final double endHalfWidth = sliderTheme.rangeValueIndicatorShape.getPreferredSize(
- isEnabled,
- isDiscrete,
- labelPainter: _endLabelPainter,
- textScaleFactor: textScaleFactor,
- ).width / 2;
+ final double startHalfWidth = sliderTheme.rangeValueIndicatorShape.getPreferredSize(isEnabled, isDiscrete, labelPainter: _startLabelPainter).width / 2;
+ final double endHalfWidth = sliderTheme.rangeValueIndicatorShape.getPreferredSize(isEnabled, isDiscrete, labelPainter: _endLabelPainter).width / 2;
double innerOverflow = startHalfWidth + endHalfWidth;
switch (textDirection) {
case TextDirection.ltr:
@@ -1394,22 +1338,19 @@
textDirection: _textDirection,
thumb: topThumb,
value: topValue,
- textScaleFactor: textScaleFactor,
- sizeWithOverflow: resolvedSizeWithOverflow,
);
}
_sliderTheme.rangeThumbShape.paint(
context,
topThumbCenter,
- activationAnimation: _overlayAnimation,
+ activationAnimation: _valueIndicatorAnimation,
enableAnimation: _enableAnimation,
isDiscrete: isDiscrete,
isOnTop: thumbDelta < sliderTheme.rangeThumbShape.getPreferredSize(isEnabled, isDiscrete).width,
textDirection: textDirection,
sliderTheme: _sliderTheme,
thumb: topThumb,
- isPressed: topThumb == Thumb.start ? startThumbSelected : endThumbSelected,
);
}
diff --git a/packages/flutter/lib/src/material/slider.dart b/packages/flutter/lib/src/material/slider.dart
index 25db847..025b688 100644
--- a/packages/flutter/lib/src/material/slider.dart
+++ b/packages/flutter/lib/src/material/slider.dart
@@ -477,12 +477,12 @@
return widget.max > widget.min ? (value - widget.min) / (widget.max - widget.min) : 0.0;
}
- static const double _defaultTrackHeight = 4;
+ static const double _defaultTrackHeight = 2;
static const SliderTrackShape _defaultTrackShape = RoundedRectSliderTrackShape();
static const SliderTickMarkShape _defaultTickMarkShape = RoundSliderTickMarkShape();
static const SliderComponentShape _defaultOverlayShape = RoundSliderOverlayShape();
static const SliderComponentShape _defaultThumbShape = RoundSliderThumbShape();
- static const SliderComponentShape _defaultValueIndicatorShape = RectangularSliderValueIndicatorShape();
+ static const SliderComponentShape _defaultValueIndicatorShape = PaddleSliderValueIndicatorShape();
static const ShowValueIndicator _defaultShowValueIndicator = ShowValueIndicator.onlyForDiscrete;
@override
@@ -520,19 +520,6 @@
// colors come from the ThemeData.colorScheme. These colors, along with
// the default shapes and text styles are aligned to the Material
// Guidelines.
-
- // The value indicator color is not the same as the thumb and active track
- // (which can be defined by activeColor) if the
- // RectangularSliderValueIndicatorShape is used. In all other cases, the
- // value indicator is assumed to be the same as the active color.
- final SliderComponentShape valueIndicatorShape = sliderTheme.valueIndicatorShape ?? _defaultValueIndicatorShape;
- Color valueIndicatorColor;
- if (valueIndicatorShape is RectangularSliderValueIndicatorShape) {
- valueIndicatorColor = sliderTheme.valueIndicatorColor ?? Color.alphaBlend(theme.colorScheme.onSurface.withOpacity(0.60), theme.colorScheme.surface.withOpacity(0.90));
- } else {
- valueIndicatorColor = widget.activeColor ?? sliderTheme.valueIndicatorColor ?? theme.colorScheme.primary;
- }
-
sliderTheme = sliderTheme.copyWith(
trackHeight: sliderTheme.trackHeight ?? _defaultTrackHeight,
activeTrackColor: widget.activeColor ?? sliderTheme.activeTrackColor ?? theme.colorScheme.primary,
@@ -546,31 +533,24 @@
thumbColor: widget.activeColor ?? sliderTheme.thumbColor ?? theme.colorScheme.primary,
disabledThumbColor: sliderTheme.disabledThumbColor ?? theme.colorScheme.onSurface.withOpacity(0.38),
overlayColor: widget.activeColor?.withOpacity(0.12) ?? sliderTheme.overlayColor ?? theme.colorScheme.primary.withOpacity(0.12),
- valueIndicatorColor: valueIndicatorColor,
- surfaceColor: sliderTheme.surfaceColor ?? theme.colorScheme.surface,
+ valueIndicatorColor: widget.activeColor ?? sliderTheme.valueIndicatorColor ?? theme.colorScheme.primary,
trackShape: sliderTheme.trackShape ?? _defaultTrackShape,
tickMarkShape: sliderTheme.tickMarkShape ?? _defaultTickMarkShape,
thumbShape: sliderTheme.thumbShape ?? _defaultThumbShape,
overlayShape: sliderTheme.overlayShape ?? _defaultOverlayShape,
- valueIndicatorShape: valueIndicatorShape,
+ valueIndicatorShape: sliderTheme.valueIndicatorShape ?? _defaultValueIndicatorShape,
showValueIndicator: sliderTheme.showValueIndicator ?? _defaultShowValueIndicator,
valueIndicatorTextStyle: sliderTheme.valueIndicatorTextStyle ?? theme.textTheme.body2.copyWith(
color: theme.colorScheme.onPrimary,
),
);
- // This size is used as the max bounds for the painting of the value
- // indicators It must be kept in sync with the function with the same name
- // in range_slider.dart.
- Size _sizeWithOverflow() => MediaQuery.of(context).size;
-
return _SliderRenderObjectWidget(
value: _unlerp(widget.value),
divisions: widget.divisions,
label: widget.label,
sliderTheme: sliderTheme,
- textScaleFactor: MediaQuery.of(context).textScaleFactor,
- sizeWithOverflow: _sizeWithOverflow(),
+ mediaQueryData: MediaQuery.of(context),
onChanged: (widget.onChanged != null) && (widget.max > widget.min) ? _handleChanged : null,
onChangeStart: widget.onChangeStart != null ? _handleDragStart : null,
onChangeEnd: widget.onChangeEnd != null ? _handleDragEnd : null,
@@ -606,8 +586,7 @@
this.divisions,
this.label,
this.sliderTheme,
- this.textScaleFactor,
- this.sizeWithOverflow,
+ this.mediaQueryData,
this.onChanged,
this.onChangeStart,
this.onChangeEnd,
@@ -619,8 +598,7 @@
final int divisions;
final String label;
final SliderThemeData sliderTheme;
- final double textScaleFactor;
- final Size sizeWithOverflow;
+ final MediaQueryData mediaQueryData;
final ValueChanged<double> onChanged;
final ValueChanged<double> onChangeStart;
final ValueChanged<double> onChangeEnd;
@@ -634,8 +612,7 @@
divisions: divisions,
label: label,
sliderTheme: sliderTheme,
- textScaleFactor: textScaleFactor,
- sizeWithOverflow: sizeWithOverflow,
+ mediaQueryData: mediaQueryData,
onChanged: onChanged,
onChangeStart: onChangeStart,
onChangeEnd: onChangeEnd,
@@ -654,8 +631,7 @@
..label = label
..sliderTheme = sliderTheme
..theme = Theme.of(context)
- ..textScaleFactor = textScaleFactor
- ..sizeWithOverflow = sizeWithOverflow
+ ..mediaQueryData = mediaQueryData
..onChanged = onChanged
..onChangeStart = onChangeStart
..onChangeEnd = onChangeEnd
@@ -673,8 +649,7 @@
int divisions,
String label,
SliderThemeData sliderTheme,
- double textScaleFactor,
- Size sizeWithOverflow,
+ MediaQueryData mediaQueryData,
TargetPlatform platform,
ValueChanged<double> onChanged,
SemanticFormatterCallback semanticFormatterCallback,
@@ -691,8 +666,7 @@
_value = value,
_divisions = divisions,
_sliderTheme = sliderTheme,
- _textScaleFactor = textScaleFactor,
- _sizeWithOverflow = sizeWithOverflow,
+ _mediaQueryData = mediaQueryData,
_onChanged = onChanged,
_state = state,
_textDirection = textDirection {
@@ -847,28 +821,18 @@
markNeedsPaint();
}
- double get textScaleFactor => _textScaleFactor;
- double _textScaleFactor;
- set textScaleFactor(double value) {
- if (value == _textScaleFactor) {
+ MediaQueryData get mediaQueryData => _mediaQueryData;
+ MediaQueryData _mediaQueryData;
+ set mediaQueryData(MediaQueryData value) {
+ if (value == _mediaQueryData) {
return;
}
- _textScaleFactor = value;
+ _mediaQueryData = value;
// Media query data includes the textScaleFactor, so we need to update the
// label painter.
_updateLabelPainter();
}
- Size get sizeWithOverflow => _sizeWithOverflow;
- Size _sizeWithOverflow;
- set sizeWithOverflow(Size value) {
- if (value == _sizeWithOverflow) {
- return;
- }
- _sizeWithOverflow = value;
- markNeedsPaint();
- }
-
ValueChanged<double> get onChanged => _onChanged;
ValueChanged<double> _onChanged;
set onChanged(ValueChanged<double> value) {
@@ -942,7 +906,7 @@
text: label,
)
..textDirection = textDirection
- ..textScaleFactor = textScaleFactor
+ ..textScaleFactor = _mediaQueryData.textScaleFactor
..layout();
} else {
_labelPainter.text = null;
@@ -1123,8 +1087,7 @@
sliderTheme: _sliderTheme,
isDiscrete: isDiscrete,
);
- final Offset thumbCenter = Offset(
- trackRect.left + visualPosition * trackRect.width, trackRect.center.dy);
+ final Offset thumbCenter = Offset(trackRect.left + visualPosition * trackRect.width, trackRect.center.dy);
_sliderTheme.trackShape.paint(
context,
@@ -1158,7 +1121,7 @@
isEnabled: isInteractive,
sliderTheme: _sliderTheme,
).width;
- final double adjustedTrackWidth = trackRect.width - trackRect.height;
+ final double adjustedTrackWidth = trackRect.width - tickMarkWidth;
// If the tick marks would be too dense, don't bother painting them.
if (adjustedTrackWidth / divisions >= 3.0 * tickMarkWidth) {
final double dy = trackRect.center.dy;
@@ -1166,7 +1129,7 @@
final double value = i / divisions;
// The ticks are mapped to be within the track, so the tick mark width
// must be subtracted from the track width.
- final double dx = trackRect.left + value * adjustedTrackWidth + trackRect.height / 2;
+ final double dx = trackRect.left + value * adjustedTrackWidth + tickMarkWidth / 2;
final Offset tickMarkOffset = Offset(dx, dy);
_sliderTheme.tickMarkShape.paint(
context,
@@ -1195,8 +1158,6 @@
sliderTheme: _sliderTheme,
textDirection: _textDirection,
value: _value,
- textScaleFactor: textScaleFactor,
- sizeWithOverflow: sizeWithOverflow.isEmpty ? size : sizeWithOverflow,
);
}
}
@@ -1204,14 +1165,13 @@
_sliderTheme.thumbShape.paint(
context,
thumbCenter,
- activationAnimation: _overlayAnimation,
+ activationAnimation: _valueIndicatorAnimation,
enableAnimation: _enableAnimation,
isDiscrete: isDiscrete,
labelPainter: _labelPainter,
parentBox: this,
sliderTheme: _sliderTheme,
textDirection: _textDirection,
- sizeWithOverflow: sizeWithOverflow.isEmpty ? size : sizeWithOverflow,
value: _value,
);
}
diff --git a/packages/flutter/lib/src/material/slider_theme.dart b/packages/flutter/lib/src/material/slider_theme.dart
index a0a7d24..52282c1 100644
--- a/packages/flutter/lib/src/material/slider_theme.dart
+++ b/packages/flutter/lib/src/material/slider_theme.dart
@@ -278,7 +278,7 @@
/// by creating subclasses of [SliderTrackShape],
/// [SliderComponentShape], and/or [SliderTickMarkShape]. See
/// [RoundSliderThumbShape], [RectangularSliderTrackShape],
-/// [RoundSliderTickMarkShape], [RectangularSliderValueIndicatorShape], and
+/// [RoundSliderTickMarkShape], [PaddleSliderValueIndicatorShape], and
/// [RoundSliderOverlayShape] for examples.
///
/// The track painting can be skipped by specifying 0 for [trackHeight].
@@ -355,7 +355,6 @@
this.disabledThumbColor,
this.overlayColor,
this.valueIndicatorColor,
- this.surfaceColor,
this.overlayShape,
this.tickMarkShape,
this.thumbShape,
@@ -491,14 +490,6 @@
/// The color given to the [valueIndicatorShape] to draw itself with.
final Color valueIndicatorColor;
- /// The surface color that the slider is resting on.
- ///
- /// This is used to clear painting regions for possibly transparent thumbs and
- /// thumb shadows.
- ///
- /// Defaults to [ColorScheme.surface].
- final Color surfaceColor;
-
/// The shape that will be used to draw the [Slider]'s overlay.
///
/// Both the [overlayColor] and a non default [overlayShape] may be specified.
@@ -665,7 +656,6 @@
Color disabledThumbColor,
Color overlayColor,
Color valueIndicatorColor,
- Color surfaceColor,
SliderComponentShape overlayShape,
SliderTickMarkShape tickMarkShape,
SliderComponentShape thumbShape,
@@ -695,7 +685,6 @@
disabledThumbColor: disabledThumbColor ?? this.disabledThumbColor,
overlayColor: overlayColor ?? this.overlayColor,
valueIndicatorColor: valueIndicatorColor ?? this.valueIndicatorColor,
- surfaceColor: surfaceColor ?? this.surfaceColor,
overlayShape: overlayShape ?? this.overlayShape,
tickMarkShape: tickMarkShape ?? this.tickMarkShape,
thumbShape: thumbShape ?? this.thumbShape,
@@ -736,7 +725,6 @@
disabledThumbColor: Color.lerp(a.disabledThumbColor, b.disabledThumbColor, t),
overlayColor: Color.lerp(a.overlayColor, b.overlayColor, t),
valueIndicatorColor: Color.lerp(a.valueIndicatorColor, b.valueIndicatorColor, t),
- surfaceColor: Color.lerp(a.surfaceColor, b.surfaceColor, t),
overlayShape: t < 0.5 ? a.overlayShape : b.overlayShape,
tickMarkShape: t < 0.5 ? a.tickMarkShape : b.tickMarkShape,
thumbShape: t < 0.5 ? a.thumbShape : b.thumbShape,
@@ -770,7 +758,6 @@
disabledThumbColor,
overlayColor,
valueIndicatorColor,
- surfaceColor,
overlayShape,
tickMarkShape,
thumbShape,
@@ -810,7 +797,6 @@
&& otherData.disabledThumbColor == disabledThumbColor
&& otherData.overlayColor == overlayColor
&& otherData.valueIndicatorColor == valueIndicatorColor
- && otherData.surfaceColor == surfaceColor
&& otherData.overlayShape == overlayShape
&& otherData.tickMarkShape == tickMarkShape
&& otherData.thumbShape == thumbShape
@@ -844,7 +830,6 @@
properties.add(ColorProperty('disabledThumbColor', disabledThumbColor, defaultValue: defaultData.disabledThumbColor));
properties.add(ColorProperty('overlayColor', overlayColor, defaultValue: defaultData.overlayColor));
properties.add(ColorProperty('valueIndicatorColor', valueIndicatorColor, defaultValue: defaultData.valueIndicatorColor));
- properties.add(ColorProperty('surfaceColor', surfaceColor, defaultValue: defaultData.surfaceColor));
properties.add(DiagnosticsProperty<SliderComponentShape>('overlayShape', overlayShape, defaultValue: defaultData.overlayShape));
properties.add(DiagnosticsProperty<SliderTickMarkShape>('tickMarkShape', tickMarkShape, defaultValue: defaultData.tickMarkShape));
properties.add(DiagnosticsProperty<SliderComponentShape>('thumbShape', thumbShape, defaultValue: defaultData.thumbShape));
@@ -993,16 +978,6 @@
/// [labelPainter] already has the [textDirection] set.
///
/// [value] is the current parametric value (from 0.0 to 1.0) of the slider.
- ///
- /// [textScaleFactor] can be used to determine whether the component should
- /// paint larger or smaller, depending on whether [textScaleFactor] is greater
- /// than 1 for larger, and between 0 and 1 for smaller. It usually comes from
- /// [MediaQueryData.textScaleFactor].
- ///
- /// [sizeWithOverflow] can be used to determine the bounds the drawing of the
- /// components that are outside of the regular slider bounds. It's the size of
- /// the box, whose center is aligned with the slider's bounds, that the value
- /// indicators must be drawn within. Typically, it is bigger than the slider.
void paint(
PaintingContext context,
Offset center, {
@@ -1014,8 +989,6 @@
SliderThemeData sliderTheme,
TextDirection textDirection,
double value,
- double textScaleFactor,
- Size sizeWithOverflow,
});
/// Special instance of [SliderComponentShape] to skip the thumb drawing.
@@ -1231,9 +1204,6 @@
/// left and right thumb.
///
/// {@macro flutter.material.rangeSlider.shape.thumb}
- ///
- /// [isPressed] can be used to give the selected thumb additional selected
- /// or pressed state visual feedback, such as a larger shadow.
void paint(
PaintingContext context,
Offset center, {
@@ -1245,7 +1215,6 @@
TextDirection textDirection,
SliderThemeData sliderTheme,
Thumb thumb,
- bool isPressed,
});
}
@@ -1271,17 +1240,7 @@
///
/// [labelPainter] helps determine the width of the shape. It is variable
/// width because it is derived from a formatted string.
- ///
- /// [textScaleFactor] can be used to determine whether the component should
- /// paint larger or smaller, depending on whether [textScaleFactor] is greater
- /// than 1 for larger, and between 0 and 1 for smaller. It usually comes from
- /// [MediaQueryData.textScaleFactor].
- Size getPreferredSize(
- bool isEnabled,
- bool isDiscrete, {
- TextPainter labelPainter,
- double textScaleFactor,
- });
+ Size getPreferredSize(bool isEnabled, bool isDiscrete, { TextPainter labelPainter });
/// Determines the best offset to keep this shape on the screen.
///
@@ -1292,8 +1251,6 @@
Offset center,
TextPainter labelPainter,
Animation<double> activationAnimation,
- double textScaleFactor,
- Size sizeWithOverflow,
}) {
return 0;
}
@@ -1315,18 +1272,6 @@
/// the default case, this is used to paint a stroke around the top indicator
/// for better visibility between the two indicators.
///
- /// [textScaleFactor] can be used to determine whether the component should
- /// paint larger or smaller, depending on whether [textScaleFactor] is greater
- /// than 1 for larger, and between 0 and 1 for smaller. It usually comes from
- /// [MediaQueryData.textScaleFactor].
- ///
- /// [sizeWithOverflow] can be used to determine the bounds the drawing of the
- /// components that are outside of the regular slider bounds. It's the size of
- /// the box, whose center is aligned with the slider's bounds, that the value
- /// indicators must be drawn within. Typically, it is bigger than the slider.
- ///
- /// {@macro flutter.material.rangeSlider.shape.parentBox}
- ///
/// {@macro flutter.material.rangeSlider.shape.sliderTheme}
///
/// [textDirection] can be used to determine how any extra text or graphics,
@@ -1344,8 +1289,6 @@
bool isDiscrete,
bool isOnTop,
TextPainter labelPainter,
- double textScaleFactor,
- Size sizeWithOverflow,
RenderBox parentBox,
SliderThemeData sliderTheme,
TextDirection textDirection,
@@ -1611,17 +1554,17 @@
assert(thumbCenter != null);
assert(isEnabled != null);
assert(isDiscrete != null);
- // If the slider [SliderThemeData.trackHeight] is less than or equal to 0,
- // then it makes no difference whether the track is painted or not,
- // therefore the painting can be a no-op.
+ // If the slider track height is less than or equal to 0, then it makes no
+ // difference whether the track is painted or not, therefore the painting
+ // can be a no-op.
if (sliderTheme.trackHeight <= 0) {
return;
}
// Assign the track segment paints, which are left: active, right: inactive,
// but reversed for right to left text.
- final ColorTween activeTrackColorTween = ColorTween(begin: sliderTheme.disabledActiveTrackColor, end: sliderTheme.activeTrackColor);
- final ColorTween inactiveTrackColorTween = ColorTween(begin: sliderTheme.disabledInactiveTrackColor, end: sliderTheme.inactiveTrackColor);
+ final ColorTween activeTrackColorTween = ColorTween(begin: sliderTheme.disabledActiveTrackColor , end: sliderTheme.activeTrackColor);
+ final ColorTween inactiveTrackColorTween = ColorTween(begin: sliderTheme.disabledInactiveTrackColor , end: sliderTheme.inactiveTrackColor);
final Paint activePaint = Paint()..color = activeTrackColorTween.evaluate(enableAnimation);
final Paint inactivePaint = Paint()..color = inactiveTrackColorTween.evaluate(enableAnimation);
Paint leftTrackPaint;
@@ -1645,10 +1588,11 @@
isDiscrete: isDiscrete,
);
- final Rect leftTrackSegment = Rect.fromLTRB(trackRect.left + trackRect.height / 2, trackRect.top, thumbCenter.dx, trackRect.bottom);
+ final Size thumbSize = sliderTheme.thumbShape.getPreferredSize(isEnabled, isDiscrete);
+ final Rect leftTrackSegment = Rect.fromLTRB(trackRect.left + trackRect.height / 2, trackRect.top, thumbCenter.dx - thumbSize.width / 2, trackRect.bottom);
if (!leftTrackSegment.isEmpty)
context.canvas.drawRect(leftTrackSegment, leftTrackPaint);
- final Rect rightTrackSegment = Rect.fromLTRB(thumbCenter.dx, trackRect.top, trackRect.right, trackRect.bottom);
+ final Rect rightTrackSegment = Rect.fromLTRB(thumbCenter.dx + thumbSize.width / 2, trackRect.top, trackRect.right, trackRect.bottom);
if (!rightTrackSegment.isEmpty)
context.canvas.drawRect(rightTrackSegment, rightTrackPaint);
}
@@ -1704,9 +1648,9 @@
assert(enableAnimation != null);
assert(textDirection != null);
assert(thumbCenter != null);
- // If the slider [SliderThemeData.trackHeight] is less than or equal to 0,
- // then it makes no difference whether the track is painted or not,
- // therefore the painting can be a no-op.
+ // If the slider track height is less than or equal to 0, then it makes no
+ // difference whether the track is painted or not, therefore the painting
+ // can be a no-op.
if (sliderTheme.trackHeight <= 0) {
return;
}
@@ -1737,30 +1681,22 @@
isEnabled: isEnabled,
isDiscrete: isDiscrete,
);
- final Radius trackRadius = Radius.circular(trackRect.height / 2);
- context.canvas.drawRRect(
- RRect.fromLTRBAndCorners(
- trackRect.left,
- trackRect.top,
- thumbCenter.dx,
- trackRect.bottom,
- topLeft: trackRadius,
- bottomLeft: trackRadius,
- ),
- leftTrackPaint,
- );
- context.canvas.drawRRect(
- RRect.fromLTRBAndCorners(
- thumbCenter.dx,
- trackRect.top,
- trackRect.right,
- trackRect.bottom,
- topRight: trackRadius,
- bottomRight: trackRadius,
- ),
- rightTrackPaint,
- );
+ // The arc rects create a semi-circle with radius equal to track height.
+ final Rect leftTrackArcRect = Rect.fromLTWH(trackRect.left, trackRect.top, trackRect.height, trackRect.height);
+ if (!leftTrackArcRect.isEmpty)
+ context.canvas.drawArc(leftTrackArcRect, math.pi / 2, math.pi, false, leftTrackPaint);
+ final Rect rightTrackArcRect = Rect.fromLTWH(trackRect.right - trackRect.height / 2, trackRect.top, trackRect.height, trackRect.height);
+ if (!rightTrackArcRect.isEmpty)
+ context.canvas.drawArc(rightTrackArcRect, -math.pi / 2, math.pi, false, rightTrackPaint);
+
+ final Size thumbSize = sliderTheme.thumbShape.getPreferredSize(isEnabled, isDiscrete);
+ final Rect leftTrackSegment = Rect.fromLTRB(trackRect.left + trackRect.height / 2, trackRect.top, thumbCenter.dx - thumbSize.width / 2, trackRect.bottom);
+ if (!leftTrackSegment.isEmpty)
+ context.canvas.drawRect(leftTrackSegment, leftTrackPaint);
+ final Rect rightTrackSegment = Rect.fromLTRB(thumbCenter.dx + thumbSize.width / 2, trackRect.top, trackRect.right, trackRect.bottom);
+ if (!rightTrackSegment.isEmpty)
+ context.canvas.drawRect(rightTrackSegment, rightTrackPaint);
}
}
@@ -1976,11 +1912,6 @@
assert(isEnabled != null);
assert(isDiscrete != null);
assert(textDirection != null);
-
- if (sliderTheme.trackHeight <= 0) {
- return;
- }
-
// Assign the track segment paints, which are left: active, right: inactive,
// but reversed for right to left text.
final ColorTween activeTrackColorTween = ColorTween(begin: sliderTheme.disabledActiveTrackColor , end: sliderTheme.activeTrackColor);
@@ -2011,39 +1942,25 @@
isEnabled: isEnabled,
isDiscrete: isDiscrete,
);
- final Radius trackRadius = Radius.circular(trackRect.height / 2);
+ final double trackRadius = trackRect.height / 2;
- context.canvas.drawRRect(
- RRect.fromLTRBAndCorners(
- trackRect.left,
- trackRect.top,
- leftThumbOffset.dx,
- trackRect.bottom,
- topLeft: trackRadius,
- bottomLeft: trackRadius,
- ),
- inactivePaint,
- );
- context.canvas.drawRect(
- Rect.fromLTRB(
- leftThumbOffset.dx,
- trackRect.top,
- rightThumbOffset.dx,
- trackRect.bottom,
- ),
- activePaint,
- );
- context.canvas.drawRRect(
- RRect.fromLTRBAndCorners(
- rightThumbOffset.dx,
- trackRect.top,
- trackRect.right,
- trackRect.bottom,
- topRight: trackRadius,
- bottomRight: trackRadius,
- ),
- inactivePaint,
- );
+ final Rect leftTrackArcRect = Rect.fromLTWH(trackRect.left, trackRect.top, trackRect.height, trackRect.height);
+ if (!leftTrackArcRect.isEmpty)
+ context.canvas.drawArc(leftTrackArcRect, math.pi / 2, math.pi, false, inactivePaint);
+
+ final Rect leftTrackSegment = Rect.fromLTRB(trackRect.left + trackRadius, trackRect.top, leftThumbOffset.dx - thumbRadius, trackRect.bottom);
+ if (!leftTrackSegment.isEmpty)
+ context.canvas.drawRect(leftTrackSegment, inactivePaint);
+ final Rect middleTrackSegment = Rect.fromLTRB(leftThumbOffset.dx + thumbRadius, trackRect.top, rightThumbOffset.dx - thumbRadius, trackRect.bottom);
+ if (!middleTrackSegment.isEmpty)
+ context.canvas.drawRect(middleTrackSegment, activePaint);
+ final Rect rightTrackSegment = Rect.fromLTRB(rightThumbOffset.dx + thumbRadius, trackRect.top, trackRect.right - trackRadius, trackRect.bottom);
+ if (!rightTrackSegment.isEmpty)
+ context.canvas.drawRect(rightTrackSegment, inactivePaint);
+
+ final Rect rightTrackArcRect = Rect.fromLTWH(trackRect.right - trackRect.height, trackRect.top, trackRect.height, trackRect.height);
+ if (!rightTrackArcRect.isEmpty)
+ context.canvas.drawArc(rightTrackArcRect, -math.pi / 2, math.pi, false, inactivePaint);
}
}
@@ -2071,8 +1988,7 @@
/// The preferred radius of the round tick mark.
///
- /// If it is not provided, then 1/4 of the [SliderThemeData.trackHeight] is
- /// used.
+ /// If it is not provided, then half of the track height is used.
final double tickMarkRadius;
@override
@@ -2083,10 +1999,9 @@
assert(sliderTheme != null);
assert(sliderTheme.trackHeight != null);
assert(isEnabled != null);
- // The tick marks are tiny circles. If no radius is provided, then the
- // radius is defaulted to be 1/4 of the [SliderThemeData.trackHeight], or a
- // diameter of half the [SliderThemeData.trackHeight].
- return Size.fromRadius(tickMarkRadius ?? sliderTheme.trackHeight / 4);
+ // The tick marks are tiny circles. If no radius is provided, then they are
+ // defaulted to be the same height as the track.
+ return Size.fromRadius(tickMarkRadius ?? sliderTheme.trackHeight / 2);
}
@override
@@ -2165,8 +2080,7 @@
/// The preferred radius of the round tick mark.
///
- /// If it is not provided, then 1/4 of the [SliderThemeData.trackHeight] is
- /// used.
+ /// If it is not provided, then half of the track height is used.
final double tickMarkRadius;
@override
@@ -2177,7 +2091,7 @@
assert(sliderTheme != null);
assert(sliderTheme.trackHeight != null);
assert(isEnabled != null);
- return Size.fromRadius(tickMarkRadius ?? sliderTheme.trackHeight / 4);
+ return Size.fromRadius(tickMarkRadius ?? sliderTheme.trackHeight / 2);
}
@override
@@ -2286,8 +2200,6 @@
SliderThemeData sliderTheme,
TextDirection textDirection,
double value,
- double textScaleFactor,
- Size sizeWithOverflow,
}) {
// no-op.
}
@@ -2305,8 +2217,6 @@
const RoundSliderThumbShape({
this.enabledThumbRadius = 10.0,
this.disabledThumbRadius,
- this.elevation = 1.0,
- this.pressedElevation = 6.0,
});
/// The preferred radius of the round thumb shape when the slider is enabled.
@@ -2321,22 +2231,6 @@
final double disabledThumbRadius;
double get _disabledThumbRadius => disabledThumbRadius ?? enabledThumbRadius;
- /// The resting elevation adds shadow to the unpressed thumb.
- ///
- /// The default is 1.
- ///
- /// Use 0 for no shadow. The higher the value, the larger the shadow. For
- /// example, a value of 12 will create a very large shadow.
- final double elevation;
-
- /// The pressed elevation adds shadow to the pressed thumb.
- ///
- /// The default is 6.
- ///
- /// Use 0 for no shadow. The higher the value, the larger the shadow. For
- /// example, a value of 12 will create a very large shadow.
- final double pressedElevation;
-
@override
Size getPreferredSize(bool isEnabled, bool isDiscrete) {
return Size.fromRadius(isEnabled == true ? enabledThumbRadius : _disabledThumbRadius);
@@ -2354,8 +2248,6 @@
@required SliderThemeData sliderTheme,
TextDirection textDirection,
double value,
- double textScaleFactor,
- Size sizeWithOverflow,
}) {
assert(context != null);
assert(center != null);
@@ -2363,7 +2255,6 @@
assert(sliderTheme != null);
assert(sliderTheme.disabledThumbColor != null);
assert(sliderTheme.thumbColor != null);
- assert(!sizeWithOverflow.isEmpty);
final Canvas canvas = context.canvas;
final Tween<double> radiusTween = Tween<double>(
@@ -2374,31 +2265,10 @@
begin: sliderTheme.disabledThumbColor,
end: sliderTheme.thumbColor,
);
- final Tween<double> elevationTween = Tween<double>(
- begin: elevation,
- end: pressedElevation,
- );
-
- final double evaluatedElevation = elevationTween.evaluate(activationAnimation);
- final Color color = colorTween.evaluate(enableAnimation);
- final double radius = radiusTween.evaluate(enableAnimation);
- final Path path = Path()..addArc(Rect.fromCenter(center: center, width: 2 * radius, height: 2 * radius), 0, math.pi * 2);
- canvas.drawShadow(path, Colors.black, evaluatedElevation, true);
-
- // If the thumb is translucent, clear the space of the track and shadow so
- // the thumb can be drawn without interference.
- if (color.alpha != 0xff) {
- canvas.drawCircle(
- center,
- radius,
- Paint()..color = sliderTheme.surfaceColor.withOpacity(1),
- );
- }
-
canvas.drawCircle(
center,
- radius,
- Paint()..color = color,
+ radiusTween.evaluate(enableAnimation),
+ Paint()..color = colorTween.evaluate(enableAnimation),
);
}
}
@@ -2415,8 +2285,6 @@
const RoundRangeSliderThumbShape({
this.enabledThumbRadius = 10.0,
this.disabledThumbRadius,
- this.elevation = 1.0,
- this.pressedElevation = 6.0,
}) : assert(enabledThumbRadius != null);
/// The preferred radius of the round thumb shape when the slider is enabled.
@@ -2431,16 +2299,6 @@
final double disabledThumbRadius;
double get _disabledThumbRadius => disabledThumbRadius ?? enabledThumbRadius;
- /// The resting elevation adds shadow to the unpressed thumb.
- ///
- /// The default is 1.
- final double elevation;
-
- /// The pressed elevation adds shadow to the pressed thumb.
- ///
- /// The default is 6.
- final double pressedElevation;
-
@override
Size getPreferredSize(bool isEnabled, bool isDiscrete) {
return Size.fromRadius(isEnabled == true ? enabledThumbRadius : _disabledThumbRadius);
@@ -2458,7 +2316,6 @@
@required SliderThemeData sliderTheme,
TextDirection textDirection,
Thumb thumb,
- bool isPressed,
}) {
assert(context != null);
assert(center != null);
@@ -2477,10 +2334,6 @@
end: sliderTheme.thumbColor,
);
final double radius = radiusTween.evaluate(enableAnimation);
- final Tween<double> elevationTween = Tween<double>(
- begin: elevation,
- end: pressedElevation,
- );
// Add a stroke of 1dp around the circle if this thumb would overlap
// the other thumb.
@@ -2510,26 +2363,10 @@
}
}
- final double evaluatedElevation = isPressed ? elevationTween.evaluate(activationAnimation) : elevation;
- final Color color = colorTween.evaluate(enableAnimation);
- final Path shadowPath = Path()..addArc(Rect.fromCenter(center: center, width: 2 * radius, height: 2 * radius), 0, math.pi * 2);
- canvas.drawShadow(shadowPath, Colors.black, evaluatedElevation, true);
-
- // If the thumb is translucent, clear the space of the track and shadow so
- // the thumb can be drawn without interference.
- if (color.alpha != 0xff) {
- canvas.drawCircle(
- center,
- radius,
- Paint()
- ..color = sliderTheme.surfaceColor.withOpacity(1),
- );
- }
-
canvas.drawCircle(
center,
radius,
- Paint()..color = color,
+ Paint()..color = colorTween.evaluate(enableAnimation),
);
}
}
@@ -2555,8 +2392,7 @@
/// The preferred radius of the round thumb shape when enabled.
///
- /// If it is not provided, then half of the [SliderThemeData.trackHeight] is
- /// used.
+ /// If it is not provided, then half of the track height is used.
final double overlayRadius;
@override
@@ -2576,8 +2412,6 @@
@required SliderThemeData sliderTheme,
@required TextDirection textDirection,
@required double value,
- double textScaleFactor,
- Size sizeWithOverflow,
}) {
assert(context != null);
assert(center != null);
@@ -2610,20 +2444,16 @@
/// * [Slider], which includes a value indicator defined by this shape.
/// * [SliderTheme], which can be used to configure the slider value indicator
/// of all sliders in a widget subtree.
-class RectangularSliderValueIndicatorShape extends SliderComponentShape {
- /// Create a slider value indicator that resembles a rectangular tooltip.
- const RectangularSliderValueIndicatorShape();
+class PaddleSliderValueIndicatorShape extends SliderComponentShape {
+ /// Create a slider value indicator in the shape of an upside-down pear.
+ const PaddleSliderValueIndicatorShape();
- static const _RectangularSliderValueIndicatorPathPainter _pathPainter = _RectangularSliderValueIndicatorPathPainter();
+ static const _PaddleSliderTrackShapePathPainter _pathPainter = _PaddleSliderTrackShapePathPainter();
@override
- Size getPreferredSize(bool isEnabled, bool isDiscrete, {
- @required TextPainter labelPainter,
- @required double textScaleFactor,
- }) {
+ Size getPreferredSize(bool isEnabled, bool isDiscrete, { @required TextPainter labelPainter }) {
assert(labelPainter != null);
- assert(textScaleFactor != null && textScaleFactor >= 0);
- return _pathPainter.getPreferredSize(isEnabled, isDiscrete, labelPainter, textScaleFactor);
+ return _pathPainter.getPreferredSize(isEnabled, isDiscrete, labelPainter);
}
@override
@@ -2638,20 +2468,26 @@
@required SliderThemeData sliderTheme,
TextDirection textDirection,
double value,
- double textScaleFactor,
- Size sizeWithOverflow,
}) {
- final Canvas canvas = context.canvas;
- final double scale = activationAnimation.value;
- _pathPainter.paint(
- parentBox: parentBox,
- canvas: canvas,
- center: center,
- scale: scale,
- labelPainter: labelPainter,
- textScaleFactor: textScaleFactor,
- sizeWithOverflow: sizeWithOverflow,
- backgroundPaintColor: sliderTheme.valueIndicatorColor
+ assert(context != null);
+ assert(center != null);
+ assert(activationAnimation != null);
+ assert(enableAnimation != null);
+ assert(labelPainter != null);
+ assert(parentBox != null);
+ assert(sliderTheme != null);
+ final ColorTween enableColor = ColorTween(
+ begin: sliderTheme.disabledThumbColor,
+ end: sliderTheme.valueIndicatorColor,
+ );
+ _pathPainter.drawValueIndicator(
+ parentBox,
+ context.canvas,
+ center,
+ Paint()..color = enableColor.evaluate(enableAnimation),
+ activationAnimation.value,
+ labelPainter,
+ null,
);
}
}
@@ -2663,283 +2499,16 @@
/// * [RangeSlider], which includes value indicators defined by this shape.
/// * [SliderTheme], which can be used to configure the range slider value
/// indicator of all sliders in a widget subtree.
-class RectangularRangeSliderValueIndicatorShape extends RangeSliderValueIndicatorShape {
- /// Create a range slider value indicator that resembles a rectangular tooltip.
- const RectangularRangeSliderValueIndicatorShape();
-
- static const _RectangularSliderValueIndicatorPathPainter _pathPainter = _RectangularSliderValueIndicatorPathPainter();
-
- @override
- Size getPreferredSize(
- bool isEnabled,
- bool isDiscrete, {
- @required TextPainter labelPainter,
- @required double textScaleFactor,
- }) {
- assert(labelPainter != null);
- assert(textScaleFactor != null && textScaleFactor >= 0);
- return _pathPainter.getPreferredSize(isEnabled, isDiscrete, labelPainter, textScaleFactor);
- }
-
- @override
- double getHorizontalShift({
- RenderBox parentBox,
- Offset center,
- TextPainter labelPainter,
- Animation<double> activationAnimation,
- double textScaleFactor,
- Size sizeWithOverflow,
- }) {
- return _pathPainter.getHorizontalShift(
- parentBox: parentBox,
- center: center,
- labelPainter: labelPainter,
- textScaleFactor: textScaleFactor,
- sizeWithOverflow: sizeWithOverflow,
- scale: activationAnimation.value,
- );
- }
-
- @override
- void paint(
- PaintingContext context,
- Offset center, {
- Animation<double> activationAnimation,
- Animation<double> enableAnimation,
- bool isDiscrete,
- bool isOnTop,
- TextPainter labelPainter,
- double textScaleFactor,
- Size sizeWithOverflow,
- RenderBox parentBox,
- SliderThemeData sliderTheme,
- TextDirection textDirection,
- double value,
- Thumb thumb,
- }) {
- final Canvas canvas = context.canvas;
- final double scale = activationAnimation.value;
- _pathPainter.paint(
- parentBox: parentBox,
- canvas: canvas,
- center: center,
- scale: scale,
- labelPainter: labelPainter,
- textScaleFactor: textScaleFactor,
- sizeWithOverflow: sizeWithOverflow,
- backgroundPaintColor: sliderTheme.valueIndicatorColor,
- strokePaintColor: isOnTop ? sliderTheme.overlappingShapeStrokeColor : null,
- );
- }
-}
-
-class _RectangularSliderValueIndicatorPathPainter {
- const _RectangularSliderValueIndicatorPathPainter();
-
- static const double _triangleHeight = 8.0;
- static const double _labelPadding = 16.0;
- static const double _preferredHeight = 32.0;
- static const double _minLabelWidth = 16.0;
- static const double _bottomTipYOffset = 14.0;
- static const double _preferredHalfHeight = _preferredHeight / 2;
- static const double _upperRectRadius = 4;
-
- Size getPreferredSize(
- bool isEnabled,
- bool isDiscrete,
- TextPainter labelPainter,
- double textScaleFactor,
- ) {
- assert(labelPainter != null);
- return Size(
- _upperRectangleWidth(labelPainter, 1, textScaleFactor),
- labelPainter.height + _labelPadding,
- );
- }
-
- double getHorizontalShift({
- RenderBox parentBox,
- Offset center,
- TextPainter labelPainter,
- double textScaleFactor,
- Size sizeWithOverflow,
- double scale,
- }) {
- assert(!sizeWithOverflow.isEmpty);
- const double edgePadding = 8.0;
- final double rectangleWidth = _upperRectangleWidth(labelPainter, scale, textScaleFactor);
-
- // The rectangle must be shifted towards the center so that it minimizes the
- // chance of it rendering outside the bounds of the render box. If the shift
- // is negative, then the lobe is shifted from right to left, and if it is
- // positive, then the lobe is shifted from left to right.
- final double overflowLeft = math.max(0, rectangleWidth / 2 - center.dx + edgePadding);
- final double overflowRight = math.max(0, rectangleWidth / 2 - (sizeWithOverflow.width - center.dx - edgePadding));
- return overflowLeft - overflowRight;
- }
-
- double _upperRectangleWidth(TextPainter labelPainter, double scale, double textScaleFactor) {
- final double unscaledWidth = math.max(_minLabelWidth * textScaleFactor, labelPainter.width) + _labelPadding * 2;
- return unscaledWidth * scale;
- }
-
- void paint({
- RenderBox parentBox,
- Canvas canvas,
- Offset center,
- double scale,
- TextPainter labelPainter,
- double textScaleFactor,
- Size sizeWithOverflow,
- Color backgroundPaintColor,
- Color strokePaintColor,
- }) {
- if (scale == 0.0) {
- // Zero scale essentially means "do not draw anything", so it's safe to just return.
- return;
- }
- assert(!sizeWithOverflow.isEmpty);
-
- final double rectangleWidth = _upperRectangleWidth(labelPainter, scale, textScaleFactor);
- final double horizontalShift = getHorizontalShift(
- parentBox: parentBox,
- center: center,
- labelPainter: labelPainter,
- textScaleFactor: textScaleFactor,
- sizeWithOverflow: sizeWithOverflow,
- scale: scale,
- );
-
- final double rectHeight = labelPainter.height + _labelPadding;
- final Rect upperRect = Rect.fromLTWH(
- -rectangleWidth / 2 + horizontalShift,
- -_triangleHeight - rectHeight,
- rectangleWidth,
- rectHeight,
- );
-
- final Path trianglePath = Path()
- ..lineTo(-_triangleHeight, -_triangleHeight)
- ..lineTo(_triangleHeight, -_triangleHeight)
- ..close();
- final Paint fillPaint = Paint()..color = backgroundPaintColor;
- final RRect upperRRect = RRect.fromRectAndRadius(upperRect, const Radius.circular(_upperRectRadius));
- trianglePath.addRRect(upperRRect);
-
- canvas.save();
- // Prepare the canvas for the base of the tooltip, which is relative to the
- // center of the thumb.
- canvas.translate(center.dx, center.dy - _bottomTipYOffset);
- canvas.scale(scale, scale);
- if (strokePaintColor != null) {
- final Paint strokePaint = Paint()
- ..color = strokePaintColor
- ..strokeWidth = 1.0
- ..style = PaintingStyle.stroke;
- canvas.drawPath(trianglePath, strokePaint);
- }
- canvas.drawPath(trianglePath, fillPaint);
-
- // The label text is centered within the value indicator.
- final double bottomTipToUpperRectTranslateY = -_preferredHalfHeight / 2 - upperRect.height;
- canvas.translate(0, bottomTipToUpperRectTranslateY);
- final Offset boxCenter = Offset(horizontalShift, upperRect.height / 2);
- final Offset halfLabelPainterOffset = Offset(labelPainter.width / 2, labelPainter.height / 2);
- final Offset labelOffset = boxCenter - halfLabelPainterOffset;
- labelPainter.paint(canvas, labelOffset);
- canvas.restore();
- }
-}
-
-/// A variant shape of a [Slider]'s value indicator .
-///
-/// See also:
-///
-/// * [Slider], which includes a value indicator defined by this shape.
-/// * [SliderTheme], which can be used to configure the slider value indicator
-/// of all sliders in a widget subtree.
-class PaddleSliderValueIndicatorShape extends SliderComponentShape {
- /// Create a slider value indicator in the shape of an upside-down pear.
- const PaddleSliderValueIndicatorShape();
-
- static const _PaddleSliderValueIndicatorPathPainter _pathPainter = _PaddleSliderValueIndicatorPathPainter();
-
- @override
- Size getPreferredSize(
- bool isEnabled,
- bool isDiscrete, {
- @required TextPainter labelPainter,
- @required double textScaleFactor,
- }) {
- assert(labelPainter != null);
- assert(textScaleFactor != null && textScaleFactor >= 0);
- return _pathPainter.getPreferredSize(isEnabled, isDiscrete, labelPainter, textScaleFactor);
- }
-
- @override
- void paint(
- PaintingContext context,
- Offset center, {
- @required Animation<double> activationAnimation,
- @required Animation<double> enableAnimation,
- bool isDiscrete,
- @required TextPainter labelPainter,
- @required RenderBox parentBox,
- @required SliderThemeData sliderTheme,
- TextDirection textDirection,
- double value,
- double textScaleFactor,
- Size sizeWithOverflow,
- }) {
- assert(context != null);
- assert(center != null);
- assert(activationAnimation != null);
- assert(enableAnimation != null);
- assert(labelPainter != null);
- assert(parentBox != null);
- assert(sliderTheme != null);
- assert(!sizeWithOverflow.isEmpty);
- final ColorTween enableColor = ColorTween(
- begin: sliderTheme.disabledThumbColor,
- end: sliderTheme.valueIndicatorColor,
- );
- _pathPainter.paint(
- parentBox,
- context.canvas,
- center,
- Paint()..color = enableColor.evaluate(enableAnimation),
- activationAnimation.value,
- labelPainter,
- textScaleFactor,
- sizeWithOverflow,
- null,
- );
- }
-}
-
-/// A variant shape of a [RangeSlider]'s value indicators.
-///
-/// See also:
-///
-/// * [RangeSlider], which includes value indicators defined by this shape.
-/// * [SliderTheme], which can be used to configure the range slider value
-/// indicator of all sliders in a widget subtree.
class PaddleRangeSliderValueIndicatorShape extends RangeSliderValueIndicatorShape {
/// Create a slider value indicator in the shape of an upside-down pear.
const PaddleRangeSliderValueIndicatorShape();
- static const _PaddleSliderValueIndicatorPathPainter _pathPainter = _PaddleSliderValueIndicatorPathPainter();
+ static const _PaddleSliderTrackShapePathPainter _pathPainter = _PaddleSliderTrackShapePathPainter();
@override
- Size getPreferredSize(
- bool isEnabled,
- bool isDiscrete, {
- @required TextPainter labelPainter,
- @required double textScaleFactor,
- }) {
+ Size getPreferredSize(bool isEnabled, bool isDiscrete, { @required TextPainter labelPainter }) {
assert(labelPainter != null);
- assert(textScaleFactor != null && textScaleFactor >= 0);
- return _pathPainter.getPreferredSize(isEnabled, isDiscrete, labelPainter, textScaleFactor);
+ return _pathPainter.getPreferredSize(isEnabled, isDiscrete, labelPainter);
}
@override
@@ -2948,16 +2517,12 @@
Offset center,
TextPainter labelPainter,
Animation<double> activationAnimation,
- double textScaleFactor,
- Size sizeWithOverflow,
}) {
return _pathPainter.getHorizontalShift(
parentBox: parentBox,
center: center,
labelPainter: labelPainter,
scale: activationAnimation.value,
- textScaleFactor: textScaleFactor,
- sizeWithOverflow: sizeWithOverflow,
);
}
@@ -2975,8 +2540,6 @@
TextDirection textDirection,
Thumb thumb,
double value,
- double textScaleFactor,
- Size sizeWithOverflow,
}) {
assert(context != null);
assert(center != null);
@@ -2985,28 +2548,25 @@
assert(labelPainter != null);
assert(parentBox != null);
assert(sliderTheme != null);
- assert(!sizeWithOverflow.isEmpty);
final ColorTween enableColor = ColorTween(
begin: sliderTheme.disabledThumbColor,
end: sliderTheme.valueIndicatorColor,
);
// Add a stroke of 1dp around the top paddle.
- _pathPainter.paint(
+ _pathPainter.drawValueIndicator(
parentBox,
context.canvas,
center,
Paint()..color = enableColor.evaluate(enableAnimation),
activationAnimation.value,
labelPainter,
- textScaleFactor,
- sizeWithOverflow,
isOnTop ? sliderTheme.overlappingShapeStrokeColor : null,
);
}
}
-class _PaddleSliderValueIndicatorPathPainter {
- const _PaddleSliderValueIndicatorPathPainter();
+class _PaddleSliderTrackShapePathPainter {
+ const _PaddleSliderTrackShapePathPainter();
// These constants define the shape of the default value indicator.
// The value indicator changes shape based on the size of
@@ -3016,12 +2576,14 @@
// Radius of the top lobe of the value indicator.
static const double _topLobeRadius = 16.0;
- static const double _minLabelWidth = 16.0;
+ // Designed size of the label text. This is the size that the value indicator
+ // was designed to contain. We scale it from here to fit other sizes.
+ static const double _labelTextDesignSize = 14.0;
// Radius of the bottom lobe of the value indicator.
static const double _bottomLobeRadius = 10.0;
static const double _labelPadding = 8.0;
static const double _distanceBetweenTopBottomCenters = 40.0;
- static const double _middleNeckWidth = 3.0;
+ static const double _middleNeckWidth = 2.0;
static const double _bottomNeckRadius = 4.5;
// The base of the triangle between the top lobe center and the centers of
// the two top neck arcs.
@@ -3049,12 +2611,10 @@
bool isEnabled,
bool isDiscrete,
TextPainter labelPainter,
- double textScaleFactor,
) {
assert(labelPainter != null);
- assert(textScaleFactor != null && textScaleFactor >= 0);
- final double width = math.max(_minLabelWidth * textScaleFactor, labelPainter.width) + _labelPadding * 2 * textScaleFactor;
- return Size(width, _preferredHeight * textScaleFactor);
+ final double textScaleFactor = labelPainter.height / _labelTextDesignSize;
+ return Size(labelPainter.width + 2 * _labelPadding * textScaleFactor, _preferredHeight * textScaleFactor);
}
// Adds an arc to the path that has the attributes passed in. This is
@@ -3070,17 +2630,15 @@
Offset center,
TextPainter labelPainter,
double scale,
- double textScaleFactor,
- Size sizeWithOverflow,
}) {
- assert(!sizeWithOverflow.isEmpty);
+ final double textScaleFactor = labelPainter.height / _labelTextDesignSize;
final double inverseTextScale = textScaleFactor != 0 ? 1.0 / textScaleFactor : 0.0;
final double labelHalfWidth = labelPainter.width / 2.0;
final double halfWidthNeeded = math.max(
0.0,
inverseTextScale * labelHalfWidth - (_topLobeRadius - _labelPadding),
);
- final double shift = _getIdealOffset(parentBox, halfWidthNeeded, textScaleFactor * scale, center, sizeWithOverflow.width);
+ final double shift = _getIdealOffset(parentBox, halfWidthNeeded, textScaleFactor * scale, center);
return shift * textScaleFactor;
}
@@ -3091,9 +2649,8 @@
double halfWidthNeeded,
double scale,
Offset center,
- double widthWithOverflow,
) {
- const double edgeMargin = 8.0;
+ const double edgeMargin = 4.0;
final Rect topLobeRect = Rect.fromLTWH(
-_topLobeRadius - halfWidthNeeded,
-_topLobeRadius - _distanceBetweenTopBottomCenters,
@@ -3106,11 +2663,12 @@
final Offset bottomRight = (topLobeRect.bottomRight * scale) + center;
double shift = 0.0;
- if (topLeft.dx < edgeMargin) {
- shift = edgeMargin - topLeft.dx;
+ final double startGlobal = parentBox.localToGlobal(Offset.zero).dx;
+ if (topLeft.dx < startGlobal + edgeMargin) {
+ shift = startGlobal + edgeMargin - topLeft.dx;
}
- final double endGlobal = widthWithOverflow;
+ final double endGlobal = parentBox.localToGlobal(Offset(parentBox.size.width, parentBox.size.height)).dx;
if (bottomRight.dx > endGlobal - edgeMargin) {
shift = endGlobal - edgeMargin - bottomRight.dx;
}
@@ -3126,15 +2684,13 @@
return shift;
}
- void paint(
+ void drawValueIndicator(
RenderBox parentBox,
Canvas canvas,
Offset center,
Paint paint,
double scale,
TextPainter labelPainter,
- double textScaleFactor,
- Size sizeWithOverflow,
Color strokePaintColor,
) {
if (scale == 0.0) {
@@ -3142,10 +2698,10 @@
// our math below will attempt to divide by zero and send needless NaNs to the engine.
return;
}
- assert(!sizeWithOverflow.isEmpty);
// The entire value indicator should scale with the size of the label,
// to keep it large enough to encompass the label text.
+ final double textScaleFactor = labelPainter.height / _labelTextDesignSize;
final double overallScale = scale * textScaleFactor;
final double inverseTextScale = textScaleFactor != 0 ? 1.0 / textScaleFactor : 0.0;
final double labelHalfWidth = labelPainter.width / 2.0;
@@ -3187,7 +2743,7 @@
inverseTextScale * labelHalfWidth - (_topLobeRadius - _labelPadding),
);
- final double shift = _getIdealOffset(parentBox, halfWidthNeeded, overallScale, center, sizeWithOverflow.width);
+ final double shift = _getIdealOffset(parentBox, halfWidthNeeded, overallScale, center);
final double leftWidthNeeded = halfWidthNeeded - shift;
final double rightWidthNeeded = halfWidthNeeded + shift;
@@ -3196,8 +2752,7 @@
final double leftAmount = math.max(0.0, math.min(1.0, leftWidthNeeded / _neckTriangleBase));
final double rightAmount = math.max(0.0, math.min(1.0, rightWidthNeeded / _neckTriangleBase));
// The angle between the top neck arc's center and the top lobe's center
- // and vertical. The base amount is chosen so that the neck is smooth,
- // even when the lobe is shifted due to its size.
+ // and vertical.
final double leftTheta = (1.0 - leftAmount) * _thirtyDegrees;
final double rightTheta = (1.0 - rightAmount) * _thirtyDegrees;
// The center of the top left neck arc.
diff --git a/packages/flutter/test/material/inherited_theme_test.dart b/packages/flutter/test/material/inherited_theme_test.dart
index dde7920..07ea067 100644
--- a/packages/flutter/test/material/inherited_theme_test.dart
+++ b/packages/flutter/test/material/inherited_theme_test.dart
@@ -525,7 +525,7 @@
await tester.tap(find.text('push wrapped'));
await tester.pumpAndSettle(); // route animation
RenderBox sliderBox = tester.firstRenderObject<RenderBox>(find.byType(Slider));
- expect(sliderBox, paints..rrect(color: activeTrackColor)..rrect(color: inactiveTrackColor));
+ expect(sliderBox, paints..rect(color: activeTrackColor)..rect(color: inactiveTrackColor));
expect(sliderBox, paints..circle(color: thumbColor));
Navigator.of(navigatorContext).pop();
@@ -534,7 +534,7 @@
await tester.tap(find.text('push unwrapped'));
await tester.pumpAndSettle(); // route animation
sliderBox = tester.firstRenderObject<RenderBox>(find.byType(Slider));
- expect(sliderBox, isNot(paints..rrect(color: activeTrackColor)..rrect(color: inactiveTrackColor)));
+ expect(sliderBox, isNot(paints..rect(color: activeTrackColor)..rect(color: inactiveTrackColor)));
expect(sliderBox, isNot(paints..circle(color: thumbColor)));
});
diff --git a/packages/flutter/test/material/range_slider_test.dart b/packages/flutter/test/material/range_slider_test.dart
index b9b3afe..4972ea0 100644
--- a/packages/flutter/test/material/range_slider_test.dart
+++ b/packages/flutter/test/material/range_slider_test.dart
@@ -1033,17 +1033,15 @@
// Check default theme for enabled widget.
expect(sliderBox, paints
- ..rrect(color: sliderTheme.inactiveTrackColor)
+ ..rect(color: sliderTheme.inactiveTrackColor)
..rect(color: sliderTheme.activeTrackColor)
- ..rrect(color: sliderTheme.inactiveTrackColor));
+ ..rect(color: sliderTheme.inactiveTrackColor));
expect(sliderBox, paints
..circle(color: sliderTheme.thumbColor)
..circle(color: sliderTheme.thumbColor));
expect(sliderBox, isNot(paints..circle(color: sliderTheme.disabledThumbColor)));
expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledActiveTrackColor)));
expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledInactiveTrackColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledActiveTrackColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledInactiveTrackColor)));
expect(sliderBox, isNot(paints..circle(color: sliderTheme.activeTickMarkColor)));
expect(sliderBox, isNot(paints..circle(color: sliderTheme.inactiveTickMarkColor)));
});
@@ -1060,22 +1058,18 @@
expect(
sliderBox,
paints
- ..rrect(color: sliderTheme.inactiveTrackColor)
+ ..rect(color: sliderTheme.inactiveTrackColor)
..rect(color: activeColor)
- ..rrect(color: sliderTheme.inactiveTrackColor));
+ ..rect(color: sliderTheme.inactiveTrackColor));
expect(
sliderBox,
paints
- ..circle(color: Colors.white)
..circle(color: activeColor)
- ..circle(color: Colors.white)
..circle(color: activeColor));
expect(sliderBox, isNot(paints..circle(color: sliderTheme.thumbColor)));
expect(sliderBox, isNot(paints..circle(color: sliderTheme.disabledThumbColor)));
expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledActiveTrackColor)));
expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledInactiveTrackColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledActiveTrackColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledInactiveTrackColor)));
});
testWidgets('Range Slider uses the right theme colors for the right shapes when setting the inactive color', (WidgetTester tester) async {
@@ -1090,9 +1084,9 @@
expect(
sliderBox,
paints
- ..rrect(color: inactiveColor)
+ ..rect(color: inactiveColor)
..rect(color: sliderTheme.activeTrackColor)
- ..rrect(color: inactiveColor));
+ ..rect(color: inactiveColor));
expect(
sliderBox,
paints
@@ -1101,8 +1095,6 @@
expect(sliderBox, isNot(paints..circle(color: sliderTheme.disabledThumbColor)));
expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledActiveTrackColor)));
expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledInactiveTrackColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledActiveTrackColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledInactiveTrackColor)));
});
testWidgets('Range Slider uses the right theme colors for the right shapes with active and inactive colors', (WidgetTester tester) async {
@@ -1122,20 +1114,18 @@
expect(
sliderBox,
paints
- ..rrect(color: inactiveColor)
+ ..rect(color: inactiveColor)
..rect(color: activeColor)
- ..rrect(color: inactiveColor));
+ ..rect(color: inactiveColor));
expect(
sliderBox,
paints
- ..circle(color: Colors.white)
..circle(color: activeColor)
- ..circle(color: Colors.white)
..circle(color: activeColor));
expect(sliderBox, isNot(paints..circle(color: sliderTheme.thumbColor)));
expect(sliderBox, isNot(paints..circle(color: sliderTheme.disabledThumbColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledActiveTrackColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledInactiveTrackColor)));
+ expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledActiveTrackColor)));
+ expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledInactiveTrackColor)));
});
testWidgets('Range Slider uses the right theme colors for the right shapes for a discrete slider', (WidgetTester tester) async {
@@ -1149,9 +1139,9 @@
expect(
sliderBox,
paints
- ..rrect(color: sliderTheme.inactiveTrackColor)
+ ..rect(color: sliderTheme.inactiveTrackColor)
..rect(color: sliderTheme.activeTrackColor)
- ..rrect(color: sliderTheme.inactiveTrackColor));
+ ..rect(color: sliderTheme.inactiveTrackColor));
expect(
sliderBox,
paints
@@ -1164,8 +1154,6 @@
expect(sliderBox, isNot(paints..circle(color: sliderTheme.disabledThumbColor)));
expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledActiveTrackColor)));
expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledInactiveTrackColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledActiveTrackColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledInactiveTrackColor)));
});
testWidgets('Range Slider uses the right theme colors for the right shapes for a discrete slider with active and inactive colors', (WidgetTester tester) async {
@@ -1187,9 +1175,9 @@
expect(
sliderBox,
paints
- ..rrect(color: inactiveColor)
+ ..rect(color: inactiveColor)
..rect(color: activeColor)
- ..rrect(color: inactiveColor));
+ ..rect(color: inactiveColor));
expect(
sliderBox,
paints
@@ -1197,16 +1185,12 @@
..circle(color: activeColor)
..circle(color: inactiveColor)
..circle(color: activeColor)
- ..circle(color: Colors.white)
..circle(color: activeColor)
- ..circle(color: Colors.white)
..circle(color: activeColor));
expect(sliderBox, isNot(paints..circle(color: sliderTheme.thumbColor)));
expect(sliderBox, isNot(paints..circle(color: sliderTheme.disabledThumbColor)));
expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledActiveTrackColor)));
expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledInactiveTrackColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledActiveTrackColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledInactiveTrackColor)));
expect(sliderBox, isNot(paints..circle(color: sliderTheme.activeTickMarkColor)));
expect(sliderBox, isNot(paints..circle(color: sliderTheme.inactiveTickMarkColor)));
});
@@ -1222,14 +1206,12 @@
expect(
sliderBox,
paints
- ..rrect(color: sliderTheme.disabledInactiveTrackColor)
+ ..rect(color: sliderTheme.disabledInactiveTrackColor)
..rect(color: sliderTheme.disabledActiveTrackColor)
- ..rrect(color: sliderTheme.disabledInactiveTrackColor));
+ ..rect(color: sliderTheme.disabledInactiveTrackColor));
expect(sliderBox, isNot(paints..circle(color: sliderTheme.thumbColor)));
expect(sliderBox, isNot(paints..rect(color: sliderTheme.activeTrackColor)));
expect(sliderBox, isNot(paints..rect(color: sliderTheme.inactiveTrackColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.activeTrackColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.inactiveTrackColor)));
});
@@ -1251,17 +1233,17 @@
expect(
sliderBox,
paints
- ..rrect(color: sliderTheme.disabledInactiveTrackColor)
+ ..rect(color: sliderTheme.disabledInactiveTrackColor)
..rect(color: sliderTheme.disabledActiveTrackColor)
- ..rrect(color: sliderTheme.disabledInactiveTrackColor));
+ ..rect(color: sliderTheme.disabledInactiveTrackColor));
expect(sliderBox, isNot(paints..circle(color: sliderTheme.thumbColor)));
expect(sliderBox, isNot(paints..rect(color: sliderTheme.activeTrackColor)));
expect(sliderBox, isNot(paints..rect(color: sliderTheme.inactiveTrackColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.activeTrackColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.inactiveTrackColor)));
});
testWidgets('Range Slider uses the right theme colors for the right shapes when the value indicators are showing', (WidgetTester tester) async {
+ const Color customColor1 = Color(0xcafefeed);
+ const Color customColor2 = Color(0xdeadbeef);
final ThemeData theme = _buildTheme();
final SliderThemeData sliderTheme = theme.sliderTheme;
RangeValues values = const RangeValues(0.5, 0.75);
@@ -1303,7 +1285,7 @@
final RenderBox sliderBox = tester.firstRenderObject<RenderBox>(find.byType(RangeSlider));
final Offset topRight = tester.getTopRight(find.byType(RangeSlider)).translate(-24, 0);
- final TestGesture gesture = await tester.startGesture(topRight);
+ TestGesture gesture = await tester.startGesture(topRight);
// Wait for value indicator animation to finish.
await tester.pumpAndSettle();
expect(values.end, equals(1));
@@ -1316,6 +1298,24 @@
await gesture.up();
// Wait for value indicator animation to finish.
await tester.pumpAndSettle();
+
+ // Testing the custom colors are used for the indicator.
+ await tester.pumpWidget(buildApp(
+ divisions: 3,
+ activeColor: customColor1,
+ inactiveColor: customColor2,
+ ));
+ gesture = await tester.startGesture(topRight);
+ // Wait for value indicator animation to finish.
+ await tester.pumpAndSettle();
+ expect(values.end, equals(1));
+ expect(
+ sliderBox,
+ paints
+ ..path(color: customColor1)
+ ..path(color: customColor1),
+ );
+ await gesture.up();
});
testWidgets('Range Slider top thumb gets stroked when overlapping', (WidgetTester tester) async {
diff --git a/packages/flutter/test/material/slider_test.dart b/packages/flutter/test/material/slider_test.dart
index f1019ee..4041672 100644
--- a/packages/flutter/test/material/slider_test.dart
+++ b/packages/flutter/test/material/slider_test.dart
@@ -39,8 +39,6 @@
SliderThemeData sliderTheme,
TextDirection textDirection,
double value,
- double textScaleFactor,
- Size sizeWithOverflow,
}) {
log.add(thumbCenter);
final Paint thumbPaint = Paint()..color = Colors.red;
@@ -584,7 +582,6 @@
overlayColor: Color(0xff000010),
thumbColor: Color(0xff000011),
valueIndicatorColor: Color(0xff000012),
- surfaceColor: Colors.white,
),
);
final SliderThemeData sliderTheme = theme.sliderTheme;
@@ -628,47 +625,43 @@
final RenderBox sliderBox = tester.firstRenderObject<RenderBox>(find.byType(Slider));
// Check default theme for enabled widget.
- expect(sliderBox, paints..rrect(color: sliderTheme.activeTrackColor)..rrect(color: sliderTheme.inactiveTrackColor));
- expect(sliderBox, paints..shadow(color: const Color(0xff000000)));
+ expect(sliderBox, paints..rect(color: sliderTheme.activeTrackColor)..rect(color: sliderTheme.inactiveTrackColor));
expect(sliderBox, paints..circle(color: sliderTheme.thumbColor));
expect(sliderBox, isNot(paints..circle(color: sliderTheme.disabledThumbColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledActiveTrackColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledInactiveTrackColor)));
+ expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledActiveTrackColor)));
+ expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledInactiveTrackColor)));
expect(sliderBox, isNot(paints..circle(color: sliderTheme.activeTickMarkColor)));
expect(sliderBox, isNot(paints..circle(color: sliderTheme.inactiveTickMarkColor)));
// Test setting only the activeColor.
await tester.pumpWidget(buildApp(activeColor: customColor1));
- expect(sliderBox, paints..rrect(color: customColor1)..rrect(color: sliderTheme.inactiveTrackColor));
- expect(sliderBox, paints..shadow(color: Colors.black));
- expect(sliderBox, paints..circle(color: Colors.white)..circle(color: customColor1));
+ expect(sliderBox, paints..rect(color: customColor1)..rect(color: sliderTheme.inactiveTrackColor));
+ expect(sliderBox, paints..circle(color: customColor1));
expect(sliderBox, isNot(paints..circle(color: sliderTheme.thumbColor)));
expect(sliderBox, isNot(paints..circle(color: sliderTheme.disabledThumbColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledActiveTrackColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledInactiveTrackColor)));
+ expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledActiveTrackColor)));
+ expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledInactiveTrackColor)));
// Test setting only the inactiveColor.
await tester.pumpWidget(buildApp(inactiveColor: customColor1));
- expect(sliderBox, paints..rrect(color: sliderTheme.activeTrackColor)..rrect(color: customColor1));
- expect(sliderBox, paints..shadow(color: Colors.black));
+ expect(sliderBox, paints..rect(color: sliderTheme.activeTrackColor)..rect(color: customColor1));
expect(sliderBox, paints..circle(color: sliderTheme.thumbColor));
expect(sliderBox, isNot(paints..circle(color: sliderTheme.disabledThumbColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledActiveTrackColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledInactiveTrackColor)));
+ expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledActiveTrackColor)));
+ expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledInactiveTrackColor)));
// Test setting both activeColor and inactiveColor.
await tester.pumpWidget(buildApp(activeColor: customColor1, inactiveColor: customColor2));
- expect(sliderBox, paints..rrect(color: customColor1)..rrect(color: customColor2));
- expect(sliderBox, paints..shadow(color: Colors.black));
- expect(sliderBox, paints..circle(color: Colors.white)..circle(color: customColor1));
+ expect(sliderBox, paints..rect(color: customColor1)..rect(color: customColor2));
+ expect(sliderBox, paints..circle(color: customColor1));
expect(sliderBox, isNot(paints..circle(color: sliderTheme.thumbColor)));
expect(sliderBox, isNot(paints..circle(color: sliderTheme.disabledThumbColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledActiveTrackColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledInactiveTrackColor)));
+ expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledActiveTrackColor)));
+ expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledInactiveTrackColor)));
// Test colors for discrete slider.
await tester.pumpWidget(buildApp(divisions: 3));
- expect(sliderBox, paints..rrect(color: sliderTheme.activeTrackColor)..rrect(color: sliderTheme.inactiveTrackColor));
+ expect(sliderBox, paints..rect(color: sliderTheme.activeTrackColor)..rect(color: sliderTheme.inactiveTrackColor));
expect(
sliderBox,
paints
@@ -676,12 +669,10 @@
..circle(color: sliderTheme.activeTickMarkColor)
..circle(color: sliderTheme.inactiveTickMarkColor)
..circle(color: sliderTheme.inactiveTickMarkColor)
- ..shadow(color: Colors.black)
- ..circle(color: sliderTheme.thumbColor)
- );
+ ..circle(color: sliderTheme.thumbColor));
expect(sliderBox, isNot(paints..circle(color: sliderTheme.disabledThumbColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledActiveTrackColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledInactiveTrackColor)));
+ expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledActiveTrackColor)));
+ expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledInactiveTrackColor)));
// Test colors for discrete slider with inactiveColor and activeColor set.
await tester.pumpWidget(buildApp(
@@ -689,7 +680,7 @@
inactiveColor: customColor2,
divisions: 3,
));
- expect(sliderBox, paints..rrect(color: customColor1)..rrect(color: customColor2));
+ expect(sliderBox, paints..rect(color: customColor1)..rect(color: customColor2));
expect(
sliderBox,
paints
@@ -697,13 +688,11 @@
..circle(color: customColor2)
..circle(color: customColor1)
..circle(color: customColor1)
- ..shadow(color: Colors.black)
- ..circle(color: Colors.white)
..circle(color: customColor1));
expect(sliderBox, isNot(paints..circle(color: sliderTheme.thumbColor)));
expect(sliderBox, isNot(paints..circle(color: sliderTheme.disabledThumbColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledActiveTrackColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledInactiveTrackColor)));
+ expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledActiveTrackColor)));
+ expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledInactiveTrackColor)));
expect(sliderBox, isNot(paints..circle(color: sliderTheme.activeTickMarkColor)));
expect(sliderBox, isNot(paints..circle(color: sliderTheme.inactiveTickMarkColor)));
@@ -713,24 +702,24 @@
expect(
sliderBox,
paints
- ..rrect(color: sliderTheme.disabledActiveTrackColor)
- ..rrect(color: sliderTheme.disabledInactiveTrackColor));
- expect(sliderBox, paints..shadow(color: Colors.black)..circle(color: sliderTheme.disabledThumbColor));
+ ..rect(color: sliderTheme.disabledActiveTrackColor)
+ ..rect(color: sliderTheme.disabledInactiveTrackColor));
+ expect(sliderBox, paints..circle(color: sliderTheme.disabledThumbColor));
expect(sliderBox, isNot(paints..circle(color: sliderTheme.thumbColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.activeTrackColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.inactiveTrackColor)));
+ expect(sliderBox, isNot(paints..rect(color: sliderTheme.activeTrackColor)));
+ expect(sliderBox, isNot(paints..rect(color: sliderTheme.inactiveTrackColor)));
// Test setting the activeColor and inactiveColor for disabled widget.
await tester.pumpWidget(buildApp(activeColor: customColor1, inactiveColor: customColor2, enabled: false));
expect(
sliderBox,
paints
- ..rrect(color: sliderTheme.disabledActiveTrackColor)
- ..rrect(color: sliderTheme.disabledInactiveTrackColor));
- expect(sliderBox, paints..shadow(color: Colors.black)..circle(color: sliderTheme.disabledThumbColor));
+ ..rect(color: sliderTheme.disabledActiveTrackColor)
+ ..rect(color: sliderTheme.disabledInactiveTrackColor));
+ expect(sliderBox, paints..circle(color: sliderTheme.disabledThumbColor));
expect(sliderBox, isNot(paints..circle(color: sliderTheme.thumbColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.activeTrackColor)));
- expect(sliderBox, isNot(paints..rrect(color: sliderTheme.inactiveTrackColor)));
+ expect(sliderBox, isNot(paints..rect(color: sliderTheme.activeTrackColor)));
+ expect(sliderBox, isNot(paints..rect(color: sliderTheme.inactiveTrackColor)));
// Test that the default value indicator has the right colors.
await tester.pumpWidget(buildApp(divisions: 3));
@@ -742,15 +731,14 @@
expect(
sliderBox,
paints
- ..rrect(color: sliderTheme.activeTrackColor)
- ..rrect(color: sliderTheme.inactiveTrackColor)
+ ..rect(color: sliderTheme.activeTrackColor)
+ ..rect(color: sliderTheme.inactiveTrackColor)
..circle(color: sliderTheme.overlayColor)
..circle(color: sliderTheme.activeTickMarkColor)
..circle(color: sliderTheme.activeTickMarkColor)
..circle(color: sliderTheme.inactiveTickMarkColor)
..circle(color: sliderTheme.inactiveTickMarkColor)
..path(color: sliderTheme.valueIndicatorColor)
- ..shadow(color: Colors.black)
..circle(color: sliderTheme.thumbColor),
);
await gesture.up();
@@ -771,16 +759,14 @@
expect(
sliderBox,
paints
- ..rrect(color: customColor1) // active track
- ..rrect(color: customColor2) // inactive track
+ ..rect(color: customColor1) // active track
+ ..rect(color: customColor2) // inactive track
..circle(color: customColor1.withOpacity(0.12)) // overlay
..circle(color: customColor2) // 1st tick mark
..circle(color: customColor2) // 2nd tick mark
..circle(color: customColor2) // 3rd tick mark
..circle(color: customColor1) // 4th tick mark
- ..path(color: sliderTheme.valueIndicatorColor) // indicator
- ..shadow(color: Colors.black)
- ..circle(color: Colors.white)
+ ..path(color: customColor1) // indicator
..circle(color: customColor1), // thumb
);
await gesture.up();
@@ -984,19 +970,7 @@
TestGesture gesture = await tester.startGesture(center);
await tester.pumpAndSettle();
- expect(
- tester.renderObject(find.byType(Slider)),
- paints
- ..path(
- includes: const <Offset>[
- Offset(0.0, 0.0),
- Offset(0.0, -38.0),
- Offset(-30.0, -16.0),
- Offset(30.0, -16.0),
- ],
- color: const Color(0xf55f5f5f),
- ),
- );
+ expect(tester.renderObject(find.byType(Slider)), paints..scale(x: 1.0, y: 1.0));
await gesture.up();
await tester.pumpAndSettle();
@@ -1006,19 +980,7 @@
gesture = await tester.startGesture(center);
await tester.pumpAndSettle();
- expect(
- tester.renderObject(find.byType(Slider)),
- paints
- ..path(
- includes: const <Offset>[
- Offset(0.0, 0.0),
- Offset(0.0, -52.0),
- Offset(-44.0, -16.0),
- Offset(44.0, -16.0),
- ],
- color: const Color(0xf55f5f5f),
- ),
- );
+ expect(tester.renderObject(find.byType(Slider)), paints..scale(x: 2.0, y: 2.0));
await gesture.up();
await tester.pumpAndSettle();
@@ -1033,18 +995,7 @@
gesture = await tester.startGesture(center);
await tester.pumpAndSettle();
- expect(tester.renderObject(find.byType(Slider)),
- paints
- ..path(
- includes: const <Offset>[
- Offset(0.0, 0.0),
- Offset(0.0, -38.0),
- Offset(-30.0, -16.0),
- Offset(30.0, -16.0),
- ],
- color: const Color(0xf55f5f5f),
- ),
- );
+ expect(tester.renderObject(find.byType(Slider)), paints..scale(x: 1.0, y: 1.0));
await gesture.up();
await tester.pumpAndSettle();
@@ -1058,19 +1009,7 @@
gesture = await tester.startGesture(center);
await tester.pumpAndSettle();
- expect(
- tester.renderObject(find.byType(Slider)),
- paints
- ..path(
- includes: const <Offset>[
- Offset(0.0, 0.0),
- Offset(0.0, -52.0),
- Offset(-44.0, -16.0),
- Offset(44.0, -16.0),
- ],
- color: const Color(0xf55f5f5f),
- ),
- );
+ expect(tester.renderObject(find.byType(Slider)), paints..scale(x: 2.0, y: 2.0));
await gesture.up();
await tester.pumpAndSettle();
@@ -1175,11 +1114,11 @@
expect(
sliderBox,
paints
- ..circle(x: 26.0, y: 24.0, radius: 1.0)
- ..circle(x: 213.0, y: 24.0, radius: 1.0)
+ ..circle(x: 25.0, y: 24.0, radius: 1.0)
+ ..circle(x: 212.5, y: 24.0, radius: 1.0)
..circle(x: 400.0, y: 24.0, radius: 1.0)
- ..circle(x: 587.0, y: 24.0, radius: 1.0)
- ..circle(x: 774.0, y: 24.0, radius: 1.0)
+ ..circle(x: 587.5, y: 24.0, radius: 1.0)
+ ..circle(x: 775.0, y: 24.0, radius: 1.0)
..circle(x: 24.0, y: 24.0, radius: 10.0),
);
@@ -1192,11 +1131,11 @@
sliderBox,
paints
..circle(x: 111.20703125, y: 24.0, radius: 5.687664985656738)
- ..circle(x: 26.0, y: 24.0, radius: 1.0)
- ..circle(x: 213.0, y: 24.0, radius: 1.0)
+ ..circle(x: 25.0, y: 24.0, radius: 1.0)
+ ..circle(x: 212.5, y: 24.0, radius: 1.0)
..circle(x: 400.0, y: 24.0, radius: 1.0)
- ..circle(x: 587.0, y: 24.0, radius: 1.0)
- ..circle(x: 774.0, y: 24.0, radius: 1.0)
+ ..circle(x: 587.5, y: 24.0, radius: 1.0)
+ ..circle(x: 775.0, y: 24.0, radius: 1.0)
..circle(x: 111.20703125, y: 24.0, radius: 10.0),
);
@@ -1212,11 +1151,11 @@
sliderBox,
paints
..circle(x: 190.0135726928711, y: 24.0, radius: 12.0)
- ..circle(x: 26.0, y: 24.0, radius: 1.0)
- ..circle(x: 213.0, y: 24.0, radius: 1.0)
+ ..circle(x: 25.0, y: 24.0, radius: 1.0)
+ ..circle(x: 212.5, y: 24.0, radius: 1.0)
..circle(x: 400.0, y: 24.0, radius: 1.0)
- ..circle(x: 587.0, y: 24.0, radius: 1.0)
- ..circle(x: 774.0, y: 24.0, radius: 1.0)
+ ..circle(x: 587.5, y: 24.0, radius: 1.0)
+ ..circle(x: 775.0, y: 24.0, radius: 1.0)
..circle(x: 190.0135726928711, y: 24.0, radius: 10.0),
);
// Wait for animations to finish.
@@ -1226,11 +1165,11 @@
sliderBox,
paints
..circle(x: 400.0, y: 24.0, radius: 24.0)
- ..circle(x: 26.0, y: 24.0, radius: 1.0)
- ..circle(x: 213.0, y: 24.0, radius: 1.0)
+ ..circle(x: 25.0, y: 24.0, radius: 1.0)
+ ..circle(x: 212.5, y: 24.0, radius: 1.0)
..circle(x: 400.0, y: 24.0, radius: 1.0)
- ..circle(x: 587.0, y: 24.0, radius: 1.0)
- ..circle(x: 774.0, y: 24.0, radius: 1.0)
+ ..circle(x: 587.5, y: 24.0, radius: 1.0)
+ ..circle(x: 775.0, y: 24.0, radius: 1.0)
..circle(x: 400.0, y: 24.0, radius: 10.0),
);
await gesture.up();
@@ -1239,11 +1178,11 @@
expect(
sliderBox,
paints
- ..circle(x: 26.0, y: 24.0, radius: 1.0)
- ..circle(x: 213.0, y: 24.0, radius: 1.0)
+ ..circle(x: 25.0, y: 24.0, radius: 1.0)
+ ..circle(x: 212.5, y: 24.0, radius: 1.0)
..circle(x: 400.0, y: 24.0, radius: 1.0)
- ..circle(x: 587.0, y: 24.0, radius: 1.0)
- ..circle(x: 774.0, y: 24.0, radius: 1.0)
+ ..circle(x: 587.5, y: 24.0, radius: 1.0)
+ ..circle(x: 775.0, y: 24.0, radius: 1.0)
..circle(x: 400.0, y: 24.0, radius: 10.0),
);
}
diff --git a/packages/flutter/test/material/slider_theme_test.dart b/packages/flutter/test/material/slider_theme_test.dart
index 8783b59..0fe0688 100644
--- a/packages/flutter/test/material/slider_theme_test.dart
+++ b/packages/flutter/test/material/slider_theme_test.dart
@@ -107,8 +107,8 @@
expect(
sliderBox,
paints
- ..rrect(color: sliderTheme.disabledActiveTrackColor)
- ..rrect(color: sliderTheme.disabledInactiveTrackColor),
+ ..rect(color: sliderTheme.disabledActiveTrackColor)
+ ..rect(color: sliderTheme.disabledInactiveTrackColor),
);
});
@@ -129,8 +129,8 @@
expect(
sliderBox,
paints
- ..rrect(color: customTheme.disabledActiveTrackColor)
- ..rrect(color: customTheme.disabledInactiveTrackColor),
+ ..rect(color: customTheme.disabledActiveTrackColor)
+ ..rect(color: customTheme.disabledInactiveTrackColor),
);
});
@@ -228,15 +228,13 @@
await tester.pumpWidget(_buildApp(sliderTheme, value: 0.25));
final RenderBox sliderBox = tester.firstRenderObject<RenderBox>(find.byType(Slider));
- const Radius radius = Radius.circular(2);
-
// The enabled slider thumb has track segments that extend to and from
// the center of the thumb.
expect(
sliderBox,
paints
- ..rrect(rrect: RRect.fromLTRBAndCorners(24.0, 298.0, 212.0, 302.0, topLeft: radius, bottomLeft: radius), color: sliderTheme.activeTrackColor)
- ..rrect(rrect: RRect.fromLTRBAndCorners(212.0, 298.0, 776.0, 302.0, topRight: radius, bottomRight: radius), color: sliderTheme.inactiveTrackColor),
+ ..rect(rect: const Rect.fromLTRB(25.0, 299.0, 202.0, 301.0), color: sliderTheme.activeTrackColor)
+ ..rect(rect: const Rect.fromLTRB(222.0, 299.0, 776.0, 301.0), color: sliderTheme.inactiveTrackColor),
);
await tester.pumpWidget(_buildApp(sliderTheme, value: 0.25, enabled: false));
@@ -251,8 +249,8 @@
expect(
sliderBox,
paints
- ..rrect(rrect: RRect.fromLTRBAndCorners(24.0, 298.0, 212.0, 302.0, topLeft: radius, bottomLeft: radius), color: sliderTheme.disabledActiveTrackColor)
- ..rrect(rrect: RRect.fromLTRBAndCorners(212.0, 298.0, 776.0, 302.0, topRight: radius, bottomRight: radius), color: sliderTheme.disabledInactiveTrackColor),
+ ..rect(rect: const Rect.fromLTRB(25.0, 299.0, 202.0, 301.0), color: sliderTheme.disabledActiveTrackColor)
+ ..rect(rect: const Rect.fromLTRB(222.0, 299.0, 776.0, 301.0), color: sliderTheme.disabledInactiveTrackColor),
);
});
@@ -366,189 +364,7 @@
platform: TargetPlatform.android,
primarySwatch: Colors.blue,
);
- final SliderThemeData sliderTheme = theme.sliderTheme.copyWith(
- thumbColor: Colors.red.shade500,
- showValueIndicator: ShowValueIndicator.always,
- );
- Widget buildApp(String value, { double sliderValue = 0.5, double textScale = 1.0 }) {
- return Directionality(
- textDirection: TextDirection.ltr,
- child: MediaQuery(
- data: MediaQueryData.fromWindow(window).copyWith(textScaleFactor: textScale),
- child: Material(
- child: Row(
- children: <Widget>[
- Expanded(
- child: SliderTheme(
- data: sliderTheme,
- child: Slider(
- value: sliderValue,
- label: '$value',
- divisions: 3,
- onChanged: (double d) { },
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- );
- }
-
- await tester.pumpWidget(buildApp('1'));
-
- final RenderBox sliderBox = tester.firstRenderObject<RenderBox>(find.byType(Slider));
-
- Offset center = tester.getCenter(find.byType(Slider));
- TestGesture gesture = await tester.startGesture(center);
- // Wait for value indicator animation to finish.
- await tester.pumpAndSettle();
- expect(
- sliderBox,
- paints
- ..path(
- includes: const <Offset>[
- Offset(0.0, 0.0),
- Offset(-20.0, -12.0),
- Offset(20.0, -34.0),
- Offset(0.0, -38.0),
- ],
- color: const Color(0xf55f5f5f),
- ),
- );
-
- await gesture.up();
-
- // Test that it expands with a larger label.
- await tester.pumpWidget(buildApp('1000'));
- center = tester.getCenter(find.byType(Slider));
- gesture = await tester.startGesture(center);
- // Wait for value indicator animation to finish.
- await tester.pumpAndSettle();
- expect(
- sliderBox,
- paints
- ..rrect()
- ..rrect()
- ..path(
- includes: const <Offset>[
- Offset(0.0, 0.0),
- Offset(-30.0, -12.0),
- Offset(30.0, -34.0),
- Offset(0.0, -38.0),
- ],
- color: const Color(0xf55f5f5f),
- ),
- );
- await gesture.up();
-
- // Test that it avoids the left edge of the screen.
- await tester.pumpWidget(buildApp('1000000', sliderValue: 0.0));
- center = tester.getCenter(find.byType(Slider));
- gesture = await tester.startGesture(center);
- // Wait for value indicator animation to finish.
- await tester.pumpAndSettle();
- expect(
- sliderBox,
- paints
- ..rrect()
- ..rrect()
- ..path(
- includes: const <Offset>[
- Offset(0.0, 0.0),
- Offset(-12.0, -12.0),
- Offset(110.0, -34.0),
- Offset(0.0, -38.0),
- ],
- color: const Color(0xf55f5f5f),
- )
- );
- await gesture.up();
-
- // Test that it avoids the right edge of the screen.
- await tester.pumpWidget(buildApp('1000000', sliderValue: 1.0));
- center = tester.getCenter(find.byType(Slider));
- gesture = await tester.startGesture(center);
- // Wait for value indicator animation to finish.
- await tester.pumpAndSettle();
- expect(
- sliderBox,
- paints
- ..rrect()
- ..rrect()
- ..path(
- includes: const <Offset>[
- Offset(0.0, 0.0),
- Offset(-110.0, -12.0),
- Offset(12.0, -34.0),
- Offset(0.0, -38.0),
- ],
- color: const Color(0xf55f5f5f),
- )
- );
- await gesture.up();
-
- // Test that the box decreases in height when the text scale gets smaller.
- await tester.pumpWidget(buildApp('1000000', sliderValue: 0.0, textScale: 0.5));
- center = tester.getCenter(find.byType(Slider));
- gesture = await tester.startGesture(center);
- // Wait for value indicator animation to finish.
- await tester.pumpAndSettle();
- expect(
- sliderBox,
- paints
- ..rrect()
- ..rrect()
- ..path(
- includes: const <Offset>[
- Offset(0.0, 0.0),
- Offset(-12.0, -12.0),
- Offset(61.0, -16.0),
- Offset(0.0, -20.0),
- ],
- excludes: const <Offset>[
- Offset(0.0, -38.0)
- ],
- color: const Color(0xf55f5f5f),
- )
- );
- await gesture.up();
-
- // Test that the box increases in height when the text scale gets bigger.
- await tester.pumpWidget(buildApp('1000000', sliderValue: 0.0, textScale: 2.0));
- center = tester.getCenter(find.byType(Slider));
- gesture = await tester.startGesture(center);
- // Wait for value indicator animation to finish.
- await tester.pumpAndSettle();
- expect(
- sliderBox,
- paints
- ..rrect()
- ..rrect()
- ..path(
- includes: const <Offset>[
- Offset(0.0, 0.0),
- Offset(-12.0, -16.0),
- Offset(208.0, -40.0),
- Offset(0.0, -50.0),
- ],
- color: const Color(0xf55f5f5f),
- )
- );
- await gesture.up();
- }, skip: isBrowser);
-
- testWidgets('Paddle slider value indicator shape draws correctly', (WidgetTester tester) async {
- final ThemeData theme = ThemeData(
- platform: TargetPlatform.android,
- primarySwatch: Colors.blue,
- );
- final SliderThemeData sliderTheme = theme.sliderTheme.copyWith(
- thumbColor: Colors.red.shade500,
- showValueIndicator: ShowValueIndicator.always,
- valueIndicatorShape: const PaddleSliderValueIndicatorShape(),
- );
+ final SliderThemeData sliderTheme = theme.sliderTheme.copyWith(thumbColor: Colors.red.shade500, showValueIndicator: ShowValueIndicator.always);
Widget buildApp(String value, { double sliderValue = 0.5, double textScale = 1.0 }) {
return Directionality(
textDirection: TextDirection.ltr,
@@ -716,7 +532,6 @@
testWidgets('The slider track height can be overridden', (WidgetTester tester) async {
final SliderThemeData sliderTheme = ThemeData().sliderTheme.copyWith(trackHeight: 16);
- const Radius radius = Radius.circular(8);
await tester.pumpWidget(_buildApp(sliderTheme, value: 0.25));
@@ -726,8 +541,8 @@
expect(
sliderBox,
paints
- ..rrect(rrect: RRect.fromLTRBAndCorners(24.0, 292.0, 212.0, 308.0, topLeft: radius, bottomLeft: radius), color: sliderTheme.activeTrackColor)
- ..rrect(rrect: RRect.fromLTRBAndCorners(212.0, 292.0, 776.0, 308.0, topRight: radius, bottomRight: radius), color: sliderTheme.inactiveTrackColor),
+ ..rect(rect: const Rect.fromLTRB(32.0, 292.0, 202.0, 308.0), color: sliderTheme.activeTrackColor)
+ ..rect(rect: const Rect.fromLTRB(222.0, 292.0, 776.0, 308.0), color: sliderTheme.inactiveTrackColor),
);
await tester.pumpWidget(_buildApp(sliderTheme, value: 0.25, enabled: false));
@@ -738,8 +553,8 @@
expect(
sliderBox,
paints
- ..rrect(rrect: RRect.fromLTRBAndCorners(24.0, 292.0, 212.0, 308.0, topLeft: radius, bottomLeft: radius), color: sliderTheme.disabledActiveTrackColor)
- ..rrect(rrect: RRect.fromLTRBAndCorners(212.0, 292.0, 776.0, 308.0, topRight: radius, bottomRight: radius), color: sliderTheme.disabledInactiveTrackColor),
+ ..rect(rect: const Rect.fromLTRB(32.0, 292.0, 202.0, 308.0), color: sliderTheme.disabledActiveTrackColor)
+ ..rect(rect: const Rect.fromLTRB(222.0, 292.0, 776.0, 308.0), color: sliderTheme.disabledInactiveTrackColor),
);
});
@@ -808,9 +623,9 @@
expect(
sliderBox,
paints
- ..circle(x: 26, y: 300, radius: 5, color: sliderTheme.activeTickMarkColor)
+ ..circle(x: 29, y: 300, radius: 5, color: sliderTheme.activeTickMarkColor)
..circle(x: 400, y: 300, radius: 5, color: sliderTheme.activeTickMarkColor)
- ..circle(x: 774, y: 300, radius: 5, color: sliderTheme.inactiveTickMarkColor),
+ ..circle(x: 771, y: 300, radius: 5, color: sliderTheme.inactiveTickMarkColor),
);
await tester.pumpWidget(_buildApp(sliderTheme, value: 0.5, divisions: 2, enabled: false));
@@ -819,9 +634,9 @@
expect(
sliderBox,
paints
- ..circle(x: 26, y: 300, radius: 5, color: sliderTheme.disabledActiveTickMarkColor)
+ ..circle(x: 29, y: 300, radius: 5, color: sliderTheme.disabledActiveTickMarkColor)
..circle(x: 400, y: 300, radius: 5, color: sliderTheme.disabledActiveTickMarkColor)
- ..circle(x: 774, y: 300, radius: 5, color: sliderTheme.disabledInactiveTickMarkColor),
+ ..circle(x: 771, y: 300, radius: 5, color: sliderTheme.disabledInactiveTickMarkColor),
);
});
@@ -893,7 +708,7 @@
final RenderBox sliderBox = tester.firstRenderObject<RenderBox>(find.byType(Slider));
// Only 2 track segments.
- expect(sliderBox, paintsExactlyCountTimes(#drawRRect, 2));
+ expect(sliderBox, paintsExactlyCountTimes(#drawRect, 2));
expect(sliderBox, paintsExactlyCountTimes(#drawCircle, 0));
expect(sliderBox, paintsExactlyCountTimes(#drawPath, 0));
});
@@ -1000,124 +815,34 @@
await gesture.up();
});
- testWidgets('PaddleSliderValueIndicatorShape skips all painting at zero scale', (WidgetTester tester) async {
- // Pump a slider with just a value indicator.
- await tester.pumpWidget(_buildApp(
- ThemeData().sliderTheme.copyWith(
- trackHeight: 0,
- overlayShape: SliderComponentShape.noOverlay,
- thumbShape: SliderComponentShape.noThumb,
- tickMarkShape: SliderTickMarkShape.noTickMark,
- showValueIndicator: ShowValueIndicator.always,
- valueIndicatorShape: const PaddleSliderValueIndicatorShape(),
- ),
- value: 0.5,
- divisions: 4,
- ));
-
- final RenderBox sliderBox = tester.firstRenderObject<RenderBox>(find.byType(Slider));
-
- // Tap the center of the track to kick off the animation of the value indicator.
- final Offset center = tester.getCenter(find.byType(Slider));
- final TestGesture gesture = await tester.startGesture(center);
-
- // Nothing to paint at scale 0.
- await tester.pump();
- expect(sliderBox, paintsNothing);
-
- // Painting a path for the value indicator.
- await tester.pump(const Duration(milliseconds: 16));
- expect(sliderBox, paintsExactlyCountTimes(#drawPath, 1));
-
- await gesture.up();
- });
-
- testWidgets('Default slider value indicator shape skips all painting at zero scale', (WidgetTester tester) async {
- // Pump a slider with just a value indicator.
- await tester.pumpWidget(_buildApp(
- ThemeData().sliderTheme.copyWith(
- trackHeight: 0,
- overlayShape: SliderComponentShape.noOverlay,
- thumbShape: SliderComponentShape.noThumb,
- tickMarkShape: SliderTickMarkShape.noTickMark,
- showValueIndicator: ShowValueIndicator.always,
- ),
- value: 0.5,
- divisions: 4,
- ));
-
- final RenderBox sliderBox = tester.firstRenderObject<RenderBox>(find.byType(Slider));
-
- // Tap the center of the track to kick off the animation of the value indicator.
- final Offset center = tester.getCenter(find.byType(Slider));
- final TestGesture gesture = await tester.startGesture(center);
-
- // Nothing to paint at scale 0.
- await tester.pump();
- expect(sliderBox, paintsNothing);
-
- // Painting a path for the value indicator.
- await tester.pump(const Duration(milliseconds: 16));
- expect(sliderBox, paintsExactlyCountTimes(#drawPath, 1));
-
- await gesture.up();
- });
-
testWidgets('PaddleRangeSliderValueIndicatorShape skips all painting at zero scale', (WidgetTester tester) async {
// Pump a slider with just a value indicator.
- await tester.pumpWidget(_buildRangeApp(
- ThemeData().sliderTheme.copyWith(
- trackHeight: 0,
- rangeValueIndicatorShape: const PaddleRangeSliderValueIndicatorShape(),
- ),
- values: const RangeValues(0, 0.5),
- divisions: 4,
- ));
-
- final RenderBox sliderBox = tester.firstRenderObject<RenderBox>(find.byType(RangeSlider));
-
- // Tap the center of the track to kick off the animation of the value indicator.
- final Offset center = tester.getCenter(find.byType(RangeSlider));
- final TestGesture gesture = await tester.startGesture(center);
-
- // No value indicator path to paint at scale 0.
- await tester.pump();
- expect(sliderBox, paintsExactlyCountTimes(#drawPath, 0));
-
- // Painting a path for each value indicator.
- await tester.pump(const Duration(milliseconds: 16));
- expect(sliderBox, paintsExactlyCountTimes(#drawPath, 2));
-
- await gesture.up();
- });
-
- testWidgets('Default range indicator shape skips all painting at zero scale', (WidgetTester tester) async {
- // Pump a slider with just a value indicator.
- await tester.pumpWidget(_buildRangeApp(
+ await tester.pumpWidget(_buildApp(
ThemeData().sliderTheme.copyWith(
trackHeight: 0,
overlayShape: SliderComponentShape.noOverlay,
thumbShape: SliderComponentShape.noThumb,
tickMarkShape: SliderTickMarkShape.noTickMark,
showValueIndicator: ShowValueIndicator.always,
+ rangeValueIndicatorShape: const PaddleRangeSliderValueIndicatorShape(),
),
- values: const RangeValues(0, 0.5),
+ value: 0.5,
divisions: 4,
));
- final RenderBox sliderBox = tester.firstRenderObject<RenderBox>(find.byType(RangeSlider));
+ final RenderBox sliderBox = tester.firstRenderObject<RenderBox>(find.byType(Slider));
// Tap the center of the track to kick off the animation of the value indicator.
- final Offset center = tester.getCenter(find.byType(RangeSlider));
+ final Offset center = tester.getCenter(find.byType(Slider));
final TestGesture gesture = await tester.startGesture(center);
- // No value indicator path to paint at scale 0.
+ // Nothing to paint at scale 0.
await tester.pump();
- expect(sliderBox, paintsExactlyCountTimes(#drawPath, 0));
+ expect(sliderBox, paintsNothing);
- // Painting a path for each value indicator.
+ // Painting a path for the value indicator.
await tester.pump(const Duration(milliseconds: 16));
- expect(sliderBox, paintsExactlyCountTimes(#drawPath, 2));
+ expect(sliderBox, paintsExactlyCountTimes(#drawPath, 1));
await gesture.up();
});
@@ -1146,27 +871,3 @@
),
);
}
-
-Widget _buildRangeApp(
- SliderThemeData sliderTheme, {
- RangeValues values = const RangeValues(0, 0),
- bool enabled = true,
- int divisions,
- }) {
- final ValueChanged<RangeValues> onChanged = enabled ? (RangeValues d) => values = d : null;
- return MaterialApp(
- home: Scaffold(
- body: Center(
- child: SliderTheme(
- data: sliderTheme,
- child: RangeSlider(
- values: values,
- labels: RangeLabels(values.start.toString(), values.end.toString()),
- onChanged: onChanged,
- divisions: divisions,
- ),
- ),
- ),
- ),
- );
-}