Skip to content

Commit f05095e

Browse files
authored
Add high-contrast theme (#149779)
This is to add a high-contrast color scheme when we turn on high-contrast mode. Fixes flutter/flutter#149683
1 parent 1b8d083 commit f05095e

File tree

2 files changed

+77
-2
lines changed

2 files changed

+77
-2
lines changed

dev/a11y_assessments/lib/main.dart

+13-2
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,25 @@ class App extends StatelessWidget {
2020

2121
@override
2222
Widget build(BuildContext context) {
23+
final ThemeData lightTheme = ThemeData(
24+
colorScheme: ColorScheme.fromSeed(
25+
seedColor: const Color(0xff6750a4),
26+
contrastLevel: MediaQuery.highContrastOf(context) ? 1.0 : 0.0,
27+
));
28+
final ThemeData darkTheme = ThemeData(
29+
colorScheme: ColorScheme.fromSeed(
30+
brightness: Brightness.dark,
31+
seedColor: const Color(0xff6750a4),
32+
contrastLevel: MediaQuery.highContrastOf(context) ? 1.0 : 0.0,
33+
));
2334

2435
final Map<String, WidgetBuilder> routes = Map<String, WidgetBuilder>.fromEntries(
2536
useCases.map((UseCase useCase) => MapEntry<String, WidgetBuilder>(useCase.route, useCase.build)),
2637
);
2738
return MaterialApp(
2839
title: 'Accessibility Assessments',
29-
theme: ThemeData.light(),
30-
darkTheme: ThemeData.dark(),
40+
theme: lightTheme,
41+
darkTheme: darkTheme,
3142
routes: <String, WidgetBuilder>{
3243
'/': (_) => const HomePage(),
3344
...routes

dev/a11y_assessments/test/home_page_test.dart

+64
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import 'package:a11y_assessments/main.dart';
66
import 'package:flutter/material.dart';
77
import 'package:flutter_test/flutter_test.dart';
8+
import 'package:material_color_utilities/material_color_utilities.dart';
89

910

1011
void main() {
@@ -14,4 +15,67 @@ void main() {
1415
expect(app.theme!.brightness, equals(Brightness.light));
1516
expect(app.darkTheme!.brightness, equals(Brightness.dark));
1617
});
18+
19+
testWidgets('App can generate high-contrast color scheme', (WidgetTester tester) async {
20+
await tester.pumpWidget(const MediaQuery(
21+
data: MediaQueryData(
22+
highContrast: true,
23+
),
24+
child: App()
25+
));
26+
27+
final MaterialApp app = find.byType(MaterialApp).evaluate().first.widget as MaterialApp;
28+
29+
final DynamicScheme highContrastScheme = SchemeTonalSpot(sourceColorHct: Hct.fromInt(const Color(0xff6750a4).value), isDark: false, contrastLevel: 1.0);
30+
final ColorScheme appScheme = app.theme!.colorScheme;
31+
32+
expect(appScheme.primary.value, MaterialDynamicColors.primary.getArgb(highContrastScheme));
33+
expect(appScheme.onPrimary.value, MaterialDynamicColors.onPrimary.getArgb(highContrastScheme));
34+
expect(appScheme.primaryContainer.value, MaterialDynamicColors.primaryContainer.getArgb(highContrastScheme));
35+
expect(appScheme.onPrimaryContainer.value, MaterialDynamicColors.onPrimaryContainer.getArgb(highContrastScheme));
36+
expect(appScheme.primaryFixed.value, MaterialDynamicColors.primaryFixed.getArgb(highContrastScheme));
37+
expect(appScheme.primaryFixedDim.value, MaterialDynamicColors.primaryFixedDim.getArgb(highContrastScheme));
38+
expect(appScheme.onPrimaryFixed.value, MaterialDynamicColors.onPrimaryFixed.getArgb(highContrastScheme));
39+
expect(appScheme.onPrimaryFixedVariant.value, MaterialDynamicColors.onPrimaryFixedVariant.getArgb(highContrastScheme));
40+
expect(appScheme.secondary.value, MaterialDynamicColors.secondary.getArgb(highContrastScheme));
41+
expect(appScheme.onSecondary.value, MaterialDynamicColors.onSecondary.getArgb(highContrastScheme));
42+
expect(appScheme.secondaryContainer.value, MaterialDynamicColors.secondaryContainer.getArgb(highContrastScheme));
43+
expect(appScheme.onSecondaryContainer.value, MaterialDynamicColors.onSecondaryContainer.getArgb(highContrastScheme));
44+
expect(appScheme.secondaryFixed.value, MaterialDynamicColors.secondaryFixed.getArgb(highContrastScheme));
45+
expect(appScheme.secondaryFixedDim.value, MaterialDynamicColors.secondaryFixedDim.getArgb(highContrastScheme));
46+
expect(appScheme.onSecondaryFixed.value, MaterialDynamicColors.onSecondaryFixed.getArgb(highContrastScheme));
47+
expect(appScheme.onSecondaryFixedVariant.value, MaterialDynamicColors.onSecondaryFixedVariant.getArgb(highContrastScheme));
48+
expect(appScheme.tertiary.value, MaterialDynamicColors.tertiary.getArgb(highContrastScheme));
49+
expect(appScheme.onTertiary.value, MaterialDynamicColors.onTertiary.getArgb(highContrastScheme));
50+
expect(appScheme.tertiaryContainer.value, MaterialDynamicColors.tertiaryContainer.getArgb(highContrastScheme));
51+
expect(appScheme.onTertiaryContainer.value, MaterialDynamicColors.onTertiaryContainer.getArgb(highContrastScheme));
52+
expect(appScheme.tertiaryFixed.value, MaterialDynamicColors.tertiaryFixed.getArgb(highContrastScheme));
53+
expect(appScheme.tertiaryFixedDim.value, MaterialDynamicColors.tertiaryFixedDim.getArgb(highContrastScheme));
54+
expect(appScheme.onTertiaryFixed.value, MaterialDynamicColors.onTertiaryFixed.getArgb(highContrastScheme));
55+
expect(appScheme.onTertiaryFixedVariant.value, MaterialDynamicColors.onTertiaryFixedVariant.getArgb(highContrastScheme));
56+
expect(appScheme.error.value, MaterialDynamicColors.error.getArgb(highContrastScheme));
57+
expect(appScheme.onError.value, MaterialDynamicColors.onError.getArgb(highContrastScheme));
58+
expect(appScheme.errorContainer.value, MaterialDynamicColors.errorContainer.getArgb(highContrastScheme));
59+
expect(appScheme.onErrorContainer.value, MaterialDynamicColors.onErrorContainer.getArgb(highContrastScheme));
60+
expect(appScheme.background.value, MaterialDynamicColors.background.getArgb(highContrastScheme));
61+
expect(appScheme.onBackground.value, MaterialDynamicColors.onBackground.getArgb(highContrastScheme));
62+
expect(appScheme.surface.value, MaterialDynamicColors.surface.getArgb(highContrastScheme));
63+
expect(appScheme.surfaceDim.value, MaterialDynamicColors.surfaceDim.getArgb(highContrastScheme));
64+
expect(appScheme.surfaceBright.value, MaterialDynamicColors.surfaceBright.getArgb(highContrastScheme));
65+
expect(appScheme.surfaceContainerLowest.value, MaterialDynamicColors.surfaceContainerLowest.getArgb(highContrastScheme));
66+
expect(appScheme.surfaceContainerLow.value, MaterialDynamicColors.surfaceContainerLow.getArgb(highContrastScheme));
67+
expect(appScheme.surfaceContainer.value, MaterialDynamicColors.surfaceContainer.getArgb(highContrastScheme));
68+
expect(appScheme.surfaceContainerHigh.value, MaterialDynamicColors.surfaceContainerHigh.getArgb(highContrastScheme));
69+
expect(appScheme.surfaceContainerHighest.value, MaterialDynamicColors.surfaceContainerHighest.getArgb(highContrastScheme));
70+
expect(appScheme.onSurface.value, MaterialDynamicColors.onSurface.getArgb(highContrastScheme));
71+
expect(appScheme.surfaceVariant.value, MaterialDynamicColors.surfaceVariant.getArgb(highContrastScheme));
72+
expect(appScheme.onSurfaceVariant.value, MaterialDynamicColors.onSurfaceVariant.getArgb(highContrastScheme));
73+
expect(appScheme.outline.value, MaterialDynamicColors.outline.getArgb(highContrastScheme));
74+
expect(appScheme.outlineVariant.value, MaterialDynamicColors.outlineVariant.getArgb(highContrastScheme));
75+
expect(appScheme.shadow.value, MaterialDynamicColors.shadow.getArgb(highContrastScheme));
76+
expect(appScheme.scrim.value, MaterialDynamicColors.scrim.getArgb(highContrastScheme));
77+
expect(appScheme.inverseSurface.value, MaterialDynamicColors.inverseSurface.getArgb(highContrastScheme));
78+
expect(appScheme.onInverseSurface.value, MaterialDynamicColors.inverseOnSurface.getArgb(highContrastScheme));
79+
expect(appScheme.inversePrimary.value, MaterialDynamicColors.inversePrimary.getArgb(highContrastScheme));
80+
});
1781
}

0 commit comments

Comments
 (0)