The default text styles used for menus are updated to match the Material 3 specification.
Original behavior
The default text style for `MenuItemButton` (a widget used in a `MenuBar`, and in a menu created with `MenuAnchor`), and `DropdownMenuEntry` (in the `DropdownMenu`) is updated to match the Material 3 specification.
New behavior
The default text style for `MenuItemButton` (a widget used in a `MenuBar`, and in a menu created with `MenuAnchor`), and `DropdownMenuEntry` (in the `DropdownMenu`) is updated from `TextTheme.bodyLarge` to `TextTheme.labelLarge` for Material 3.
- Who is affected
- Applications and packages relying on the previous behaviour or signature. Code that uses MenuItemButton, MenuBar, MenuAnchor 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 | MenuItemButton( | |
| 2 | child: Text(MenuEntry.about.label), | |
| 3 | onPressed: () => _activate(MenuEntry.about), | |
| 4 | ), |
| 1 | MenuItemButton( | |
| 2 | + | style: MenuItemButton.styleFrom( |
| 3 | + | textStyle: Theme.of(context).textTheme.bodyLarge, |
| 4 | + | ), |
| 5 | child: Text(MenuEntry.about.label), | |
| 6 | onPressed: () => _activate(MenuEntry.about), | |
| 7 | ), |
Raw before / after
MenuItemButton( child: Text(MenuEntry.about.label), onPressed: () => _activate(MenuEntry.about), ),
MenuItemButton(
style: MenuItemButton.styleFrom(
textStyle: Theme.of(context).textTheme.bodyLarge,
),
child: Text(MenuEntry.about.label),
onPressed: () => _activate(MenuEntry.about),
),Official migration guide (excerpt, © The Flutter Authors, CC BY 3.0)
A MenuItemButton for Material 3 uses
TextTheme.labelLarge as the default text style.
To use the previous default text style, set the TextTheme.bodyLarge text style
in the MenuItemButton.style or MenuButtonThemeData.style properties.
Code before migration:
MenuItemButton(
child: Text(MenuEntry.about.label),
onPressed: () => _activate(MenuEntry.about),
),menuButtonTheme: MenuButtonThemeData(
style: MenuItemButton.styleFrom(
/// ...
),
),Code after migration:
MenuItemButton(
style: MenuItemButton.styleFrom(
textStyle: Theme.of(context).textTheme.bodyLarge,
),
child: Text(MenuEntry.about.label),
onPressed: () => _activate(MenuEntry.about),
),menuButtonTheme: MenuButtonThemeData(
style: MenuItemButton.styleFrom(
textStyle: Theme.of(context).textTheme.bodyLarge,
),
),A DropdownMenu's TextField for Material 3
uses TextTheme.bodyLarge as the default text style.
To use the previous default text style,
set the TextTheme.labelLarge text style in
the DropdownMenu.textStyle or DropdownMenuThemeData.textStyle properties.
Code before migration:
DropdownMenu<ColorLabel>(
initialSelection: ColorLabel.green,
controller: colorController,
label: const Text('Color'),
dropdownMenuEntries: colorEntries,
onSelected: (ColorLabel? color) {
setState(() {
selectedColor = color;
});
},
),dropdownMenuTheme: DropdownMenuThemeData(
/// ...
),Code after migration:
DropdownMenu<ColorLabel>(
textStyle: Theme.of(context).textTheme.labelLarge,
initialSelection: ColorLabel.green,
controller: colorController,
label: const Text('Color'),
dropdownMenuEntries: colorEntries,
onSelected: (ColorLabel? color) {
setState(() {
selectedColor = color;
});
},
),dropdownMenuTheme: DropdownMenuThemeData(
textStyle: TextStyle(
fontStyle: FontStyle.italic,
fontWeight: FontWeight.bold,
),
),A DropdownMenu's DropdownMenuEntry for Material 3
uses TextTheme.labelLarge as the default text style.
To use the previous default text style, set the
TextTheme.bodyLarge text style in
the DropdownMenuEntry.style or MenuButtonThemeData.style properties.
Code before migration:
DropdownMenuEntry<ColorLabel>(
value: color,
label: color.label,
),menuButtonTheme: MenuButtonThemeData(
style: MenuItemButton.styleFrom(
/// ...
),
),Code after migration:
DropdownMenuEntry<ColorLabel>(
style: MenuItemButton.styleFrom(
textStyle: Theme.of(context).textTheme.bodyLarge,
),
value: color,
label: color.label,
),menuButtonTheme: MenuButtonThemeData(
style: MenuItemButton.styleFrom(
textStyle: Theme.of(context).textTheme.bodyLarge,
),
),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.