Flutter now applies the semantic label of `button` to all interactive Material Chips for accessibility purposes.
Original behavior
Interactive Material Chips (namely `ActionChip`, `ChoiceChip`, `FilterChip`, and `InputChip`) are now semantically marked as being buttons. However, the non-interactive information `Chip` is not.
New behavior
The outermost `Semantics` widget that wraps all Chip classes to describe their semantic properties is modified.
- Who is affected
- Applications and packages relying on the previous behaviour or signature. Code that uses ActionChip, ChoiceChip, FilterChip 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 | Widget myInputChip = InputChip( | |
| 2 | onPressed: () {}, | |
| 3 | − | label: Semantics( |
| 4 | − | button: true, |
| 5 | − | child: Text('My Input Chip'), |
| 6 | − | ), |
| 7 | ); |
| 1 | Widget myInputChip = InputChip( | |
| 2 | onPressed: () {}, | |
| 3 | + | label: Text('My Input Chip'), |
| 4 | ); |
Raw before / after
Widget myInputChip = InputChip(
onPressed: () {},
label: Semantics(
button: true,
child: Text('My Input Chip'),
),
);Widget myInputChip = InputChip(
onPressed: () {},
label: Text('My Input Chip'),
);Official migration guide (excerpt, © The Flutter Authors, CC BY 3.0)
You might not need to perform any migration.
This change only affects you if you worked around
the issue of Material Chips missing button semantics by
wrapping the widget given to the label field of a
Chip with a Semantics widget marked as
button: true. In this case, the inner and outer button
semantics conflict, resulting in the tappable area
of the button shrinking down to the size of the label
after this change is introduced. Fix this issue
either by deleting that Semantics widget and replacing
it with its child, or by removing the button: true
property if other semantic properties still
need to be applied to the label widget of the Chip.
The following snippets use [InputChip][] as an example,
but the same process applies to [ActionChip][],
[ChoiceChip][], and [FilterChip][] as well.
Case 1: Remove the Semantics widget.
Code before migration:
Widget myInputChip = InputChip(
onPressed: () {},
label: Semantics(
button: true,
child: Text('My Input Chip'),
),
);Code after migration:
Widget myInputChip = InputChip(
onPressed: () {},
label: Text('My Input Chip'),
);Case 2: Remove button:true from the Semantics widget.
Code before migration:
Widget myInputChip = InputChip(
onPressed: () {},
label: Semantics(
button: true,
hint: 'Example Hint',
child: Text('My Input Chip'),
),
);Code after migration:
Widget myInputChip = InputChip(
onPressed: () {},
label: Semantics(
hint: 'Example Hint',
child: Text('My Input Chip'),
),
);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.
- Official migration guide
- Material Buttons
- Material Chips
- Semantics
- SemanticsProperties.button
- SemanticsProperties.enabled
- Issue 58010
- PR 60141
- PR 60645
- PR 61048
- 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.