Unverified Commit 9249dcc2 authored by Qun Cheng's avatar Qun Cheng Committed by GitHub

Update `SwitchTheme` tests for M2/M3 (#129811)

parent 67b7aa22
...@@ -86,7 +86,7 @@ void main() { ...@@ -86,7 +86,7 @@ void main() {
expect(description[8], 'thumbIcon: MaterialStatePropertyAll(Icon(IconData(U+0007B)))'); expect(description[8], 'thumbIcon: MaterialStatePropertyAll(Icon(IconData(U+0007B)))');
}); });
testWidgets('Switch is themeable', (WidgetTester tester) async { testWidgets('Material2 - Switch is themeable', (WidgetTester tester) async {
tester.binding.focusManager.highlightStrategy = FocusHighlightStrategy.alwaysTraditional; tester.binding.focusManager.highlightStrategy = FocusHighlightStrategy.alwaysTraditional;
const Color defaultThumbColor = Color(0xfffffff0); const Color defaultThumbColor = Color(0xfffffff0);
...@@ -106,6 +106,7 @@ void main() { ...@@ -106,6 +106,7 @@ void main() {
const Icon icon2 = Icon(Icons.close); const Icon icon2 = Icon(Icons.close);
final ThemeData themeData = ThemeData( final ThemeData themeData = ThemeData(
useMaterial3: false,
switchTheme: SwitchThemeData( switchTheme: SwitchThemeData(
thumbColor: MaterialStateProperty.resolveWith((Set<MaterialState> states) { thumbColor: MaterialStateProperty.resolveWith((Set<MaterialState> states) {
if (states.contains(MaterialState.selected)) { if (states.contains(MaterialState.selected)) {
...@@ -151,7 +152,6 @@ void main() { ...@@ -151,7 +152,6 @@ void main() {
}), }),
), ),
); );
final bool material3 = themeData.useMaterial3;
Widget buildSwitch({bool selected = false, bool autofocus = false}) { Widget buildSwitch({bool selected = false, bool autofocus = false}) {
return MaterialApp( return MaterialApp(
theme: themeData, theme: themeData,
...@@ -171,42 +171,147 @@ void main() { ...@@ -171,42 +171,147 @@ void main() {
await tester.pumpAndSettle(); await tester.pumpAndSettle();
expect( expect(
_getSwitchMaterial(tester), _getSwitchMaterial(tester),
material3 paints
? (paints
..rrect(color: defaultTrackColor)
..rrect(color: defaultTrackOutlineColor, strokeWidth: defaultTrackOutlineWidth)
..rrect(color: defaultThumbColor)
..paragraph()
)
: (paints
..rrect(color: defaultTrackColor) ..rrect(color: defaultTrackColor)
..rrect(color: defaultTrackOutlineColor, strokeWidth: defaultTrackOutlineWidth) ..rrect(color: defaultTrackOutlineColor, strokeWidth: defaultTrackOutlineWidth)
..rrect() ..rrect()
..rrect() ..rrect()
..rrect() ..rrect()
..rrect(color: defaultThumbColor) ..rrect(color: defaultThumbColor)
)
); );
// Size from MaterialTapTargetSize.shrinkWrap. // Size from MaterialTapTargetSize.shrinkWrap.
expect(tester.getSize(find.byType(Switch)), material3 ? const Size(60.0, 40.0) : const Size(59.0, 40.0)); expect(tester.getSize(find.byType(Switch)), const Size(59.0, 40.0));
// Selected switch. // Selected switch.
await tester.pumpWidget(buildSwitch(selected: true)); await tester.pumpWidget(buildSwitch(selected: true));
await tester.pumpAndSettle(); await tester.pumpAndSettle();
expect( expect(
_getSwitchMaterial(tester), _getSwitchMaterial(tester),
material3 paints
? (paints
..rrect(color: selectedTrackColor)
..rrect(color: selectedTrackOutlineColor, strokeWidth: selectedTrackOutlineWidth)
..rrect(color: selectedThumbColor)..paragraph())
: (paints
..rrect(color: selectedTrackColor) ..rrect(color: selectedTrackColor)
..rrect(color: selectedTrackOutlineColor, strokeWidth: selectedTrackOutlineWidth) ..rrect(color: selectedTrackOutlineColor, strokeWidth: selectedTrackOutlineWidth)
..rrect() ..rrect()
..rrect() ..rrect()
..rrect() ..rrect()
..rrect(color: selectedThumbColor)) ..rrect(color: selectedThumbColor)
);
// Switch with hover.
await tester.pumpWidget(buildSwitch());
await _pointGestureToSwitch(tester);
await tester.pumpAndSettle();
expect(RendererBinding.instance.mouseTracker.debugDeviceActiveCursor(1), SystemMouseCursors.text);
expect(_getSwitchMaterial(tester), paints..circle(color: hoverOverlayColor));
// Switch with focus.
await tester.pumpWidget(buildSwitch(autofocus: true));
await tester.pumpAndSettle();
expect(_getSwitchMaterial(tester), paints..circle(color: focusOverlayColor, radius: splashRadius));
});
testWidgets('Material3 - Switch is themeable', (WidgetTester tester) async {
tester.binding.focusManager.highlightStrategy = FocusHighlightStrategy.alwaysTraditional;
const Color defaultThumbColor = Color(0xfffffff0);
const Color selectedThumbColor = Color(0xfffffff1);
const Color defaultTrackColor = Color(0xfffffff2);
const Color selectedTrackColor = Color(0xfffffff3);
const Color defaultTrackOutlineColor = Color(0xfffffff4);
const Color selectedTrackOutlineColor = Color(0xfffffff5);
const double defaultTrackOutlineWidth = 3.0;
const double selectedTrackOutlineWidth = 6.0;
const MouseCursor mouseCursor = SystemMouseCursors.text;
const MaterialTapTargetSize materialTapTargetSize = MaterialTapTargetSize.shrinkWrap;
const Color focusOverlayColor = Color(0xfffffff4);
const Color hoverOverlayColor = Color(0xfffffff5);
const double splashRadius = 1.0;
const Icon icon1 = Icon(Icons.check);
const Icon icon2 = Icon(Icons.close);
final ThemeData themeData = ThemeData(
useMaterial3: true,
switchTheme: SwitchThemeData(
thumbColor: MaterialStateProperty.resolveWith((Set<MaterialState> states) {
if (states.contains(MaterialState.selected)) {
return selectedThumbColor;
}
return defaultThumbColor;
}),
trackColor: MaterialStateProperty.resolveWith((Set<MaterialState> states) {
if (states.contains(MaterialState.selected)) {
return selectedTrackColor;
}
return defaultTrackColor;
}),
trackOutlineColor: MaterialStateProperty.resolveWith((Set<MaterialState> states) {
if (states.contains(MaterialState.selected)) {
return selectedTrackOutlineColor;
}
return defaultTrackOutlineColor;
}),
trackOutlineWidth: MaterialStateProperty.resolveWith((Set<MaterialState> states) {
if (states.contains(MaterialState.selected)) {
return selectedTrackOutlineWidth;
}
return defaultTrackOutlineWidth;
}),
mouseCursor: const MaterialStatePropertyAll<MouseCursor>(mouseCursor),
materialTapTargetSize: materialTapTargetSize,
overlayColor: MaterialStateProperty.resolveWith((Set<MaterialState> states) {
if (states.contains(MaterialState.focused)) {
return focusOverlayColor;
}
if (states.contains(MaterialState.hovered)) {
return hoverOverlayColor;
}
return null;
}),
splashRadius: splashRadius,
thumbIcon: MaterialStateProperty.resolveWith((Set<MaterialState> states) {
if (states.contains(MaterialState.selected)) {
return icon1;
}
return icon2;
}),
),
);
Widget buildSwitch({bool selected = false, bool autofocus = false}) {
return MaterialApp(
theme: themeData,
home: Scaffold(
body: Switch(
dragStartBehavior: DragStartBehavior.down,
value: selected,
onChanged: (bool value) {},
autofocus: autofocus,
),
),
);
}
// Switch.
await tester.pumpWidget(buildSwitch());
await tester.pumpAndSettle();
expect(
_getSwitchMaterial(tester),
paints
..rrect(color: defaultTrackColor)
..rrect(color: defaultTrackOutlineColor, strokeWidth: defaultTrackOutlineWidth)
..rrect(color: defaultThumbColor)
..paragraph()
);
// Size from MaterialTapTargetSize.shrinkWrap.
expect(tester.getSize(find.byType(Switch)), const Size(60.0, 40.0));
// Selected switch.
await tester.pumpWidget(buildSwitch(selected: true));
await tester.pumpAndSettle();
expect(
_getSwitchMaterial(tester),
paints
..rrect(color: selectedTrackColor)
..rrect(color: selectedTrackOutlineColor, strokeWidth: selectedTrackOutlineWidth)
..rrect(color: selectedThumbColor)..paragraph()
); );
// Switch with hover. // Switch with hover.
...@@ -222,7 +327,7 @@ void main() { ...@@ -222,7 +327,7 @@ void main() {
expect(_getSwitchMaterial(tester), paints..circle(color: focusOverlayColor, radius: splashRadius)); expect(_getSwitchMaterial(tester), paints..circle(color: focusOverlayColor, radius: splashRadius));
}); });
testWidgets('Switch properties are taken over the theme values', (WidgetTester tester) async { testWidgets('Material2 - Switch properties are taken over the theme values', (WidgetTester tester) async {
tester.binding.focusManager.highlightStrategy = FocusHighlightStrategy.alwaysTraditional; tester.binding.focusManager.highlightStrategy = FocusHighlightStrategy.alwaysTraditional;
const Color themeDefaultThumbColor = Color(0xfffffff0); const Color themeDefaultThumbColor = Color(0xfffffff0);
...@@ -254,6 +359,7 @@ void main() { ...@@ -254,6 +359,7 @@ void main() {
const double splashRadius = 2.0; const double splashRadius = 2.0;
final ThemeData themeData = ThemeData( final ThemeData themeData = ThemeData(
useMaterial3: false,
switchTheme: SwitchThemeData( switchTheme: SwitchThemeData(
thumbColor: MaterialStateProperty.resolveWith((Set<MaterialState> states) { thumbColor: MaterialStateProperty.resolveWith((Set<MaterialState> states) {
if (states.contains(MaterialState.selected)) { if (states.contains(MaterialState.selected)) {
...@@ -299,7 +405,6 @@ void main() { ...@@ -299,7 +405,6 @@ void main() {
}), }),
), ),
); );
final bool material3 = themeData.useMaterial3;
Widget buildSwitch({bool selected = false, bool autofocus = false}) { Widget buildSwitch({bool selected = false, bool autofocus = false}) {
return MaterialApp( return MaterialApp(
...@@ -354,38 +459,192 @@ void main() { ...@@ -354,38 +459,192 @@ void main() {
await tester.pumpAndSettle(); await tester.pumpAndSettle();
expect( expect(
_getSwitchMaterial(tester), _getSwitchMaterial(tester),
material3 paints
? (paints
..rrect(color: defaultTrackColor)
..rrect(color: defaultOutlineColor, strokeWidth: defaultOutlineWidth)
..rrect(color: defaultThumbColor)..paragraph(offset: const Offset(12, 12)))
: (paints
..rrect(color: defaultTrackColor) ..rrect(color: defaultTrackColor)
..rrect(color: defaultOutlineColor, strokeWidth: defaultOutlineWidth) ..rrect(color: defaultOutlineColor, strokeWidth: defaultOutlineWidth)
..rrect() ..rrect()
..rrect() ..rrect()
..rrect() ..rrect()
..rrect(color: defaultThumbColor)) ..rrect(color: defaultThumbColor)
); );
// Size from MaterialTapTargetSize.shrinkWrap. // Size from MaterialTapTargetSize.shrinkWrap.
expect(tester.getSize(find.byType(Switch)), material3 ? const Size(60.0, 40.0) : const Size(59.0, 40.0)); expect(tester.getSize(find.byType(Switch)), const Size(59.0, 40.0));
// Selected switch. // Selected switch.
await tester.pumpWidget(buildSwitch(selected: true)); await tester.pumpWidget(buildSwitch(selected: true));
await tester.pumpAndSettle(); await tester.pumpAndSettle();
expect( expect(
_getSwitchMaterial(tester), _getSwitchMaterial(tester),
material3 paints
? (paints
..rrect(color: selectedTrackColor)..rrect(color: selectedOutlineColor, strokeWidth: selectedOutlineWidth)
..rrect(color: selectedThumbColor))
: (paints
..rrect(color: selectedTrackColor) ..rrect(color: selectedTrackColor)
..rrect(color: selectedOutlineColor, strokeWidth: selectedOutlineWidth) ..rrect(color: selectedOutlineColor, strokeWidth: selectedOutlineWidth)
..rrect() ..rrect()
..rrect() ..rrect()
..rrect() ..rrect()
..rrect(color: selectedThumbColor)) ..rrect(color: selectedThumbColor)
);
// Switch with hover.
await tester.pumpWidget(buildSwitch());
await _pointGestureToSwitch(tester);
await tester.pumpAndSettle();
expect(RendererBinding.instance.mouseTracker.debugDeviceActiveCursor(1), SystemMouseCursors.text);
expect(_getSwitchMaterial(tester), paints..circle(color: hoverColor));
// Switch with focus.
await tester.pumpWidget(buildSwitch(autofocus: true));
await tester.pumpAndSettle();
expect(_getSwitchMaterial(tester), paints..circle(color: focusColor, radius: splashRadius));
});
testWidgets('Material3 - Switch properties are taken over the theme values', (WidgetTester tester) async {
tester.binding.focusManager.highlightStrategy = FocusHighlightStrategy.alwaysTraditional;
const Color themeDefaultThumbColor = Color(0xfffffff0);
const Color themeSelectedThumbColor = Color(0xfffffff1);
const Color themeDefaultTrackColor = Color(0xfffffff2);
const Color themeSelectedTrackColor = Color(0xfffffff3);
const Color themeDefaultOutlineColor = Color(0xfffffff6);
const Color themeSelectedOutlineColor = Color(0xfffffff7);
const double themeDefaultOutlineWidth = 5.0;
const double themeSelectedOutlineWidth = 7.0;
const MouseCursor themeMouseCursor = SystemMouseCursors.click;
const MaterialTapTargetSize themeMaterialTapTargetSize = MaterialTapTargetSize.padded;
const Color themeFocusOverlayColor = Color(0xfffffff4);
const Color themeHoverOverlayColor = Color(0xfffffff5);
const double themeSplashRadius = 1.0;
const Color defaultThumbColor = Color(0xffffff0f);
const Color selectedThumbColor = Color(0xffffff1f);
const Color defaultTrackColor = Color(0xffffff2f);
const Color selectedTrackColor = Color(0xffffff3f);
const Color defaultOutlineColor = Color(0xffffff6f);
const Color selectedOutlineColor = Color(0xffffff7f);
const double defaultOutlineWidth = 6.0;
const double selectedOutlineWidth = 8.0;
const MouseCursor mouseCursor = SystemMouseCursors.text;
const MaterialTapTargetSize materialTapTargetSize = MaterialTapTargetSize.shrinkWrap;
const Color focusColor = Color(0xffffff4f);
const Color hoverColor = Color(0xffffff5f);
const double splashRadius = 2.0;
final ThemeData themeData = ThemeData(
useMaterial3: true,
switchTheme: SwitchThemeData(
thumbColor: MaterialStateProperty.resolveWith((Set<MaterialState> states) {
if (states.contains(MaterialState.selected)) {
return themeSelectedThumbColor;
}
return themeDefaultThumbColor;
}),
trackColor: MaterialStateProperty.resolveWith((Set<MaterialState> states) {
if (states.contains(MaterialState.selected)) {
return themeSelectedTrackColor;
}
return themeDefaultTrackColor;
}),
trackOutlineColor: MaterialStateProperty.resolveWith((Set<MaterialState> states) {
if (states.contains(MaterialState.selected)) {
return themeSelectedOutlineColor;
}
return themeDefaultOutlineColor;
}),
trackOutlineWidth: MaterialStateProperty.resolveWith((Set<MaterialState> states) {
if (states.contains(MaterialState.selected)) {
return themeSelectedOutlineWidth;
}
return themeDefaultOutlineWidth;
}),
mouseCursor: const MaterialStatePropertyAll<MouseCursor>(themeMouseCursor),
materialTapTargetSize: themeMaterialTapTargetSize,
overlayColor: MaterialStateProperty.resolveWith((Set<MaterialState> states) {
if (states.contains(MaterialState.focused)) {
return themeFocusOverlayColor;
}
if (states.contains(MaterialState.hovered)) {
return themeHoverOverlayColor;
}
return null;
}),
splashRadius: themeSplashRadius,
thumbIcon: MaterialStateProperty.resolveWith((Set<MaterialState> states) {
if (states.contains(MaterialState.selected)) {
return null;
}
return null;
}),
),
);
Widget buildSwitch({bool selected = false, bool autofocus = false}) {
return MaterialApp(
theme: themeData,
home: Scaffold(
body: Switch(
value: selected,
onChanged: (bool value) {},
autofocus: autofocus,
thumbColor: MaterialStateProperty.resolveWith((Set<MaterialState> states) {
if (states.contains(MaterialState.selected)) {
return selectedThumbColor;
}
return defaultThumbColor;
}),
trackColor: MaterialStateProperty.resolveWith((Set<MaterialState> states) {
if (states.contains(MaterialState.selected)) {
return selectedTrackColor;
}
return defaultTrackColor;
}),
trackOutlineColor: MaterialStateProperty.resolveWith((Set<MaterialState> states) {
if (states.contains(MaterialState.selected)) {
return selectedOutlineColor;
}
return defaultOutlineColor;
}),
trackOutlineWidth: MaterialStateProperty.resolveWith((Set<MaterialState> states) {
if (states.contains(MaterialState.selected)) {
return selectedOutlineWidth;
}
return defaultOutlineWidth;
}),
mouseCursor: mouseCursor,
materialTapTargetSize: materialTapTargetSize,
focusColor: focusColor,
hoverColor: hoverColor,
splashRadius: splashRadius,
thumbIcon: MaterialStateProperty.resolveWith((Set<MaterialState> states) {
if (states.contains(MaterialState.selected)) {
return const Icon(Icons.add);
}
return const Icon(Icons.access_alarm);
}),
),
),
);
}
// Switch.
await tester.pumpWidget(buildSwitch());
await tester.pumpAndSettle();
expect(
_getSwitchMaterial(tester),
paints
..rrect(color: defaultTrackColor)
..rrect(color: defaultOutlineColor, strokeWidth: defaultOutlineWidth)
..rrect(color: defaultThumbColor)..paragraph(offset: const Offset(12, 12))
);
// Size from MaterialTapTargetSize.shrinkWrap.
expect(tester.getSize(find.byType(Switch)), const Size(60.0, 40.0));
// Selected switch.
await tester.pumpWidget(buildSwitch(selected: true));
await tester.pumpAndSettle();
expect(
_getSwitchMaterial(tester),
paints
..rrect(color: selectedTrackColor)..rrect(color: selectedOutlineColor, strokeWidth: selectedOutlineWidth)
..rrect(color: selectedThumbColor)
); );
// Switch with hover. // Switch with hover.
...@@ -401,7 +660,7 @@ void main() { ...@@ -401,7 +660,7 @@ void main() {
expect(_getSwitchMaterial(tester), paints..circle(color: focusColor, radius: splashRadius)); expect(_getSwitchMaterial(tester), paints..circle(color: focusColor, radius: splashRadius));
}); });
testWidgets('Switch active and inactive properties are taken over the theme values', (WidgetTester tester) async { testWidgets('Material2 - Switch active and inactive properties are taken over the theme values', (WidgetTester tester) async {
tester.binding.focusManager.highlightStrategy = FocusHighlightStrategy.alwaysTraditional; tester.binding.focusManager.highlightStrategy = FocusHighlightStrategy.alwaysTraditional;
const Color themeDefaultThumbColor = Color(0xfffffff0); const Color themeDefaultThumbColor = Color(0xfffffff0);
...@@ -415,6 +674,7 @@ void main() { ...@@ -415,6 +674,7 @@ void main() {
const Color selectedTrackColor = Color(0xffffff3f); const Color selectedTrackColor = Color(0xffffff3f);
final ThemeData themeData = ThemeData( final ThemeData themeData = ThemeData(
useMaterial3: false,
switchTheme: SwitchThemeData( switchTheme: SwitchThemeData(
thumbColor: MaterialStateProperty.resolveWith((Set<MaterialState> states) { thumbColor: MaterialStateProperty.resolveWith((Set<MaterialState> states) {
if (states.contains(MaterialState.selected)) { if (states.contains(MaterialState.selected)) {
...@@ -430,7 +690,6 @@ void main() { ...@@ -430,7 +690,6 @@ void main() {
}), }),
), ),
); );
final bool material3 = themeData.useMaterial3;
Widget buildSwitch({bool selected = false, bool autofocus = false}) { Widget buildSwitch({bool selected = false, bool autofocus = false}) {
return MaterialApp( return MaterialApp(
...@@ -454,17 +713,12 @@ void main() { ...@@ -454,17 +713,12 @@ void main() {
await tester.pumpAndSettle(); await tester.pumpAndSettle();
expect( expect(
_getSwitchMaterial(tester), _getSwitchMaterial(tester),
material3 paints
? (paints
..rrect(color: defaultTrackColor)
..rrect(color: themeData.colorScheme.outline)
..rrect(color: defaultThumbColor))
: (paints
..rrect(color: defaultTrackColor) ..rrect(color: defaultTrackColor)
..rrect() ..rrect()
..rrect() ..rrect()
..rrect() ..rrect()
..rrect(color: defaultThumbColor)) ..rrect(color: defaultThumbColor)
); );
// Selected switch. // Selected switch.
...@@ -472,21 +726,87 @@ void main() { ...@@ -472,21 +726,87 @@ void main() {
await tester.pumpAndSettle(); await tester.pumpAndSettle();
expect( expect(
_getSwitchMaterial(tester), _getSwitchMaterial(tester),
material3 paints
? (paints
..rrect(color: selectedTrackColor) ..rrect(color: selectedTrackColor)
..rrect() ..rrect()
..rrect(color: selectedThumbColor))
: (paints
..rrect(color: selectedTrackColor)
..rrect() ..rrect()
..rrect() ..rrect()
..rrect(color: selectedThumbColor)
);
});
testWidgets('Material3 - Switch active and inactive properties are taken over the theme values', (WidgetTester tester) async {
tester.binding.focusManager.highlightStrategy = FocusHighlightStrategy.alwaysTraditional;
const Color themeDefaultThumbColor = Color(0xfffffff0);
const Color themeSelectedThumbColor = Color(0xfffffff1);
const Color themeDefaultTrackColor = Color(0xfffffff2);
const Color themeSelectedTrackColor = Color(0xfffffff3);
const Color defaultThumbColor = Color(0xffffff0f);
const Color selectedThumbColor = Color(0xffffff1f);
const Color defaultTrackColor = Color(0xffffff2f);
const Color selectedTrackColor = Color(0xffffff3f);
final ThemeData themeData = ThemeData(
useMaterial3: true,
switchTheme: SwitchThemeData(
thumbColor: MaterialStateProperty.resolveWith((Set<MaterialState> states) {
if (states.contains(MaterialState.selected)) {
return themeSelectedThumbColor;
}
return themeDefaultThumbColor;
}),
trackColor: MaterialStateProperty.resolveWith((Set<MaterialState> states) {
if (states.contains(MaterialState.selected)) {
return themeSelectedTrackColor;
}
return themeDefaultTrackColor;
}),
),
);
Widget buildSwitch({bool selected = false, bool autofocus = false}) {
return MaterialApp(
theme: themeData,
home: Scaffold(
body: Switch(
value: selected,
onChanged: (bool value) {},
autofocus: autofocus,
activeColor: selectedThumbColor,
inactiveThumbColor: defaultThumbColor,
activeTrackColor: selectedTrackColor,
inactiveTrackColor: defaultTrackColor,
),
),
);
}
// Unselected switch.
await tester.pumpWidget(buildSwitch());
await tester.pumpAndSettle();
expect(
_getSwitchMaterial(tester),
paints
..rrect(color: defaultTrackColor)
..rrect(color: themeData.colorScheme.outline)
..rrect(color: defaultThumbColor)
);
// Selected switch.
await tester.pumpWidget(buildSwitch(selected: true));
await tester.pumpAndSettle();
expect(
_getSwitchMaterial(tester),
paints
..rrect(color: selectedTrackColor)
..rrect() ..rrect()
..rrect(color: selectedThumbColor)) ..rrect(color: selectedThumbColor)
); );
}); });
testWidgets('Switch theme overlay color resolves in active/pressed states', (WidgetTester tester) async { testWidgets('Material2 - Switch theme overlay color resolves in active/pressed states', (WidgetTester tester) async {
const Color activePressedOverlayColor = Color(0xFF000001); const Color activePressedOverlayColor = Color(0xFF000001);
const Color inactivePressedOverlayColor = Color(0xFF000002); const Color inactivePressedOverlayColor = Color(0xFF000002);
...@@ -501,12 +821,12 @@ void main() { ...@@ -501,12 +821,12 @@ void main() {
} }
const double splashRadius = 24.0; const double splashRadius = 24.0;
final ThemeData themeData = ThemeData( final ThemeData themeData = ThemeData(
useMaterial3: false,
switchTheme: SwitchThemeData( switchTheme: SwitchThemeData(
overlayColor: MaterialStateProperty.resolveWith(getOverlayColor), overlayColor: MaterialStateProperty.resolveWith(getOverlayColor),
splashRadius: splashRadius, splashRadius: splashRadius,
), ),
); );
final bool material3 = themeData.useMaterial3;
Widget buildSwitch({required bool active}) { Widget buildSwitch({required bool active}) {
return MaterialApp( return MaterialApp(
...@@ -526,20 +846,78 @@ void main() { ...@@ -526,20 +846,78 @@ void main() {
expect( expect(
_getSwitchMaterial(tester), _getSwitchMaterial(tester),
material3 paints
? ((paints
..rrect() ..rrect()
..rrect())
..circle( ..circle(
color: inactivePressedOverlayColor, color: inactivePressedOverlayColor,
radius: splashRadius, radius: splashRadius,
)) ),
: (paints reason: 'Inactive pressed Switch should have overlay color: $inactivePressedOverlayColor',
);
await tester.pumpWidget(buildSwitch(active: true));
await tester.press(find.byType(Switch));
await tester.pumpAndSettle();
expect(
_getSwitchMaterial(tester),
paints
..rrect()
..circle(
color: activePressedOverlayColor,
radius: splashRadius,
),
reason: 'Active pressed Switch should have overlay color: $activePressedOverlayColor',
);
});
testWidgets('Material3 - Switch theme overlay color resolves in active/pressed states', (WidgetTester tester) async {
const Color activePressedOverlayColor = Color(0xFF000001);
const Color inactivePressedOverlayColor = Color(0xFF000002);
Color? getOverlayColor(Set<MaterialState> states) {
if (states.contains(MaterialState.pressed)) {
if (states.contains(MaterialState.selected)) {
return activePressedOverlayColor;
}
return inactivePressedOverlayColor;
}
return null;
}
const double splashRadius = 24.0;
final ThemeData themeData = ThemeData(
useMaterial3: true,
switchTheme: SwitchThemeData(
overlayColor: MaterialStateProperty.resolveWith(getOverlayColor),
splashRadius: splashRadius,
),
);
Widget buildSwitch({required bool active}) {
return MaterialApp(
theme: themeData,
home: Scaffold(
body: Switch(
value: active,
onChanged: (_) { },
),
),
);
}
await tester.pumpWidget(buildSwitch(active: false));
await tester.press(find.byType(Switch));
await tester.pumpAndSettle();
expect(
_getSwitchMaterial(tester),
(paints
..rrect() ..rrect()
..rrect())
..circle( ..circle(
color: inactivePressedOverlayColor, color: inactivePressedOverlayColor,
radius: splashRadius, radius: splashRadius,
)), ),
reason: 'Inactive pressed Switch should have overlay color: $inactivePressedOverlayColor', reason: 'Inactive pressed Switch should have overlay color: $inactivePressedOverlayColor',
); );
...@@ -559,7 +937,7 @@ void main() { ...@@ -559,7 +937,7 @@ void main() {
); );
}); });
testWidgets('Local SwitchTheme can override global SwitchTheme', (WidgetTester tester) async { testWidgets('Material2 - Local SwitchTheme can override global SwitchTheme', (WidgetTester tester) async {
const Color globalThemeThumbColor = Color(0xfffffff1); const Color globalThemeThumbColor = Color(0xfffffff1);
const Color globalThemeTrackColor = Color(0xfffffff2); const Color globalThemeTrackColor = Color(0xfffffff2);
const Color globalThemeOutlineColor = Color(0xfffffff3); const Color globalThemeOutlineColor = Color(0xfffffff3);
...@@ -570,6 +948,7 @@ void main() { ...@@ -570,6 +948,7 @@ void main() {
const double localThemeOutlineWidth = 4.0; const double localThemeOutlineWidth = 4.0;
final ThemeData themeData = ThemeData( final ThemeData themeData = ThemeData(
useMaterial3: false,
switchTheme: const SwitchThemeData( switchTheme: const SwitchThemeData(
thumbColor: MaterialStatePropertyAll<Color>(globalThemeThumbColor), thumbColor: MaterialStatePropertyAll<Color>(globalThemeThumbColor),
trackColor: MaterialStatePropertyAll<Color>(globalThemeTrackColor), trackColor: MaterialStatePropertyAll<Color>(globalThemeTrackColor),
...@@ -577,7 +956,6 @@ void main() { ...@@ -577,7 +956,6 @@ void main() {
trackOutlineWidth: MaterialStatePropertyAll<double>(globalThemeOutlineWidth), trackOutlineWidth: MaterialStatePropertyAll<double>(globalThemeOutlineWidth),
), ),
); );
final bool material3 = themeData.useMaterial3;
Widget buildSwitch({bool selected = false, bool autofocus = false}) { Widget buildSwitch({bool selected = false, bool autofocus = false}) {
return MaterialApp( return MaterialApp(
theme: themeData, theme: themeData,
...@@ -603,18 +981,64 @@ void main() { ...@@ -603,18 +981,64 @@ void main() {
await tester.pumpAndSettle(); await tester.pumpAndSettle();
expect( expect(
_getSwitchMaterial(tester), _getSwitchMaterial(tester),
material3 paints
? (paints
..rrect(color: localThemeTrackColor)
..rrect(color: localThemeOutlineColor, strokeWidth: localThemeOutlineWidth)
..rrect(color: localThemeThumbColor))
: (paints
..rrect(color: localThemeTrackColor) ..rrect(color: localThemeTrackColor)
..rrect(color: localThemeOutlineColor, strokeWidth: localThemeOutlineWidth) ..rrect(color: localThemeOutlineColor, strokeWidth: localThemeOutlineWidth)
..rrect() ..rrect()
..rrect() ..rrect()
..rrect() ..rrect()
..rrect(color: localThemeThumbColor)) ..rrect(color: localThemeThumbColor)
);
});
testWidgets('Material3 - Local SwitchTheme can override global SwitchTheme', (WidgetTester tester) async {
const Color globalThemeThumbColor = Color(0xfffffff1);
const Color globalThemeTrackColor = Color(0xfffffff2);
const Color globalThemeOutlineColor = Color(0xfffffff3);
const double globalThemeOutlineWidth = 6.0;
const Color localThemeThumbColor = Color(0xffff0000);
const Color localThemeTrackColor = Color(0xffff0000);
const Color localThemeOutlineColor = Color(0xffff0000);
const double localThemeOutlineWidth = 4.0;
final ThemeData themeData = ThemeData(
useMaterial3: true,
switchTheme: const SwitchThemeData(
thumbColor: MaterialStatePropertyAll<Color>(globalThemeThumbColor),
trackColor: MaterialStatePropertyAll<Color>(globalThemeTrackColor),
trackOutlineColor: MaterialStatePropertyAll<Color>(globalThemeOutlineColor),
trackOutlineWidth: MaterialStatePropertyAll<double>(globalThemeOutlineWidth),
),
);
Widget buildSwitch({bool selected = false, bool autofocus = false}) {
return MaterialApp(
theme: themeData,
home: Scaffold(
body: SwitchTheme(
data: const SwitchThemeData(
thumbColor: MaterialStatePropertyAll<Color>(localThemeThumbColor),
trackColor: MaterialStatePropertyAll<Color>(localThemeTrackColor),
trackOutlineColor: MaterialStatePropertyAll<Color>(localThemeOutlineColor),
trackOutlineWidth: MaterialStatePropertyAll<double>(localThemeOutlineWidth)
),
child: Switch(
value: selected,
onChanged: (bool value) {},
autofocus: autofocus,
),
),
),
);
}
await tester.pumpWidget(buildSwitch(selected: true));
await tester.pumpAndSettle();
expect(
_getSwitchMaterial(tester),
paints
..rrect(color: localThemeTrackColor)
..rrect(color: localThemeOutlineColor, strokeWidth: localThemeOutlineWidth)
..rrect(color: localThemeThumbColor)
); );
}); });
} }
......
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