Added Material 3 colors to ColorScheme. (#93427)
* Added the new Material 3 colors to ColorScheme.
* Deprecated primaryVariant and secondaryVariant colors in the ColorScheme.
* Added a flutter fix for the deprecated colors.
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/shrine/app.dart b/dev/integration_tests/flutter_gallery/lib/demo/shrine/app.dart
index 90cf627..8ba3357 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/shrine/app.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/shrine/app.dart
@@ -112,9 +112,7 @@
const ColorScheme kShrineColorScheme = ColorScheme(
primary: kShrinePink100,
- primaryVariant: kShrineBrown900,
secondary: kShrinePink50,
- secondaryVariant: kShrineBrown900,
surface: kShrineSurfaceWhite,
background: kShrineBackgroundWhite,
error: kShrineErrorRed,
diff --git a/packages/flutter/lib/fix_data.yaml b/packages/flutter/lib/fix_data.yaml
index d4b9e03..5b29eea 100644
--- a/packages/flutter/lib/fix_data.yaml
+++ b/packages/flutter/lib/fix_data.yaml
@@ -14,6 +14,106 @@
version: 1
transforms:
+ # Changes made in https://github.com/flutter/flutter/pull/93427
+ - title: "Remove 'primaryVariant' and 'secondaryVariant'"
+ date: 2021-11-19
+ element:
+ uris: [ 'material.dart' ]
+ constructor: ''
+ inClass: 'ColorScheme'
+ changes:
+ - kind: 'removeParameter'
+ name: 'primaryVariant'
+ - kind: 'removeParameter'
+ name: 'secondaryVariant'
+
+ # Changes made in https://github.com/flutter/flutter/pull/93427
+ - title: "Remove 'primaryVariant' and 'secondaryVariant'"
+ date: 2021-11-19
+ element:
+ uris: [ 'material.dart' ]
+ constructor: 'light'
+ inClass: 'ColorScheme'
+ changes:
+ - kind: 'removeParameter'
+ name: 'primaryVariant'
+ - kind: 'removeParameter'
+ name: 'secondaryVariant'
+
+ # Changes made in https://github.com/flutter/flutter/pull/93427
+ - title: "Remove 'primaryVariant' and 'secondaryVariant'"
+ date: 2021-11-19
+ element:
+ uris: [ 'material.dart' ]
+ constructor: 'dark'
+ inClass: 'ColorScheme'
+ changes:
+ - kind: 'removeParameter'
+ name: 'primaryVariant'
+ - kind: 'removeParameter'
+ name: 'secondaryVariant'
+
+ # Changes made in https://github.com/flutter/flutter/pull/93427
+ - title: "Remove 'primaryVariant' and 'secondaryVariant'"
+ date: 2021-11-19
+ element:
+ uris: [ 'material.dart' ]
+ constructor: 'highContrastLight'
+ inClass: 'ColorScheme'
+ changes:
+ - kind: 'removeParameter'
+ name: 'primaryVariant'
+ - kind: 'removeParameter'
+ name: 'secondaryVariant'
+
+ # Changes made in https://github.com/flutter/flutter/pull/93427
+ - title: "Remove 'primaryVariant' and 'secondaryVariant'"
+ date: 2021-11-19
+ element:
+ uris: [ 'material.dart' ]
+ constructor: 'highContrastDark'
+ inClass: 'ColorScheme'
+ changes:
+ - kind: 'removeParameter'
+ name: 'primaryVariant'
+ - kind: 'removeParameter'
+ name: 'secondaryVariant'
+
+ # Changes made in https://github.com/flutter/flutter/pull/93427
+ - title: "Remove 'primaryVariant' and 'secondaryVariant'"
+ date: 2021-11-19
+ element:
+ uris: [ 'material.dart' ]
+ method: 'copyWith'
+ inClass: 'ColorScheme'
+ changes:
+ - kind: 'removeParameter'
+ name: 'primaryVariant'
+ - kind: 'removeParameter'
+ name: 'secondaryVariant'
+
+ # Changes made in https://github.com/flutter/flutter/pull/93427
+ - title: "Migrate 'primaryVariant' to 'primaryContainer'"
+ date: 2021-11-19
+ element:
+ uris: [ 'material.dart' ]
+ getter: 'primaryVariant'
+ inClass: 'ColorScheme'
+ changes:
+ - kind: 'rename'
+ newName: 'primaryContainer'
+
+ # Changes made in https://github.com/flutter/flutter/pull/93427
+ - title: "Migrate 'secondaryVariant' to 'secondaryContainer'"
+ date: 2021-11-19
+ element:
+ uris: [ 'material.dart' ]
+ getter: 'secondaryVariant'
+ inClass: 'ColorScheme'
+ changes:
+ - kind: 'rename'
+ newName: 'secondaryContainer'
+
# Changes made in https://github.com/flutter/flutter/pull/93396
- title: "Remove 'primaryColorBrightness'"
date: 2021-11-11
diff --git a/packages/flutter/lib/src/material/color_scheme.dart b/packages/flutter/lib/src/material/color_scheme.dart
index 399c244..43642d4 100644
--- a/packages/flutter/lib/src/material/color_scheme.dart
+++ b/packages/flutter/lib/src/material/color_scheme.dart
@@ -8,8 +8,8 @@
import 'colors.dart';
import 'theme_data.dart';
-/// A set of twelve colors based on the
-/// [Material spec](https://material.io/design/color/the-color-system.html)
+/// A set of colors based on the
+/// [Material spec](https://m3.material.io/styles/color/the-color-system/color-roles)
/// that can be used to configure the color properties of most components.
///
/// The [Theme] has a color scheme, [ThemeData.colorScheme], which is constructed
@@ -17,154 +17,373 @@
@immutable
class ColorScheme with Diagnosticable {
/// Create a ColorScheme instance.
+ ///
+ /// For the color parameters that are nullable, it is still recommended
+ /// that applications provide values for them. They are only nullable due
+ /// to backwards compatibility concerns.
+ ///
+ /// If a color is not provided, the closest fallback color from the given
+ /// colors will be used for it (e.g. [primaryContainer] will default
+ /// to [primary]). Material 3 makes use of these colors for many component
+ /// defaults, so for the best results the application should supply colors
+ /// for all the parameters.
const ColorScheme({
- required this.primary,
- required this.primaryVariant,
- required this.secondary,
- required this.secondaryVariant,
- required this.surface,
- required this.background,
- required this.error,
- required this.onPrimary,
- required this.onSecondary,
- required this.onSurface,
- required this.onBackground,
- required this.onError,
required this.brightness,
- }) : assert(primary != null),
- assert(primaryVariant != null),
- assert(secondary != null),
- assert(secondaryVariant != null),
- assert(surface != null),
- assert(background != null),
- assert(error != null),
+ required this.primary,
+ required this.onPrimary,
+ Color? primaryContainer,
+ Color? onPrimaryContainer,
+ required this.secondary,
+ required this.onSecondary,
+ Color? secondaryContainer,
+ Color? onSecondaryContainer,
+ Color? tertiary,
+ Color? onTertiary,
+ Color? tertiaryContainer,
+ Color? onTertiaryContainer,
+ required this.error,
+ required this.onError,
+ Color? errorContainer,
+ Color? onErrorContainer,
+ required this.background,
+ required this.onBackground,
+ required this.surface,
+ required this.onSurface,
+ Color? surfaceVariant,
+ Color? onSurfaceVariant,
+ Color? outline,
+ Color? shadow,
+ Color? inverseSurface,
+ Color? onInverseSurface,
+ Color? inversePrimary,
+ @Deprecated(
+ 'Use primary or primaryContainer instead. '
+ 'This feature was deprecated after v2.6.0-0.0.pre.'
+ )
+ Color? primaryVariant,
+ @Deprecated(
+ 'Use secondary or secondaryContainer instead. '
+ 'This feature was deprecated after v2.6.0-0.0.pre.'
+ )
+ Color? secondaryVariant,
+ }) : assert(brightness != null),
+ assert(primary != null),
assert(onPrimary != null),
+ assert(secondary != null),
assert(onSecondary != null),
- assert(onSurface != null),
- assert(onBackground != null),
+ assert(error != null),
assert(onError != null),
- assert(brightness != null);
+ assert(background != null),
+ assert(onBackground != null),
+ assert(surface != null),
+ assert(onSurface != null),
+ _primaryContainer = primaryContainer,
+ _onPrimaryContainer = onPrimaryContainer,
+ _secondaryContainer = secondaryContainer,
+ _onSecondaryContainer = onSecondaryContainer,
+ _tertiary = tertiary,
+ _onTertiary = onTertiary,
+ _tertiaryContainer = tertiaryContainer,
+ _onTertiaryContainer = onTertiaryContainer,
+ _errorContainer = errorContainer,
+ _onErrorContainer = onErrorContainer,
+ _surfaceVariant = surfaceVariant,
+ _onSurfaceVariant = onSurfaceVariant,
+ _outline = outline,
+ _shadow = shadow,
+ _inverseSurface = inverseSurface,
+ _onInverseSurface = onInverseSurface,
+ _inversePrimary = inversePrimary,
+ _primaryVariant = primaryVariant,
+ _secondaryVariant = secondaryVariant;
/// Create a ColorScheme based on a purple primary color that matches the
/// [baseline Material color scheme](https://material.io/design/color/the-color-system.html#color-theme-creation).
const ColorScheme.light({
- this.primary = const Color(0xff6200ee),
- this.primaryVariant = const Color(0xff3700b3),
- this.secondary = const Color(0xff03dac6),
- this.secondaryVariant = const Color(0xff018786),
- this.surface = Colors.white,
- this.background = Colors.white,
- this.error = const Color(0xffb00020),
- this.onPrimary = Colors.white,
- this.onSecondary = Colors.black,
- this.onSurface = Colors.black,
- this.onBackground = Colors.black,
- this.onError = Colors.white,
this.brightness = Brightness.light,
- }) : assert(primary != null),
- assert(primaryVariant != null),
- assert(secondary != null),
- assert(secondaryVariant != null),
- assert(surface != null),
- assert(background != null),
- assert(error != null),
+ this.primary = const Color(0xff6200ee),
+ this.onPrimary = Colors.white,
+ Color? primaryContainer,
+ Color? onPrimaryContainer,
+ this.secondary = const Color(0xff03dac6),
+ this.onSecondary = Colors.black,
+ Color? secondaryContainer,
+ Color? onSecondaryContainer,
+ Color? tertiary,
+ Color? onTertiary,
+ Color? tertiaryContainer,
+ Color? onTertiaryContainer,
+ this.error = const Color(0xffb00020),
+ this.onError = Colors.white,
+ Color? errorContainer,
+ Color? onErrorContainer,
+ this.background = Colors.white,
+ this.onBackground = Colors.black,
+ this.surface = Colors.white,
+ this.onSurface = Colors.black,
+ Color? surfaceVariant,
+ Color? onSurfaceVariant,
+ Color? outline,
+ Color? shadow,
+ Color? inverseSurface,
+ Color? onInverseSurface,
+ Color? inversePrimary,
+ @Deprecated(
+ 'Use primary or primaryContainer instead. '
+ 'This feature was deprecated after v2.6.0-0.0.pre.'
+ )
+ Color? primaryVariant = const Color(0xff3700b3),
+ @Deprecated(
+ 'Use secondary or secondaryContainer instead. '
+ 'This feature was deprecated after v2.6.0-0.0.pre.'
+ )
+ Color? secondaryVariant = const Color(0xff018786),
+ }) : assert(brightness != null),
+ assert(primary != null),
assert(onPrimary != null),
+ assert(secondary != null),
assert(onSecondary != null),
- assert(onSurface != null),
- assert(onBackground != null),
+ assert(error != null),
assert(onError != null),
- assert(brightness != null);
+ assert(background != null),
+ assert(onBackground != null),
+ assert(surface != null),
+ assert(onSurface != null),
+ _primaryContainer = primaryContainer,
+ _onPrimaryContainer = onPrimaryContainer,
+ _secondaryContainer = secondaryContainer,
+ _onSecondaryContainer = onSecondaryContainer,
+ _tertiary = tertiary,
+ _onTertiary = onTertiary,
+ _tertiaryContainer = tertiaryContainer,
+ _onTertiaryContainer = onTertiaryContainer,
+ _errorContainer = errorContainer,
+ _onErrorContainer = onErrorContainer,
+ _surfaceVariant = surfaceVariant,
+ _onSurfaceVariant = onSurfaceVariant,
+ _outline = outline,
+ _shadow = shadow,
+ _inverseSurface = inverseSurface,
+ _onInverseSurface = onInverseSurface,
+ _inversePrimary = inversePrimary,
+ _primaryVariant = primaryVariant,
+ _secondaryVariant = secondaryVariant;
/// Create the recommended dark color scheme that matches the
/// [baseline Material color scheme](https://material.io/design/color/dark-theme.html#ui-application).
const ColorScheme.dark({
- this.primary = const Color(0xffbb86fc),
- this.primaryVariant = const Color(0xff3700B3),
- this.secondary = const Color(0xff03dac6),
- this.secondaryVariant = const Color(0xff03dac6),
- this.surface = const Color(0xff121212),
- this.background = const Color(0xff121212),
- this.error = const Color(0xffcf6679),
- this.onPrimary = Colors.black,
- this.onSecondary = Colors.black,
- this.onSurface = Colors.white,
- this.onBackground = Colors.white,
- this.onError = Colors.black,
this.brightness = Brightness.dark,
- }) : assert(primary != null),
- assert(primaryVariant != null),
- assert(secondary != null),
- assert(secondaryVariant != null),
- assert(surface != null),
- assert(background != null),
- assert(error != null),
+ this.primary = const Color(0xffbb86fc),
+ this.onPrimary = Colors.black,
+ Color? primaryContainer,
+ Color? onPrimaryContainer,
+ this.secondary = const Color(0xff03dac6),
+ this.onSecondary = Colors.black,
+ Color? secondaryContainer,
+ Color? onSecondaryContainer,
+ Color? tertiary,
+ Color? onTertiary,
+ Color? tertiaryContainer,
+ Color? onTertiaryContainer,
+ this.error = const Color(0xffcf6679),
+ this.onError = Colors.black,
+ Color? errorContainer,
+ Color? onErrorContainer,
+ this.background = const Color(0xff121212),
+ this.onBackground = Colors.white,
+ this.surface = const Color(0xff121212),
+ this.onSurface = Colors.white,
+ Color? surfaceVariant,
+ Color? onSurfaceVariant,
+ Color? outline,
+ Color? shadow,
+ Color? inverseSurface,
+ Color? onInverseSurface,
+ Color? inversePrimary,
+ @Deprecated(
+ 'Use primary or primaryContainer instead. '
+ 'This feature was deprecated after v2.6.0-0.0.pre.'
+ )
+ Color? primaryVariant = const Color(0xff3700B3),
+ @Deprecated(
+ 'Use secondary or secondaryContainer instead. '
+ 'This feature was deprecated after v2.6.0-0.0.pre.'
+ )
+ Color? secondaryVariant = const Color(0xff03dac6),
+ }) : assert(brightness != null),
+ assert(primary != null),
assert(onPrimary != null),
+ assert(secondary != null),
assert(onSecondary != null),
- assert(onSurface != null),
- assert(onBackground != null),
+ assert(error != null),
assert(onError != null),
- assert(brightness != null);
-
+ assert(background != null),
+ assert(onBackground != null),
+ assert(surface != null),
+ assert(onSurface != null),
+ _primaryContainer = primaryContainer,
+ _onPrimaryContainer = onPrimaryContainer,
+ _secondaryContainer = secondaryContainer,
+ _onSecondaryContainer = onSecondaryContainer,
+ _tertiary = tertiary,
+ _onTertiary = onTertiary,
+ _tertiaryContainer = tertiaryContainer,
+ _onTertiaryContainer = onTertiaryContainer,
+ _errorContainer = errorContainer,
+ _onErrorContainer = onErrorContainer,
+ _surfaceVariant = surfaceVariant,
+ _onSurfaceVariant = onSurfaceVariant,
+ _outline = outline,
+ _shadow = shadow,
+ _inverseSurface = inverseSurface,
+ _onInverseSurface = onInverseSurface,
+ _inversePrimary = inversePrimary,
+ _primaryVariant = primaryVariant,
+ _secondaryVariant = secondaryVariant;
/// Create a high contrast ColorScheme based on a purple primary color that
/// matches the [baseline Material color scheme](https://material.io/design/color/the-color-system.html#color-theme-creation).
const ColorScheme.highContrastLight({
- this.primary = const Color(0xff0000ba),
- this.primaryVariant = const Color(0xff000088),
- this.secondary = const Color(0xff66fff9),
- this.secondaryVariant = const Color(0xff018786),
- this.surface = Colors.white,
- this.background = Colors.white,
- this.error = const Color(0xff790000),
- this.onPrimary = Colors.white,
- this.onSecondary = Colors.black,
- this.onSurface = Colors.black,
- this.onBackground = Colors.black,
- this.onError = Colors.white,
this.brightness = Brightness.light,
- }) : assert(primary != null),
- assert(primaryVariant != null),
- assert(secondary != null),
- assert(secondaryVariant != null),
- assert(surface != null),
- assert(background != null),
- assert(error != null),
- assert(onPrimary != null),
- assert(onSecondary != null),
- assert(onSurface != null),
- assert(onBackground != null),
- assert(onError != null),
- assert(brightness != null);
+ this.primary = const Color(0xff0000ba),
+ this.onPrimary = Colors.white,
+ Color? primaryContainer,
+ Color? onPrimaryContainer,
+ this.secondary = const Color(0xff66fff9),
+ this.onSecondary = Colors.black,
+ Color? secondaryContainer,
+ Color? onSecondaryContainer,
+ Color? tertiary,
+ Color? onTertiary,
+ Color? tertiaryContainer,
+ Color? onTertiaryContainer,
+ this.error = const Color(0xff790000),
+ this.onError = Colors.white,
+ Color? errorContainer,
+ Color? onErrorContainer,
+ this.background = Colors.white,
+ this.onBackground = Colors.black,
+ this.surface = Colors.white,
+ this.onSurface = Colors.black,
+ Color? surfaceVariant,
+ Color? onSurfaceVariant,
+ Color? outline,
+ Color? shadow,
+ Color? inverseSurface,
+ Color? onInverseSurface,
+ Color? inversePrimary,
+ @Deprecated(
+ 'Use primary or primaryContainer instead. '
+ 'This feature was deprecated after v2.6.0-0.0.pre.'
+ )
+ Color? primaryVariant = const Color(0xff000088),
+ @Deprecated(
+ 'Use secondary or secondaryContainer instead. '
+ 'This feature was deprecated after v2.6.0-0.0.pre.'
+ )
+ Color? secondaryVariant = const Color(0xff018786),
+ }) : assert(brightness != null),
+ assert(primary != null),
+ assert(onPrimary != null),
+ assert(secondary != null),
+ assert(onSecondary != null),
+ assert(error != null),
+ assert(onError != null),
+ assert(background != null),
+ assert(onBackground != null),
+ assert(surface != null),
+ assert(onSurface != null),
+ _primaryContainer = primaryContainer,
+ _onPrimaryContainer = onPrimaryContainer,
+ _secondaryContainer = secondaryContainer,
+ _onSecondaryContainer = onSecondaryContainer,
+ _tertiary = tertiary,
+ _onTertiary = onTertiary,
+ _tertiaryContainer = tertiaryContainer,
+ _onTertiaryContainer = onTertiaryContainer,
+ _errorContainer = errorContainer,
+ _onErrorContainer = onErrorContainer,
+ _surfaceVariant = surfaceVariant,
+ _onSurfaceVariant = onSurfaceVariant,
+ _outline = outline,
+ _shadow = shadow,
+ _inverseSurface = inverseSurface,
+ _onInverseSurface = onInverseSurface,
+ _inversePrimary = inversePrimary,
+ _primaryVariant = primaryVariant,
+ _secondaryVariant = secondaryVariant;
/// Create a high contrast ColorScheme based on the dark
/// [baseline Material color scheme](https://material.io/design/color/dark-theme.html#ui-application).
const ColorScheme.highContrastDark({
- this.primary = const Color(0xffefb7ff),
- this.primaryVariant = const Color(0xffbe9eff),
- this.secondary = const Color(0xff66fff9),
- this.secondaryVariant = const Color(0xff66fff9),
- this.surface = const Color(0xff121212),
- this.background = const Color(0xff121212),
- this.error = const Color(0xff9b374d),
- this.onPrimary = Colors.black,
- this.onSecondary = Colors.black,
- this.onSurface = Colors.white,
- this.onBackground = Colors.white,
- this.onError = Colors.black,
this.brightness = Brightness.dark,
- }) : assert(primary != null),
- assert(primaryVariant != null),
- assert(secondary != null),
- assert(secondaryVariant != null),
- assert(surface != null),
- assert(background != null),
- assert(error != null),
- assert(onPrimary != null),
- assert(onSecondary != null),
- assert(onSurface != null),
- assert(onBackground != null),
- assert(onError != null),
- assert(brightness != null);
+ this.primary = const Color(0xffefb7ff),
+ this.onPrimary = Colors.black,
+ Color? primaryContainer,
+ Color? onPrimaryContainer,
+ this.secondary = const Color(0xff66fff9),
+ this.onSecondary = Colors.black,
+ Color? secondaryContainer,
+ Color? onSecondaryContainer,
+ Color? tertiary,
+ Color? onTertiary,
+ Color? tertiaryContainer,
+ Color? onTertiaryContainer,
+ this.error = const Color(0xff9b374d),
+ this.onError = Colors.black,
+ Color? errorContainer,
+ Color? onErrorContainer,
+ this.background = const Color(0xff121212),
+ this.onBackground = Colors.white,
+ this.surface = const Color(0xff121212),
+ this.onSurface = Colors.white,
+ Color? surfaceVariant,
+ Color? onSurfaceVariant,
+ Color? outline,
+ Color? shadow,
+ Color? inverseSurface,
+ Color? onInverseSurface,
+ Color? inversePrimary,
+ @Deprecated(
+ 'Use primary or primaryContainer instead. '
+ 'This feature was deprecated after v2.6.0-0.0.pre.'
+ )
+ Color? primaryVariant = const Color(0xffbe9eff),
+ @Deprecated(
+ 'Use secondary or secondaryContainer instead. '
+ 'This feature was deprecated after v2.6.0-0.0.pre.'
+ )
+ Color? secondaryVariant = const Color(0xff66fff9),
+ }) : assert(brightness != null),
+ assert(primary != null),
+ assert(onPrimary != null),
+ assert(secondary != null),
+ assert(onSecondary != null),
+ assert(error != null),
+ assert(onError != null),
+ assert(background != null),
+ assert(onBackground != null),
+ assert(surface != null),
+ assert(onSurface != null),
+ _primaryContainer = primaryContainer,
+ _onPrimaryContainer = onPrimaryContainer,
+ _secondaryContainer = secondaryContainer,
+ _onSecondaryContainer = onSecondaryContainer,
+ _tertiary = tertiary,
+ _onTertiary = onTertiary,
+ _tertiaryContainer = tertiaryContainer,
+ _onTertiaryContainer = onTertiaryContainer,
+ _errorContainer = errorContainer,
+ _onErrorContainer = onErrorContainer,
+ _surfaceVariant = surfaceVariant,
+ _onSurfaceVariant = onSurfaceVariant,
+ _outline = outline,
+ _shadow = shadow,
+ _inverseSurface = inverseSurface,
+ _onInverseSurface = onInverseSurface,
+ _inversePrimary = inversePrimary,
+ _primaryVariant = primaryVariant,
+ _secondaryVariant = secondaryVariant;
/// Create a color scheme from a [MaterialColor] swatch.
///
@@ -206,98 +425,258 @@
static Brightness _brightnessFor(Color color) => ThemeData.estimateBrightnessForColor(color);
+ /// The overall brightness of this color scheme.
+ final Brightness brightness;
+
/// The color displayed most frequently across your app’s screens and components.
final Color primary;
- /// A darker version of the primary color.
- final Color primaryVariant;
+ /// A color that's clearly legible when drawn on [primary].
+ ///
+ /// To ensure that an app is accessible, a contrast ratio between
+ /// [primary] and [onPrimary] of at least 4.5:1 is recommended. See
+ /// <https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-contrast.html>.
+ final Color onPrimary;
- /// An accent color that, when used sparingly, calls attention to parts
- /// of your app.
+ final Color? _primaryContainer;
+ /// A color used for elements needing less emphasis than [primary].
+ Color get primaryContainer => _primaryContainer ?? primary;
+
+ final Color? _onPrimaryContainer;
+ /// A color that's clearly legible when drawn on [primaryContainer].
+ ///
+ /// To ensure that an app is accessible, a contrast ratio between
+ /// [primaryContainer] and [onPrimaryContainer] of at least 4.5:1
+ /// is recommended. See
+ /// <https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-contrast.html>.
+ Color get onPrimaryContainer => _onPrimaryContainer ?? onPrimary;
+
+ /// An accent color used for less prominent components in the UI, such as
+ /// filter chips, while expanding the opportunity for color expression.
final Color secondary;
- /// A darker version of the secondary color.
- final Color secondaryVariant;
+ /// A color that's clearly legible when drawn on [secondary].
+ ///
+ /// To ensure that an app is accessible, a contrast ratio between
+ /// [secondary] and [onSecondary] of at least 4.5:1 is recommended. See
+ /// <https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-contrast.html>.
+ final Color onSecondary;
- /// The background color for widgets like [Card].
- final Color surface;
+ final Color? _secondaryContainer;
+ /// A color used for elements needing less emphasis than [secondary].
+ Color get secondaryContainer => _secondaryContainer ?? secondary;
- /// A color that typically appears behind scrollable content.
- final Color background;
+ final Color? _onSecondaryContainer;
+ /// A color that's clearly legible when drawn on [secondaryContainer].
+ ///
+ /// To ensure that an app is accessible, a contrast ratio between
+ /// [secondaryContainer] and [onSecondaryContainer] of at least 4.5:1 is
+ /// recommended. See
+ /// <https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-contrast.html>.
+ Color get onSecondaryContainer => _onSecondaryContainer ?? onSecondary;
+
+ final Color? _tertiary;
+ /// A color used as a contrasting accent that can balance [primary]
+ /// and [secondary] colors or bring heightened attention to an element,
+ /// such as an input field.
+ Color get tertiary => _tertiary ?? secondary;
+
+ final Color? _onTertiary;
+ /// A color that's clearly legible when drawn on [tertiary].
+ ///
+ /// To ensure that an app is accessible, a contrast ratio between
+ /// [tertiary] and [onTertiary] of at least 4.5:1 is recommended. See
+ /// <https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-contrast.html>.
+ Color get onTertiary => _onTertiary ?? onSecondary;
+
+ final Color? _tertiaryContainer;
+ /// A color used for elements needing less emphasis than [tertiary].
+ Color get tertiaryContainer => _tertiaryContainer ?? tertiary;
+
+ final Color? _onTertiaryContainer;
+ /// A color that's clearly legible when drawn on [tertiaryContainer].
+ ///
+ /// To ensure that an app is accessible, a contrast ratio between
+ /// [tertiaryContainer] and [onTertiaryContainer] of at least 4.5:1 is
+ /// recommended. See
+ /// <https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-contrast.html>.
+ Color get onTertiaryContainer => _onTertiaryContainer ?? onTertiary;
/// The color to use for input validation errors, e.g. for
/// [InputDecoration.errorText].
final Color error;
- /// A color that's clearly legible when drawn on [primary].
- ///
- /// To ensure that an app is accessible, a contrast ratio of 4.5:1 for [primary]
- /// and [onPrimary] is recommended. See
- /// <https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-contrast.html>.
- final Color onPrimary;
-
- /// A color that's clearly legible when drawn on [secondary].
- ///
- /// To ensure that an app is accessible, a contrast ratio of 4.5:1 for [secondary]
- /// and [onSecondary] is recommended. See
- /// <https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-contrast.html>.
- final Color onSecondary;
-
- /// A color that's clearly legible when drawn on [surface].
- ///
- /// To ensure that an app is accessible, a contrast ratio of 4.5:1 for [surface]
- /// and [onSurface] is recommended. See
- /// <https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-contrast.html>.
- final Color onSurface;
-
- /// A color that's clearly legible when drawn on [background].
- ///
- /// To ensure that an app is accessible, a contrast ratio of 4.5:1 for [background]
- /// and [onBackground] is recommended. See
- /// <https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-contrast.html>.
- final Color onBackground;
-
/// A color that's clearly legible when drawn on [error].
///
- /// To ensure that an app is accessible, a contrast ratio of 4.5:1 for [error]
- /// and [onError] is recommended. See
+ /// To ensure that an app is accessible, a contrast ratio between
+ /// [error] and [onError] of at least 4.5:1 is recommended. See
/// <https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-contrast.html>.
final Color onError;
- /// The overall brightness of this color scheme.
- final Brightness brightness;
+ final Color? _errorContainer;
+ /// A color used for error elements needing less emphasis than [error].
+ Color get errorContainer => _errorContainer ?? error;
+
+ final Color? _onErrorContainer;
+ /// A color that's clearly legible when drawn on [errorContainer].
+ ///
+ /// To ensure that an app is accessible, a contrast ratio between
+ /// [errorContainer] and [onErrorContainer] of at least 4.5:1 is
+ /// recommended. See
+ /// <https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-contrast.html>.
+ Color get onErrorContainer => _onErrorContainer ?? onError;
+
+ /// A color that typically appears behind scrollable content.
+ final Color background;
+
+ /// A color that's clearly legible when drawn on [background].
+ ///
+ /// To ensure that an app is accessible, a contrast ratio between
+ /// [background] and [onBackground] of at least 4.5:1 is recommended. See
+ /// <https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-contrast.html>.
+ final Color onBackground;
+
+ /// The background color for widgets like [Card].
+ final Color surface;
+
+ /// A color that's clearly legible when drawn on [surface].
+ ///
+ /// To ensure that an app is accessible, a contrast ratio between
+ /// [surface] and [onSurface] of at least 4.5:1 is recommended. See
+ /// <https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-contrast.html>.
+ final Color onSurface;
+
+ final Color? _surfaceVariant;
+ /// A color variant of [surface] that can be used for differentiation against
+ /// a component using [surface].
+ Color get surfaceVariant => _surfaceVariant ?? surface;
+
+ final Color? _onSurfaceVariant;
+ /// A color that's clearly legible when drawn on [surfaceVariant].
+ ///
+ /// To ensure that an app is accessible, a contrast ratio between
+ /// [surfaceVariant] and [onSurfaceVariant] of at least 4.5:1 is
+ /// recommended. See
+ /// <https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-contrast.html>.
+ Color get onSurfaceVariant => _onSurfaceVariant ?? onSurface;
+
+ final Color? _outline;
+ /// A utility color that creates boundaries and emphasis to improve usability.
+ Color get outline => _outline ?? onBackground;
+
+ final Color? _shadow;
+ /// A color use to paint the drop shadows of elevated components.
+ Color get shadow => _shadow ?? onBackground;
+
+ final Color? _inverseSurface;
+ /// A surface color used for displaying the reverse of what’s seen in the
+ /// surrounding UI, for example in a SnackBar to bring attention to
+ /// an alert.
+ Color get inverseSurface => _inverseSurface ?? onSurface;
+
+ final Color? _onInverseSurface;
+ /// A color that's clearly legible when drawn on [inverseSurface].
+ ///
+ /// To ensure that an app is accessible, a contrast ratio between
+ /// [inverseSurface] and [onInverseSurface] of at least 4.5:1 is
+ /// recommended. See
+ /// <https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-contrast.html>.
+ Color get onInverseSurface => _onInverseSurface ?? surface;
+
+ final Color? _inversePrimary;
+ /// An accent color used for displaying a highlight color on [inverseSurface]
+ /// backgrounds, like button text in a SnackBar.
+ Color get inversePrimary => _inversePrimary ?? onPrimary;
+
+ final Color? _primaryVariant;
+ /// A darker version of the primary color.
+ @Deprecated(
+ 'Use primary or primaryContainer instead. '
+ 'This feature was deprecated after v2.6.0-0.0.pre.'
+ )
+ Color get primaryVariant => _primaryVariant ?? primary;
+
+ final Color? _secondaryVariant;
+ /// A darker version of the secondary color.
+ @Deprecated(
+ 'Use secondary or secondaryContainer instead. '
+ 'This feature was deprecated after v2.6.0-0.0.pre.'
+ )
+ Color get secondaryVariant => _secondaryVariant ?? secondary;
/// Creates a copy of this color scheme with the given fields
/// replaced by the non-null parameter values.
ColorScheme copyWith({
- Color? primary,
- Color? primaryVariant,
- Color? secondary,
- Color? secondaryVariant,
- Color? surface,
- Color? background,
- Color? error,
- Color? onPrimary,
- Color? onSecondary,
- Color? onSurface,
- Color? onBackground,
- Color? onError,
Brightness? brightness,
+ Color? primary,
+ Color? onPrimary,
+ Color? primaryContainer,
+ Color? onPrimaryContainer,
+ Color? secondary,
+ Color? onSecondary,
+ Color? secondaryContainer,
+ Color? onSecondaryContainer,
+ Color? tertiary,
+ Color? onTertiary,
+ Color? tertiaryContainer,
+ Color? onTertiaryContainer,
+ Color? error,
+ Color? onError,
+ Color? errorContainer,
+ Color? onErrorContainer,
+ Color? background,
+ Color? onBackground,
+ Color? surface,
+ Color? onSurface,
+ Color? surfaceVariant,
+ Color? onSurfaceVariant,
+ Color? outline,
+ Color? shadow,
+ Color? inverseSurface,
+ Color? onInverseSurface,
+ Color? inversePrimary,
+ @Deprecated(
+ 'Use primary or primaryContainer instead. '
+ 'This feature was deprecated after v2.6.0-0.0.pre.'
+ )
+ Color? primaryVariant,
+ @Deprecated(
+ 'Use secondary or secondaryContainer instead. '
+ 'This feature was deprecated after v2.6.0-0.0.pre.'
+ )
+ Color? secondaryVariant,
}) {
return ColorScheme(
- primary: primary ?? this.primary,
- primaryVariant: primaryVariant ?? this.primaryVariant,
- secondary: secondary ?? this.secondary,
- secondaryVariant: secondaryVariant ?? this.secondaryVariant,
- surface: surface ?? this.surface,
- background: background ?? this.background,
- error: error ?? this.error,
- onPrimary: onPrimary ?? this.onPrimary,
- onSecondary: onSecondary ?? this.onSecondary,
- onSurface: onSurface ?? this.onSurface,
- onBackground: onBackground ?? this.onBackground,
- onError: onError ?? this.onError,
brightness: brightness ?? this.brightness,
+ primary : primary ?? this.primary,
+ onPrimary : onPrimary ?? this.onPrimary,
+ primaryContainer : primaryContainer ?? this.primaryContainer,
+ onPrimaryContainer : onPrimaryContainer ?? this.onPrimaryContainer,
+ secondary : secondary ?? this.secondary,
+ onSecondary : onSecondary ?? this.onSecondary,
+ secondaryContainer : secondaryContainer ?? this.secondaryContainer,
+ onSecondaryContainer : onSecondaryContainer ?? this.onSecondaryContainer,
+ tertiary : tertiary ?? this.tertiary,
+ onTertiary : onTertiary ?? this.onTertiary,
+ tertiaryContainer : tertiaryContainer ?? this.tertiaryContainer,
+ onTertiaryContainer : onTertiaryContainer ?? this.onTertiaryContainer,
+ error : error ?? this.error,
+ onError : onError ?? this.onError,
+ errorContainer : errorContainer ?? this.errorContainer,
+ onErrorContainer : onErrorContainer ?? this.onErrorContainer,
+ background : background ?? this.background,
+ onBackground : onBackground ?? this.onBackground,
+ surface : surface ?? this.surface,
+ onSurface : onSurface ?? this.onSurface,
+ surfaceVariant : surfaceVariant ?? this.surfaceVariant,
+ onSurfaceVariant : onSurfaceVariant ?? this.onSurfaceVariant,
+ outline : outline ?? this.outline,
+ shadow : shadow ?? this.shadow,
+ inverseSurface : inverseSurface ?? this.inverseSurface,
+ onInverseSurface : onInverseSurface ?? this.onInverseSurface,
+ inversePrimary : inversePrimary ?? this.inversePrimary,
+ primaryVariant: primaryVariant ?? this.primaryVariant,
+ secondaryVariant: secondaryVariant ?? this.secondaryVariant,
);
}
@@ -306,19 +685,36 @@
/// {@macro dart.ui.shadow.lerp}
static ColorScheme lerp(ColorScheme a, ColorScheme b, double t) {
return ColorScheme(
- primary: Color.lerp(a.primary, b.primary, t)!,
- primaryVariant: Color.lerp(a.primaryVariant, b.primaryVariant, t)!,
- secondary: Color.lerp(a.secondary, b.secondary, t)!,
- secondaryVariant: Color.lerp(a.secondaryVariant, b.secondaryVariant, t)!,
- surface: Color.lerp(a.surface, b.surface, t)!,
- background: Color.lerp(a.background, b.background, t)!,
- error: Color.lerp(a.error, b.error, t)!,
- onPrimary: Color.lerp(a.onPrimary, b.onPrimary, t)!,
- onSecondary: Color.lerp(a.onSecondary, b.onSecondary, t)!,
- onSurface: Color.lerp(a.onSurface, b.onSurface, t)!,
- onBackground: Color.lerp(a.onBackground, b.onBackground, t)!,
- onError: Color.lerp(a.onError, b.onError, t)!,
brightness: t < 0.5 ? a.brightness : b.brightness,
+ primary: Color.lerp(a.primary, b.primary, t)!,
+ onPrimary: Color.lerp(a.onPrimary, b.onPrimary, t)!,
+ primaryContainer: Color.lerp(a.primaryContainer, b.primaryContainer, t),
+ onPrimaryContainer: Color.lerp(a.onPrimaryContainer, b.onPrimaryContainer, t),
+ secondary: Color.lerp(a.secondary, b.secondary, t)!,
+ onSecondary: Color.lerp(a.onSecondary, b.onSecondary, t)!,
+ secondaryContainer: Color.lerp(a.secondaryContainer, b.secondaryContainer, t),
+ onSecondaryContainer: Color.lerp(a.onSecondaryContainer, b.onSecondaryContainer, t),
+ tertiary: Color.lerp(a.tertiary, b.tertiary, t),
+ onTertiary: Color.lerp(a.onTertiary, b.onTertiary, t),
+ tertiaryContainer: Color.lerp(a.tertiaryContainer, b.tertiaryContainer, t),
+ onTertiaryContainer: Color.lerp(a.onTertiaryContainer, b.onTertiaryContainer, t),
+ error: Color.lerp(a.error, b.error, t)!,
+ onError: Color.lerp(a.onError, b.onError, t)!,
+ errorContainer: Color.lerp(a.errorContainer, b.errorContainer, t),
+ onErrorContainer: Color.lerp(a.onErrorContainer, b.onErrorContainer, t),
+ background: Color.lerp(a.background, b.background, t)!,
+ onBackground: Color.lerp(a.onBackground, b.onBackground, t)!,
+ surface: Color.lerp(a.surface, b.surface, t)!,
+ onSurface: Color.lerp(a.onSurface, b.onSurface, t)!,
+ surfaceVariant: Color.lerp(a.surfaceVariant, b.surfaceVariant, t),
+ onSurfaceVariant: Color.lerp(a.onSurfaceVariant, b.onSurfaceVariant, t),
+ outline: Color.lerp(a.outline, b.outline, t),
+ shadow: Color.lerp(a.shadow, b.shadow, t),
+ inverseSurface: Color.lerp(a.inverseSurface, b.inverseSurface, t),
+ onInverseSurface: Color.lerp(a.onInverseSurface, b.onInverseSurface, t),
+ inversePrimary: Color.lerp(a.inversePrimary, b.inversePrimary, t),
+ primaryVariant: Color.lerp(a.primaryVariant, b.primaryVariant, t),
+ secondaryVariant: Color.lerp(a.secondaryVariant, b.secondaryVariant, t),
);
}
@@ -329,56 +725,107 @@
if (other.runtimeType != runtimeType)
return false;
return other is ColorScheme
- && other.primary == primary
- && other.primaryVariant == primaryVariant
- && other.secondary == secondary
- && other.secondaryVariant == secondaryVariant
- && other.surface == surface
- && other.background == background
- && other.error == error
- && other.onPrimary == onPrimary
- && other.onSecondary == onSecondary
- && other.onSurface == onSurface
- && other.onBackground == onBackground
- && other.onError == onError
- && other.brightness == brightness;
+ && other.brightness == brightness
+ && other.primary == primary
+ && other.onPrimary == onPrimary
+ && other.primaryContainer == primaryContainer
+ && other.onPrimaryContainer == onPrimaryContainer
+ && other.secondary == secondary
+ && other.onSecondary == onSecondary
+ && other.secondaryContainer == secondaryContainer
+ && other.onSecondaryContainer == onSecondaryContainer
+ && other.tertiary == tertiary
+ && other.onTertiary == onTertiary
+ && other.tertiaryContainer == tertiaryContainer
+ && other.onTertiaryContainer == onTertiaryContainer
+ && other.error == error
+ && other.onError == onError
+ && other.errorContainer == errorContainer
+ && other.onErrorContainer == onErrorContainer
+ && other.background == background
+ && other.onBackground == onBackground
+ && other.surface == surface
+ && other.onSurface == onSurface
+ && other.surfaceVariant == surfaceVariant
+ && other.onSurfaceVariant == onSurfaceVariant
+ && other.outline == outline
+ && other.shadow == shadow
+ && other.inverseSurface == inverseSurface
+ && other.onInverseSurface == onInverseSurface
+ && other.inversePrimary == inversePrimary
+ && other.primaryVariant == primaryVariant
+ && other.secondaryVariant == secondaryVariant;
}
@override
int get hashCode {
- return hashValues(
- primary,
- primaryVariant,
- secondary,
- secondaryVariant,
- surface,
- background,
- error,
- onPrimary,
- onSecondary,
- onSurface,
- onBackground,
- onError,
+ return hashList(<Object?>[
brightness,
- );
+ primary,
+ onPrimary,
+ primaryContainer,
+ onPrimaryContainer,
+ secondary,
+ onSecondary,
+ secondaryContainer,
+ onSecondaryContainer,
+ tertiary,
+ onTertiary,
+ tertiaryContainer,
+ onTertiaryContainer,
+ error,
+ onError,
+ errorContainer,
+ onErrorContainer,
+ background,
+ onBackground,
+ surface,
+ onSurface,
+ surfaceVariant,
+ onSurfaceVariant,
+ outline,
+ shadow,
+ inverseSurface,
+ onInverseSurface,
+ inversePrimary,
+ primaryVariant,
+ secondaryVariant,
+ ]);
}
@override
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
super.debugFillProperties(properties);
const ColorScheme defaultScheme = ColorScheme.light();
- properties.add(ColorProperty('primary', primary, defaultValue: defaultScheme.primary));
- properties.add(ColorProperty('primaryVariant', primaryVariant, defaultValue: defaultScheme.primaryVariant));
- properties.add(ColorProperty('secondary', secondary, defaultValue: defaultScheme.secondary));
- properties.add(ColorProperty('secondaryVariant', secondaryVariant, defaultValue: defaultScheme.secondaryVariant));
- properties.add(ColorProperty('surface', surface, defaultValue: defaultScheme.surface));
- properties.add(ColorProperty('background', background, defaultValue: defaultScheme.background));
- properties.add(ColorProperty('error', error, defaultValue: defaultScheme.error));
- properties.add(ColorProperty('onPrimary', onPrimary, defaultValue: defaultScheme.onPrimary));
- properties.add(ColorProperty('onSecondary', onSecondary, defaultValue: defaultScheme.onSecondary));
- properties.add(ColorProperty('onSurface', onSurface, defaultValue: defaultScheme.onSurface));
- properties.add(ColorProperty('onBackground', onBackground, defaultValue: defaultScheme.onBackground));
- properties.add(ColorProperty('onError', onError, defaultValue: defaultScheme.onError));
properties.add(DiagnosticsProperty<Brightness>('brightness', brightness, defaultValue: defaultScheme.brightness));
+ properties.add(ColorProperty('primary', primary, defaultValue: defaultScheme.primary));
+ properties.add(ColorProperty('onPrimary', onPrimary, defaultValue: defaultScheme.onPrimary));
+ properties.add(ColorProperty('primaryContainer', primaryContainer, defaultValue: defaultScheme.primaryContainer));
+ properties.add(ColorProperty('onPrimaryContainer', onPrimaryContainer, defaultValue: defaultScheme.onPrimaryContainer));
+ properties.add(ColorProperty('secondary', secondary, defaultValue: defaultScheme.secondary));
+ properties.add(ColorProperty('onSecondary', onSecondary, defaultValue: defaultScheme.onSecondary));
+ properties.add(ColorProperty('secondaryContainer', secondaryContainer, defaultValue: defaultScheme.secondaryContainer));
+ properties.add(ColorProperty('onSecondaryContainer', onSecondaryContainer, defaultValue: defaultScheme.onSecondaryContainer));
+ properties.add(ColorProperty('tertiary', tertiary, defaultValue: defaultScheme.tertiary));
+ properties.add(ColorProperty('onTertiary', onTertiary, defaultValue: defaultScheme.onTertiary));
+ properties.add(ColorProperty('tertiaryContainer', tertiaryContainer, defaultValue: defaultScheme.tertiaryContainer));
+ properties.add(ColorProperty('onTertiaryContainer', onTertiaryContainer, defaultValue: defaultScheme.onTertiaryContainer));
+ properties.add(ColorProperty('error', error, defaultValue: defaultScheme.error));
+ properties.add(ColorProperty('onError', onError, defaultValue: defaultScheme.onError));
+ properties.add(ColorProperty('errorContainer', errorContainer, defaultValue: defaultScheme.errorContainer));
+ properties.add(ColorProperty('onErrorContainer', onErrorContainer, defaultValue: defaultScheme.onErrorContainer));
+ properties.add(ColorProperty('background', background, defaultValue: defaultScheme.background));
+ properties.add(ColorProperty('onBackground', onBackground, defaultValue: defaultScheme.onBackground));
+ properties.add(ColorProperty('surface', surface, defaultValue: defaultScheme.surface));
+ properties.add(ColorProperty('onSurface', onSurface, defaultValue: defaultScheme.onSurface));
+ properties.add(ColorProperty('surfaceVariant', surfaceVariant, defaultValue: defaultScheme.surfaceVariant));
+ properties.add(ColorProperty('onSurfaceVariant', onSurfaceVariant, defaultValue: defaultScheme.onSurfaceVariant));
+ properties.add(ColorProperty('outline', outline, defaultValue: defaultScheme.outline));
+ properties.add(ColorProperty('shadow', shadow, defaultValue: defaultScheme.shadow));
+ properties.add(ColorProperty('inverseSurface', inverseSurface, defaultValue: defaultScheme.inverseSurface));
+ properties.add(ColorProperty('onInverseSurface', onInverseSurface, defaultValue: defaultScheme.onInverseSurface));
+ properties.add(ColorProperty('inversePrimary', inversePrimary, defaultValue: defaultScheme.inversePrimary));
+ properties.add(ColorProperty('primaryVariant', primaryVariant, defaultValue: defaultScheme.primaryVariant));
+ properties.add(ColorProperty('secondaryVariant', secondaryVariant, defaultValue: defaultScheme.secondaryVariant));
}
}
diff --git a/packages/flutter/test/material/color_scheme_test.dart b/packages/flutter/test/material/color_scheme_test.dart
index 2e2ea20..1020f02 100644
--- a/packages/flutter/test/material/color_scheme_test.dart
+++ b/packages/flutter/test/material/color_scheme_test.dart
@@ -9,76 +9,156 @@
test('light scheme matches the spec', () {
// Colors should match the Material Design baseline default theme:
// https://material.io/design/color/dark-theme.html#ui-application
+ // with the new Material 3 colors defaulting to values from the M2
+ // baseline.
const ColorScheme scheme = ColorScheme.light();
- expect(scheme.primary, const Color(0xff6200ee));
- expect(scheme.primaryVariant, const Color(0xff3700b3));
- expect(scheme.secondary, const Color(0xff03dac6));
- expect(scheme.secondaryVariant, const Color(0xff018786));
- expect(scheme.background, const Color(0xffffffff));
- expect(scheme.surface, const Color(0xffffffff));
- expect(scheme.error, const Color(0xffb00020));
- expect(scheme.onPrimary, const Color(0xffffffff));
- expect(scheme.onSecondary, const Color(0xff000000));
- expect(scheme.onBackground, const Color(0xff000000));
- expect(scheme.onSurface, const Color(0xff000000));
- expect(scheme.onError, const Color(0xffffffff));
expect(scheme.brightness, Brightness.light);
+ expect(scheme.primary, const Color(0xff6200ee));
+ expect(scheme.onPrimary, const Color(0xffffffff));
+ expect(scheme.primaryContainer, scheme.primary);
+ expect(scheme.onPrimaryContainer, scheme.onPrimary);
+ expect(scheme.secondary, const Color(0xff03dac6));
+ expect(scheme.onSecondary, const Color(0xff000000));
+ expect(scheme.secondaryContainer, scheme.secondary);
+ expect(scheme.onSecondaryContainer, scheme.onSecondary);
+ expect(scheme.tertiary, scheme.secondary);
+ expect(scheme.onTertiary, scheme.onSecondary);
+ expect(scheme.tertiaryContainer, scheme.tertiary);
+ expect(scheme.onTertiaryContainer, scheme.onTertiary);
+ expect(scheme.error, const Color(0xffb00020));
+ expect(scheme.onError, const Color(0xffffffff));
+ expect(scheme.errorContainer, scheme.error);
+ expect(scheme.onErrorContainer, scheme.onError);
+ expect(scheme.background, const Color(0xffffffff));
+ expect(scheme.onBackground, const Color(0xff000000));
+ expect(scheme.surface, const Color(0xffffffff));
+ expect(scheme.onSurface, const Color(0xff000000));
+ expect(scheme.surfaceVariant, scheme.surface);
+ expect(scheme.onSurfaceVariant, scheme.onSurface);
+ expect(scheme.outline, scheme.onBackground);
+ expect(scheme.shadow, scheme.onBackground);
+ expect(scheme.inverseSurface, scheme.onSurface);
+ expect(scheme.onInverseSurface, scheme.surface);
+ expect(scheme.inversePrimary, scheme.onPrimary);
+
+ expect(scheme.primaryVariant, const Color(0xff3700b3));
+ expect(scheme.secondaryVariant, const Color(0xff018786));
});
test('dark scheme matches the spec', () {
// Colors should match the Material Design baseline dark theme:
// https://material.io/design/color/dark-theme.html#ui-application
+ // with the new Material 3 colors defaulting to values from the M2
+ // baseline.
const ColorScheme scheme = ColorScheme.dark();
- expect(scheme.primary, const Color(0xffbb86fc));
- expect(scheme.primaryVariant, const Color(0xff3700b3));
- expect(scheme.secondary, const Color(0xff03dac6));
- expect(scheme.secondaryVariant, const Color(0xff03dac6));
- expect(scheme.background, const Color(0xff121212));
- expect(scheme.surface, const Color(0xff121212));
- expect(scheme.error, const Color(0xffcf6679));
- expect(scheme.onPrimary, const Color(0xff000000));
- expect(scheme.onSecondary, const Color(0xff000000));
- expect(scheme.onBackground, const Color(0xffffffff));
- expect(scheme.onSurface, const Color(0xffffffff));
- expect(scheme.onError, const Color(0xff000000));
expect(scheme.brightness, Brightness.dark);
+ expect(scheme.primary, const Color(0xffbb86fc));
+ expect(scheme.onPrimary, const Color(0xff000000));
+ expect(scheme.primaryContainer, scheme.primary);
+ expect(scheme.onPrimaryContainer, scheme.onPrimary);
+ expect(scheme.secondary, const Color(0xff03dac6));
+ expect(scheme.onSecondary, const Color(0xff000000));
+ expect(scheme.secondaryContainer, scheme.secondary);
+ expect(scheme.onSecondaryContainer, scheme.onSecondary);
+ expect(scheme.tertiary, scheme.secondary);
+ expect(scheme.onTertiary, scheme.onSecondary);
+ expect(scheme.tertiaryContainer, scheme.tertiary);
+ expect(scheme.onTertiaryContainer, scheme.onTertiary);
+ expect(scheme.error, const Color(0xffcf6679));
+ expect(scheme.onError, const Color(0xff000000));
+ expect(scheme.errorContainer, scheme.error);
+ expect(scheme.onErrorContainer, scheme.onError);
+ expect(scheme.background, const Color(0xff121212));
+ expect(scheme.onBackground, const Color(0xffffffff));
+ expect(scheme.surface, const Color(0xff121212));
+ expect(scheme.onSurface, const Color(0xffffffff));
+ expect(scheme.surfaceVariant, scheme.surface);
+ expect(scheme.onSurfaceVariant, scheme.onSurface);
+ expect(scheme.outline, scheme.onBackground);
+ expect(scheme.shadow, scheme.onBackground);
+ expect(scheme.inverseSurface, scheme.onSurface);
+ expect(scheme.onInverseSurface, scheme.surface);
+ expect(scheme.inversePrimary, scheme.onPrimary);
+
+ expect(scheme.primaryVariant, const Color(0xff3700b3));
+ expect(scheme.secondaryVariant, const Color(0xff03dac6));
});
test('high contrast light scheme matches the spec', () {
// Colors are based off of the Material Design baseline default theme:
// https://material.io/design/color/dark-theme.html#ui-application
+ // with the new Material 3 colors defaulting to values from the M2
+ // baseline.
const ColorScheme scheme = ColorScheme.highContrastLight();
- expect(scheme.primary, const Color(0xff0000ba));
- expect(scheme.primaryVariant, const Color(0xff000088));
- expect(scheme.secondary, const Color(0xff66fff9));
- expect(scheme.secondaryVariant, const Color(0xff018786));
- expect(scheme.background, const Color(0xffffffff));
- expect(scheme.surface, const Color(0xffffffff));
- expect(scheme.error, const Color(0xff790000));
- expect(scheme.onPrimary, const Color(0xffffffff));
- expect(scheme.onSecondary, const Color(0xff000000));
- expect(scheme.onBackground, const Color(0xff000000));
- expect(scheme.onSurface, const Color(0xff000000));
- expect(scheme.onError, const Color(0xffffffff));
expect(scheme.brightness, Brightness.light);
+ expect(scheme.primary, const Color(0xff0000ba));
+ expect(scheme.onPrimary, const Color(0xffffffff));
+ expect(scheme.primaryContainer, scheme.primary);
+ expect(scheme.onPrimaryContainer, scheme.onPrimary);
+ expect(scheme.secondary, const Color(0xff66fff9));
+ expect(scheme.onSecondary, const Color(0xff000000));
+ expect(scheme.secondaryContainer, scheme.secondary);
+ expect(scheme.onSecondaryContainer, scheme.onSecondary);
+ expect(scheme.tertiary, scheme.secondary);
+ expect(scheme.onTertiary, scheme.onSecondary);
+ expect(scheme.tertiaryContainer, scheme.tertiary);
+ expect(scheme.onTertiaryContainer, scheme.onTertiary);
+ expect(scheme.error, const Color(0xff790000));
+ expect(scheme.onError, const Color(0xffffffff));
+ expect(scheme.errorContainer, scheme.error);
+ expect(scheme.onErrorContainer, scheme.onError);
+ expect(scheme.background, const Color(0xffffffff));
+ expect(scheme.onBackground, const Color(0xff000000));
+ expect(scheme.surface, const Color(0xffffffff));
+ expect(scheme.onSurface, const Color(0xff000000));
+ expect(scheme.surfaceVariant, scheme.surface);
+ expect(scheme.onSurfaceVariant, scheme.onSurface);
+ expect(scheme.outline, scheme.onBackground);
+ expect(scheme.shadow, scheme.onBackground);
+ expect(scheme.inverseSurface, scheme.onSurface);
+ expect(scheme.onInverseSurface, scheme.surface);
+ expect(scheme.inversePrimary, scheme.onPrimary);
+
+ expect(scheme.primaryVariant, const Color(0xff000088));
+ expect(scheme.secondaryVariant, const Color(0xff018786));
});
test('high contrast dark scheme matches the spec', () {
// Colors are based off of the Material Design baseline dark theme:
// https://material.io/design/color/dark-theme.html#ui-application
+ // with the new Material 3 colors defaulting to values from the M2
+ // baseline.
const ColorScheme scheme = ColorScheme.highContrastDark();
- expect(scheme.primary, const Color(0xffefb7ff));
- expect(scheme.primaryVariant, const Color(0xffbe9eff));
- expect(scheme.secondary, const Color(0xff66fff9));
- expect(scheme.secondaryVariant, const Color(0xff66fff9));
- expect(scheme.background, const Color(0xff121212));
- expect(scheme.surface, const Color(0xff121212));
- expect(scheme.error, const Color(0xff9b374d));
- expect(scheme.onPrimary, const Color(0xff000000));
- expect(scheme.onSecondary, const Color(0xff000000));
- expect(scheme.onBackground, const Color(0xffffffff));
- expect(scheme.onSurface, const Color(0xffffffff));
- expect(scheme.onError, const Color(0xff000000));
expect(scheme.brightness, Brightness.dark);
+ expect(scheme.primary, const Color(0xffefb7ff));
+ expect(scheme.onPrimary, const Color(0xff000000));
+ expect(scheme.primaryContainer, scheme.primary);
+ expect(scheme.onPrimaryContainer, scheme.onPrimary);
+ expect(scheme.secondary, const Color(0xff66fff9));
+ expect(scheme.onSecondary, const Color(0xff000000));
+ expect(scheme.secondaryContainer, scheme.secondary);
+ expect(scheme.onSecondaryContainer, scheme.onSecondary);
+ expect(scheme.tertiary, scheme.secondary);
+ expect(scheme.onTertiary, scheme.onSecondary);
+ expect(scheme.tertiaryContainer, scheme.tertiary);
+ expect(scheme.onTertiaryContainer, scheme.onTertiary);
+ expect(scheme.error, const Color(0xff9b374d));
+ expect(scheme.onError, const Color(0xff000000));
+ expect(scheme.errorContainer, scheme.error);
+ expect(scheme.onErrorContainer, scheme.onError);
+ expect(scheme.background, const Color(0xff121212));
+ expect(scheme.onBackground, const Color(0xffffffff));
+ expect(scheme.surface, const Color(0xff121212));
+ expect(scheme.onSurface, const Color(0xffffffff));
+ expect(scheme.surfaceVariant, scheme.surface);
+ expect(scheme.onSurfaceVariant, scheme.onSurface);
+ expect(scheme.outline, scheme.onBackground);
+ expect(scheme.shadow, scheme.onBackground);
+ expect(scheme.inverseSurface, scheme.onSurface);
+ expect(scheme.onInverseSurface, scheme.surface);
+ expect(scheme.inversePrimary, scheme.onPrimary);
+
+ expect(scheme.primaryVariant, const Color(0xffbe9eff));
+ expect(scheme.secondaryVariant, const Color(0xff66fff9));
});
}
diff --git a/packages/flutter/test_fixes/material.dart b/packages/flutter/test_fixes/material.dart
index 99c875a..512e251 100644
--- a/packages/flutter/test_fixes/material.dart
+++ b/packages/flutter/test_fixes/material.dart
@@ -507,4 +507,15 @@
themeData = ThemeData.raw(primaryColorBrightness: Brightness.dark);
themeData = themeData.copyWith(primaryColorBrightness: Brightness.dark);
themeData.primaryColorBrightness; // Removing field reference not supported.
+
+ // Changes made in https://github.com/flutter/flutter/pull/93427
+ ColorScheme colorScheme = ColorScheme();
+ colorScheme = ColorScheme(primaryVariant: Colors.black, secondaryVariant: Colors.white);
+ colorScheme = ColorScheme.light(primaryVariant: Colors.black, secondaryVariant: Colors.white);
+ colorScheme = ColorScheme.dark(primaryVariant: Colors.black, secondaryVariant: Colors.white);
+ colorScheme = ColorScheme.highContrastLight(primaryVariant: Colors.black, secondaryVariant: Colors.white);
+ colorScheme = ColorScheme.highContrastDark(primaryVariant: Colors.black, secondaryVariant: Colors.white);
+ colorScheme = colorScheme.copyWith(primaryVariant: Colors.black, secondaryVariant: Colors.white);
+ colorScheme.primaryVariant;
+ colorScheme.secondaryVariant;
}
diff --git a/packages/flutter/test_fixes/material.dart.expect b/packages/flutter/test_fixes/material.dart.expect
index 07b27f1..82fb20f 100644
--- a/packages/flutter/test_fixes/material.dart.expect
+++ b/packages/flutter/test_fixes/material.dart.expect
@@ -480,4 +480,15 @@
themeData = ThemeData.raw();
themeData = themeData.copyWith();
themeData.primaryColorBrightness; // Removing field reference not supported.
+
+ // Changes made in https://github.com/flutter/flutter/pull/93427
+ ColorScheme colorScheme = ColorScheme();
+ colorScheme = ColorScheme();
+ colorScheme = ColorScheme.light();
+ colorScheme = ColorScheme.dark();
+ colorScheme = ColorScheme.highContrastLight();
+ colorScheme = ColorScheme.highContrastDark();
+ colorScheme = colorScheme.copyWith();
+ colorScheme.primaryContainer;
+ colorScheme.secondaryContainer;
}