The Material Design tokens updated the mapping of 4 color roles in light mode to be more visually appealing while retaining accessible contrast. Testing identified this change as non-breaking in Flutter, but some customers might notice this small change. The update affected the following color properties:
- Who is affected
- Applications and packages relying on the previous behaviour or signature. Code that uses ColorScheme.outline, ColorScheme.outlineVariant, Chip and related APIs.
- Practical impact
- Behaviour or API differences that can break builds or change runtime behaviour.
- What action should I take?
- Follow the official migration guide below, update affected call sites, run `dart fix --apply` where a fix is available, then run your tests.
Before and after (from the official guide)
| 1 | − | final ColorScheme colors = ThemeData().colorScheme; |
| 1 | + | final ColorScheme colors = ThemeData().colorScheme.copyWith( |
| 2 | + | onPrimaryContainer: const Color(0xFF21005D), |
| 3 | + | onSecondaryContainer: const Color(0xFF1D192B), |
| 4 | + | onTertiaryContainer: const Color(0xFF31111D), |
| 5 | + | onErrorContainer: const Color(0xFF410E0B), |
| 6 | + | ); |
Raw before / after
final ColorScheme colors = ThemeData().colorScheme;
final ColorScheme colors = ThemeData().colorScheme.copyWith( onPrimaryContainer: const Color(0xFF21005D), onSecondaryContainer: const Color(0xFF1D192B), onTertiaryContainer: const Color(0xFF31111D), onErrorContainer: const Color(0xFF410E0B), );
Official migration guide (excerpt, © The Flutter Authors, CC BY 3.0)
The differences in the mappings of the color roles are small.
Use ColorScheme.copyWith to revert to the original default colors:
Code before migration:
final ColorScheme colors = ThemeData().colorScheme;Code after migration:
final ColorScheme colors = ThemeData().colorScheme.copyWith(
onPrimaryContainer: const Color(0xFF21005D),
onSecondaryContainer: const Color(0xFF1D192B),
onTertiaryContainer: const Color(0xFF31111D),
onErrorContainer: const Color(0xFF410E0B),
);After applying the token update,
the default border color of M3 chips looks lighter.
Take ActionChip as an example:
Code before migration:
final chip = ActionChip(
label: const Text('action chip'),
onPressed: () {},
);Code after migration:
final chip = ChipTheme(
data: ChipThemeData(
side: BorderSide(
color: Theme.of(context).colorScheme.outline
),
),
child: ActionChip(
label: const Text('action chip'),
onPressed: () {}
)
);AI_PROVIDER (for example to openai-compatible with a local Ollama or LM Studio endpoint) to enable grounded explanations. Everything else on this page works without an AI provider.Listed in the official breaking-changes index (docs.flutter.dev/release/breaking-changes).
An official announcement or migration guide documents an intended behaviour or API change. A verified source change (git diff) shows code changed but does not by itself prove a public API is breaking. AI interpretations are labelled and never used to classify a change.
- Source commit
- b3045439b7c0
- Source last updated
- Oct 21, 2026
- Last synchronized
- Oct 21, 2026
- Publication status
- published
Publication history
- Oct 21, 2026, 8:31 PM: new → published (ingestion) — Backed by an official breaking-change/migration guide.
AI_PROVIDER (for example to openai-compatible with a local Ollama or LM Studio endpoint) to enable grounded explanations. Everything else on this page works without an AI provider.