Unverified Commit acb08554 authored by Jesús S Guerrero's avatar Jesús S Guerrero Committed by GitHub

Revert "[a11y] CupertinoSwitch On/Off labels" (#130166)

Reverts flutter/flutter#127776
Currently breaking google testing
parent ce508286
...@@ -75,8 +75,6 @@ class CupertinoSwitch extends StatefulWidget { ...@@ -75,8 +75,6 @@ class CupertinoSwitch extends StatefulWidget {
this.thumbColor, this.thumbColor,
this.applyTheme, this.applyTheme,
this.focusColor, this.focusColor,
this.onLabelColor,
this.offLabelColor,
this.focusNode, this.focusNode,
this.onFocusChange, this.onFocusChange,
this.autofocus = false, this.autofocus = false,
...@@ -135,17 +133,6 @@ class CupertinoSwitch extends StatefulWidget { ...@@ -135,17 +133,6 @@ class CupertinoSwitch extends StatefulWidget {
/// Defaults to a slightly transparent [activeColor]. /// Defaults to a slightly transparent [activeColor].
final Color? focusColor; final Color? focusColor;
/// The color to use for the accessibility label when the switch is on.
///
/// Defaults to [CupertinoColors.white] when null.
final Color? onLabelColor;
/// The color to use for the accessibility label when the switch is off.
///
/// Defaults to [Color.fromARGB(255, 179, 179, 179)]
/// (or [Color.fromARGB(255, 255, 255, 255)] in high contrast) when null.
final Color? offLabelColor;
/// {@macro flutter.widgets.Focus.focusNode} /// {@macro flutter.widgets.Focus.focusNode}
final FocusNode? focusNode; final FocusNode? focusNode;
...@@ -370,19 +357,6 @@ class _CupertinoSwitchState extends State<CupertinoSwitch> with TickerProviderSt ...@@ -370,19 +357,6 @@ class _CupertinoSwitchState extends State<CupertinoSwitch> with TickerProviderSt
?? CupertinoColors.systemGreen, ?? CupertinoColors.systemGreen,
context, context,
); );
final (Color onLabelColor, Color offLabelColor)? onOffLabelColors =
MediaQuery.onOffSwitchLabelsOf(context)
? (
CupertinoDynamicColor.resolve(
widget.onLabelColor ?? CupertinoColors.white,
context,
),
CupertinoDynamicColor.resolve(
widget.offLabelColor ?? _kOffLabelColor,
context,
),
)
: null;
if (needsPositionAnimation) { if (needsPositionAnimation) {
_resumePositionAnimation(); _resumePositionAnimation();
} }
...@@ -415,7 +389,6 @@ class _CupertinoSwitchState extends State<CupertinoSwitch> with TickerProviderSt ...@@ -415,7 +389,6 @@ class _CupertinoSwitchState extends State<CupertinoSwitch> with TickerProviderSt
textDirection: Directionality.of(context), textDirection: Directionality.of(context),
isFocused: isFocused, isFocused: isFocused,
state: this, state: this,
onOffLabelColors: onOffLabelColors,
), ),
), ),
), ),
...@@ -444,7 +417,6 @@ class _CupertinoSwitchRenderObjectWidget extends LeafRenderObjectWidget { ...@@ -444,7 +417,6 @@ class _CupertinoSwitchRenderObjectWidget extends LeafRenderObjectWidget {
required this.textDirection, required this.textDirection,
required this.isFocused, required this.isFocused,
required this.state, required this.state,
required this.onOffLabelColors,
}); });
final bool value; final bool value;
...@@ -456,7 +428,6 @@ class _CupertinoSwitchRenderObjectWidget extends LeafRenderObjectWidget { ...@@ -456,7 +428,6 @@ class _CupertinoSwitchRenderObjectWidget extends LeafRenderObjectWidget {
final _CupertinoSwitchState state; final _CupertinoSwitchState state;
final TextDirection textDirection; final TextDirection textDirection;
final bool isFocused; final bool isFocused;
final (Color onLabelColor, Color offLabelColor)? onOffLabelColors;
@override @override
_RenderCupertinoSwitch createRenderObject(BuildContext context) { _RenderCupertinoSwitch createRenderObject(BuildContext context) {
...@@ -470,7 +441,6 @@ class _CupertinoSwitchRenderObjectWidget extends LeafRenderObjectWidget { ...@@ -470,7 +441,6 @@ class _CupertinoSwitchRenderObjectWidget extends LeafRenderObjectWidget {
textDirection: textDirection, textDirection: textDirection,
isFocused: isFocused, isFocused: isFocused,
state: state, state: state,
onOffLabelColors: onOffLabelColors,
); );
} }
...@@ -497,24 +467,6 @@ const double _kTrackInnerEnd = _kTrackWidth - _kTrackInnerStart; ...@@ -497,24 +467,6 @@ const double _kTrackInnerEnd = _kTrackWidth - _kTrackInnerStart;
const double _kTrackInnerLength = _kTrackInnerEnd - _kTrackInnerStart; const double _kTrackInnerLength = _kTrackInnerEnd - _kTrackInnerStart;
const double _kSwitchWidth = 59.0; const double _kSwitchWidth = 59.0;
const double _kSwitchHeight = 39.0; const double _kSwitchHeight = 39.0;
// Label sizes and padding taken from xcode inspector.
// See https://github.com/flutter/flutter/issues/4830#issuecomment-528495360
const double _kOnLabelWidth = 1.0;
const double _kOnLabelHeight = 10.0;
const double _kOnLabelPaddingHorizontal = 11.0;
const double _kOffLabelWidth = 1.0;
const double _kOffLabelPaddingHorizontal = 12.0;
const double _kOffLabelRadius = 5.0;
const CupertinoDynamicColor _kOffLabelColor = CupertinoDynamicColor.withBrightnessAndContrast(
debugLabel: 'offSwitchLabel',
// Source: https://github.com/flutter/flutter/pull/39993#discussion_r321946033
color: Color.fromARGB(255, 179, 179, 179),
// Source: https://github.com/flutter/flutter/pull/39993#issuecomment-535196665
darkColor: Color.fromARGB(255, 179, 179, 179),
// Source: https://github.com/flutter/flutter/pull/127776#discussion_r1244208264
highContrastColor: Color.fromARGB(255, 255, 255, 255),
darkHighContrastColor: Color.fromARGB(255, 255, 255, 255),
);
// Opacity of a disabled switch, as eye-balled from iOS Simulator on Mac. // Opacity of a disabled switch, as eye-balled from iOS Simulator on Mac.
const double _kCupertinoSwitchDisabledOpacity = 0.5; const double _kCupertinoSwitchDisabledOpacity = 0.5;
...@@ -532,7 +484,6 @@ class _RenderCupertinoSwitch extends RenderConstrainedBox { ...@@ -532,7 +484,6 @@ class _RenderCupertinoSwitch extends RenderConstrainedBox {
required TextDirection textDirection, required TextDirection textDirection,
required bool isFocused, required bool isFocused,
required _CupertinoSwitchState state, required _CupertinoSwitchState state,
required (Color onLabelColor, Color offLabelColor)? onOffLabelColors,
}) : _value = value, }) : _value = value,
_activeColor = activeColor, _activeColor = activeColor,
_trackColor = trackColor, _trackColor = trackColor,
...@@ -542,7 +493,6 @@ class _RenderCupertinoSwitch extends RenderConstrainedBox { ...@@ -542,7 +493,6 @@ class _RenderCupertinoSwitch extends RenderConstrainedBox {
_textDirection = textDirection, _textDirection = textDirection,
_isFocused = isFocused, _isFocused = isFocused,
_state = state, _state = state,
_onOffLabelColors = onOffLabelColors,
super(additionalConstraints: const BoxConstraints.tightFor(width: _kSwitchWidth, height: _kSwitchHeight)) { super(additionalConstraints: const BoxConstraints.tightFor(width: _kSwitchWidth, height: _kSwitchHeight)) {
state.position.addListener(markNeedsPaint); state.position.addListener(markNeedsPaint);
state._reaction.addListener(markNeedsPaint); state._reaction.addListener(markNeedsPaint);
...@@ -634,16 +584,6 @@ class _RenderCupertinoSwitch extends RenderConstrainedBox { ...@@ -634,16 +584,6 @@ class _RenderCupertinoSwitch extends RenderConstrainedBox {
markNeedsPaint(); markNeedsPaint();
} }
(Color onLabelColor, Color offLabelColor)? get onOffLabelColors => _onOffLabelColors;
(Color onLabelColor, Color offLabelColor)? _onOffLabelColors;
set onOffLabelColors((Color onLabelColor, Color offLabelColor)? value) {
if (value == _onOffLabelColors) {
return;
}
_onOffLabelColors = value;
markNeedsPaint();
}
bool get isInteractive => onChanged != null; bool get isInteractive => onChanged != null;
@override @override
...@@ -709,52 +649,6 @@ class _RenderCupertinoSwitch extends RenderConstrainedBox { ...@@ -709,52 +649,6 @@ class _RenderCupertinoSwitch extends RenderConstrainedBox {
canvas.drawRRect(borderTrackRRect, borderPaint); canvas.drawRRect(borderTrackRRect, borderPaint);
} }
if (_onOffLabelColors != null) {
final (Color onLabelColor, Color offLabelColor) = onOffLabelColors!;
final double leftLabelOpacity = visualPosition * (1.0 - currentReactionValue);
final double rightLabelOpacity = (1.0 - visualPosition) * (1.0 - currentReactionValue);
final (double onLabelOpacity, double offLabelOpacity) =
switch (textDirection) {
TextDirection.ltr => (leftLabelOpacity, rightLabelOpacity),
TextDirection.rtl => (rightLabelOpacity, leftLabelOpacity),
};
final (Offset onLabelOffset, Offset offLabelOffset) =
switch (textDirection) {
TextDirection.ltr => (
trackRect.centerLeft.translate(_kOnLabelPaddingHorizontal, 0),
trackRect.centerRight.translate(-_kOffLabelPaddingHorizontal, 0),
),
TextDirection.rtl => (
trackRect.centerRight.translate(-_kOnLabelPaddingHorizontal, 0),
trackRect.centerLeft.translate(_kOffLabelPaddingHorizontal, 0),
),
};
// Draws '|' label
final Rect onLabelRect = Rect.fromCenter(
center: onLabelOffset,
width: _kOnLabelWidth,
height: _kOnLabelHeight,
);
final Paint onLabelPaint = Paint()
..color = onLabelColor.withOpacity(onLabelOpacity)
..style = PaintingStyle.fill;
canvas.drawRect(onLabelRect, onLabelPaint);
// Draws 'O' label
final Paint offLabelPaint = Paint()
..color = offLabelColor.withOpacity(offLabelOpacity)
..style = PaintingStyle.stroke
..strokeWidth = _kOffLabelWidth;
canvas.drawCircle(
offLabelOffset,
_kOffLabelRadius,
offLabelPaint,
);
}
final double currentThumbExtension = CupertinoThumbPainter.extension * currentReactionValue; final double currentThumbExtension = CupertinoThumbPainter.extension * currentReactionValue;
final double thumbLeft = lerpDouble( final double thumbLeft = lerpDouble(
trackRect.left + _kTrackInnerStart - CupertinoThumbPainter.radius, trackRect.left + _kTrackInnerStart - CupertinoThumbPainter.radius,
......
...@@ -60,8 +60,6 @@ enum _MediaQueryAspect { ...@@ -60,8 +60,6 @@ enum _MediaQueryAspect {
invertColors, invertColors,
/// Specifies the aspect corresponding to [MediaQueryData.highContrast]. /// Specifies the aspect corresponding to [MediaQueryData.highContrast].
highContrast, highContrast,
/// Specifies the aspect corresponding to [MediaQueryData.onOffSwitchLabels].
onOffSwitchLabels,
/// Specifies the aspect corresponding to [MediaQueryData.disableAnimations]. /// Specifies the aspect corresponding to [MediaQueryData.disableAnimations].
disableAnimations, disableAnimations,
/// Specifies the aspect corresponding to [MediaQueryData.boldText]. /// Specifies the aspect corresponding to [MediaQueryData.boldText].
...@@ -155,7 +153,6 @@ class MediaQueryData { ...@@ -155,7 +153,6 @@ class MediaQueryData {
this.accessibleNavigation = false, this.accessibleNavigation = false,
this.invertColors = false, this.invertColors = false,
this.highContrast = false, this.highContrast = false,
this.onOffSwitchLabels = false,
this.disableAnimations = false, this.disableAnimations = false,
this.boldText = false, this.boldText = false,
this.navigationMode = NavigationMode.traditional, this.navigationMode = NavigationMode.traditional,
...@@ -223,7 +220,6 @@ class MediaQueryData { ...@@ -223,7 +220,6 @@ class MediaQueryData {
disableAnimations = platformData?.disableAnimations ?? view.platformDispatcher.accessibilityFeatures.disableAnimations, disableAnimations = platformData?.disableAnimations ?? view.platformDispatcher.accessibilityFeatures.disableAnimations,
boldText = platformData?.boldText ?? view.platformDispatcher.accessibilityFeatures.boldText, boldText = platformData?.boldText ?? view.platformDispatcher.accessibilityFeatures.boldText,
highContrast = platformData?.highContrast ?? view.platformDispatcher.accessibilityFeatures.highContrast, highContrast = platformData?.highContrast ?? view.platformDispatcher.accessibilityFeatures.highContrast,
onOffSwitchLabels = platformData?.onOffSwitchLabels ?? view.platformDispatcher.accessibilityFeatures.onOffSwitchLabels,
alwaysUse24HourFormat = platformData?.alwaysUse24HourFormat ?? view.platformDispatcher.alwaysUse24HourFormat, alwaysUse24HourFormat = platformData?.alwaysUse24HourFormat ?? view.platformDispatcher.alwaysUse24HourFormat,
navigationMode = platformData?.navigationMode ?? NavigationMode.traditional, navigationMode = platformData?.navigationMode ?? NavigationMode.traditional,
gestureSettings = DeviceGestureSettings.fromView(view), gestureSettings = DeviceGestureSettings.fromView(view),
...@@ -420,15 +416,6 @@ class MediaQueryData { ...@@ -420,15 +416,6 @@ class MediaQueryData {
/// or above. /// or above.
final bool highContrast; final bool highContrast;
/// Whether the user requested to show on/off labels inside switches on iOS,
/// via Settings -> Accessibility -> Display & Text Size -> On/Off Labels.
///
/// See also:
///
/// * [dart:ui.PlatformDispatcher.accessibilityFeatures], where the setting
/// originates.
final bool onOffSwitchLabels;
/// Whether the platform is requesting that animations be disabled or reduced /// Whether the platform is requesting that animations be disabled or reduced
/// as much as possible. /// as much as possible.
/// ///
...@@ -501,7 +488,6 @@ class MediaQueryData { ...@@ -501,7 +488,6 @@ class MediaQueryData {
EdgeInsets? systemGestureInsets, EdgeInsets? systemGestureInsets,
bool? alwaysUse24HourFormat, bool? alwaysUse24HourFormat,
bool? highContrast, bool? highContrast,
bool? onOffSwitchLabels,
bool? disableAnimations, bool? disableAnimations,
bool? invertColors, bool? invertColors,
bool? accessibleNavigation, bool? accessibleNavigation,
...@@ -522,7 +508,6 @@ class MediaQueryData { ...@@ -522,7 +508,6 @@ class MediaQueryData {
alwaysUse24HourFormat: alwaysUse24HourFormat ?? this.alwaysUse24HourFormat, alwaysUse24HourFormat: alwaysUse24HourFormat ?? this.alwaysUse24HourFormat,
invertColors: invertColors ?? this.invertColors, invertColors: invertColors ?? this.invertColors,
highContrast: highContrast ?? this.highContrast, highContrast: highContrast ?? this.highContrast,
onOffSwitchLabels: onOffSwitchLabels ?? this.onOffSwitchLabels,
disableAnimations: disableAnimations ?? this.disableAnimations, disableAnimations: disableAnimations ?? this.disableAnimations,
accessibleNavigation: accessibleNavigation ?? this.accessibleNavigation, accessibleNavigation: accessibleNavigation ?? this.accessibleNavigation,
boldText: boldText ?? this.boldText, boldText: boldText ?? this.boldText,
...@@ -714,7 +699,6 @@ class MediaQueryData { ...@@ -714,7 +699,6 @@ class MediaQueryData {
&& other.systemGestureInsets == systemGestureInsets && other.systemGestureInsets == systemGestureInsets
&& other.alwaysUse24HourFormat == alwaysUse24HourFormat && other.alwaysUse24HourFormat == alwaysUse24HourFormat
&& other.highContrast == highContrast && other.highContrast == highContrast
&& other.onOffSwitchLabels == onOffSwitchLabels
&& other.disableAnimations == disableAnimations && other.disableAnimations == disableAnimations
&& other.invertColors == invertColors && other.invertColors == invertColors
&& other.accessibleNavigation == accessibleNavigation && other.accessibleNavigation == accessibleNavigation
...@@ -735,7 +719,6 @@ class MediaQueryData { ...@@ -735,7 +719,6 @@ class MediaQueryData {
viewInsets, viewInsets,
alwaysUse24HourFormat, alwaysUse24HourFormat,
highContrast, highContrast,
onOffSwitchLabels,
disableAnimations, disableAnimations,
invertColors, invertColors,
accessibleNavigation, accessibleNavigation,
...@@ -759,7 +742,6 @@ class MediaQueryData { ...@@ -759,7 +742,6 @@ class MediaQueryData {
'alwaysUse24HourFormat: $alwaysUse24HourFormat', 'alwaysUse24HourFormat: $alwaysUse24HourFormat',
'accessibleNavigation: $accessibleNavigation', 'accessibleNavigation: $accessibleNavigation',
'highContrast: $highContrast', 'highContrast: $highContrast',
'onOffSwitchLabels: $onOffSwitchLabels',
'disableAnimations: $disableAnimations', 'disableAnimations: $disableAnimations',
'invertColors: $invertColors', 'invertColors: $invertColors',
'boldText: $boldText', 'boldText: $boldText',
...@@ -1273,25 +1255,6 @@ class MediaQuery extends InheritedModel<_MediaQueryAspect> { ...@@ -1273,25 +1255,6 @@ class MediaQuery extends InheritedModel<_MediaQueryAspect> {
/// the [MediaQueryData.highContrast] property of the ancestor [MediaQuery] changes. /// the [MediaQueryData.highContrast] property of the ancestor [MediaQuery] changes.
static bool? maybeHighContrastOf(BuildContext context) => _maybeOf(context, _MediaQueryAspect.highContrast)?.highContrast; static bool? maybeHighContrastOf(BuildContext context) => _maybeOf(context, _MediaQueryAspect.highContrast)?.highContrast;
/// Returns onOffSwitchLabels for the nearest MediaQuery ancestor or false, if no
/// such ancestor exists.
///
/// See also:
///
/// * [MediaQueryData.onOffSwitchLabels], which indicates the platform's
/// desire to show on/off labels inside switches.
///
/// Use of this method will cause the given [context] to rebuild any time that
/// the [MediaQueryData.onOffSwitchLabels] property of the ancestor [MediaQuery] changes.
static bool onOffSwitchLabelsOf(BuildContext context) => maybeOnOffSwitchLabelsOf(context) ?? false;
/// Returns onOffSwitchLabels for the nearest MediaQuery ancestor or
/// null, if no such ancestor exists.
///
/// Use of this method will cause the given [context] to rebuild any time that
/// the [MediaQueryData.onOffSwitchLabels] property of the ancestor [MediaQuery] changes.
static bool? maybeOnOffSwitchLabelsOf(BuildContext context) => _maybeOf(context, _MediaQueryAspect.onOffSwitchLabels)?.onOffSwitchLabels;
/// Returns disableAnimations for the nearest MediaQuery ancestor or /// Returns disableAnimations for the nearest MediaQuery ancestor or
/// [Brightness.light], if no such ancestor exists. /// [Brightness.light], if no such ancestor exists.
/// ///
...@@ -1443,10 +1406,6 @@ class MediaQuery extends InheritedModel<_MediaQueryAspect> { ...@@ -1443,10 +1406,6 @@ class MediaQuery extends InheritedModel<_MediaQueryAspect> {
if (data.highContrast != oldWidget.data.highContrast) { if (data.highContrast != oldWidget.data.highContrast) {
return true; return true;
} }
case _MediaQueryAspect.onOffSwitchLabels:
if (data.onOffSwitchLabels != oldWidget.data.onOffSwitchLabels) {
return true;
}
case _MediaQueryAspect.disableAnimations: case _MediaQueryAspect.disableAnimations:
if (data.disableAnimations != oldWidget.data.disableAnimations) { if (data.disableAnimations != oldWidget.data.disableAnimations) {
return true; return true;
......
...@@ -753,187 +753,6 @@ void main() { ...@@ -753,187 +753,6 @@ void main() {
); );
}); });
PaintPattern onLabelPaintPattern({
required int alpha,
bool isRtl = false,
}) =>
paints
..rect(
rect: Rect.fromLTWH(isRtl ? 43.5 : 14.5, 14.5, 1.0, 10.0),
color: const Color(0xffffffff).withAlpha(alpha),
style: PaintingStyle.fill,
);
PaintPattern offLabelPaintPattern({
required int alpha,
bool highContrast = false,
bool isRtl = false,
}) =>
paints
..circle(
x: isRtl ? 16.0 : 43.0,
y: 19.5,
radius: 5.0,
color:
(highContrast ? const Color(0xffffffff) : const Color(0xffb3b3b3))
.withAlpha(alpha),
strokeWidth: 1.0,
style: PaintingStyle.stroke,
);
testWidgets('Switch renders switch labels correctly before, during, and after being tapped', (WidgetTester tester) async {
final Key switchKey = UniqueKey();
bool value = false;
await tester.pumpWidget(
MediaQuery(
data: const MediaQueryData(onOffSwitchLabels: true),
child: Directionality(
textDirection: TextDirection.ltr,
child: StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
return Center(
child: RepaintBoundary(
child: CupertinoSwitch(
key: switchKey,
value: value,
dragStartBehavior: DragStartBehavior.down,
onChanged: (bool newValue) {
setState(() {
value = newValue;
});
},
),
),
);
},
),
),
),
);
final RenderObject switchRenderObject =
tester.element(find.byType(CupertinoSwitch)).renderObject!;
expect(switchRenderObject, offLabelPaintPattern(alpha: 255));
expect(switchRenderObject, onLabelPaintPattern(alpha: 0));
await tester.tap(find.byKey(switchKey));
expect(value, isTrue);
// Kick off animation, then advance to intermediate frame.
await tester.pump();
await tester.pump(const Duration(milliseconds: 60));
expect(switchRenderObject, onLabelPaintPattern(alpha: 131));
expect(switchRenderObject, offLabelPaintPattern(alpha: 124));
await tester.pumpAndSettle();
expect(switchRenderObject, onLabelPaintPattern(alpha: 255));
expect(switchRenderObject, offLabelPaintPattern(alpha: 0));
});
testWidgets('Switch renders switch labels correctly before, during, and after being tapped in high contrast', (WidgetTester tester) async {
final Key switchKey = UniqueKey();
bool value = false;
await tester.pumpWidget(
MediaQuery(
data: const MediaQueryData(
onOffSwitchLabels: true,
highContrast: true,
),
child: Directionality(
textDirection: TextDirection.ltr,
child: StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
return Center(
child: RepaintBoundary(
child: CupertinoSwitch(
key: switchKey,
value: value,
dragStartBehavior: DragStartBehavior.down,
onChanged: (bool newValue) {
setState(() {
value = newValue;
});
},
),
),
);
},
),
),
),
);
final RenderObject switchRenderObject =
tester.element(find.byType(CupertinoSwitch)).renderObject!;
expect(switchRenderObject, offLabelPaintPattern(highContrast: true, alpha: 255));
expect(switchRenderObject, onLabelPaintPattern(alpha: 0));
await tester.tap(find.byKey(switchKey));
expect(value, isTrue);
// Kick off animation, then advance to intermediate frame.
await tester.pump();
await tester.pump(const Duration(milliseconds: 60));
expect(switchRenderObject, onLabelPaintPattern(alpha: 131));
expect(switchRenderObject, offLabelPaintPattern(highContrast: true, alpha: 124));
await tester.pumpAndSettle();
expect(switchRenderObject, onLabelPaintPattern(alpha: 255));
expect(switchRenderObject, offLabelPaintPattern(highContrast: true, alpha: 0));
});
testWidgets('Switch renders switch labels correctly before, during, and after being tapped with direction rtl', (WidgetTester tester) async {
final Key switchKey = UniqueKey();
bool value = false;
await tester.pumpWidget(
MediaQuery(
data: const MediaQueryData(onOffSwitchLabels: true),
child: Directionality(
textDirection: TextDirection.rtl,
child: StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
return Center(
child: RepaintBoundary(
child: CupertinoSwitch(
key: switchKey,
value: value,
dragStartBehavior: DragStartBehavior.down,
onChanged: (bool newValue) {
setState(() {
value = newValue;
});
},
),
),
);
},
),
),
),
);
final RenderObject switchRenderObject =
tester.element(find.byType(CupertinoSwitch)).renderObject!;
expect(switchRenderObject, offLabelPaintPattern(isRtl: true, alpha: 255));
expect(switchRenderObject, onLabelPaintPattern(isRtl: true, alpha: 0));
await tester.tap(find.byKey(switchKey));
expect(value, isTrue);
// Kick off animation, then advance to intermediate frame.
await tester.pump();
await tester.pump(const Duration(milliseconds: 60));
expect(switchRenderObject, onLabelPaintPattern(isRtl: true, alpha: 131));
expect(switchRenderObject, offLabelPaintPattern(isRtl: true, alpha: 124));
await tester.pumpAndSettle();
expect(switchRenderObject, onLabelPaintPattern(isRtl: true, alpha: 255));
expect(switchRenderObject, offLabelPaintPattern(isRtl: true, alpha: 0));
});
testWidgets('Switch renders correctly in dark mode', (WidgetTester tester) async { testWidgets('Switch renders correctly in dark mode', (WidgetTester tester) async {
final Key switchKey = UniqueKey(); final Key switchKey = UniqueKey();
bool value = false; bool value = false;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment