Skip to content
Boring Doc
BreakingHigh impactOfficial migration guidesince 2.0.0landed 1.23.0-7.0.pre

Material Chip button semantics

Framework · Official source

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)

dart+1−4
Before
1 Widget myInputChip = InputChip(
2 onPressed: () {},
3− label: Semantics(
4− button: true,
5− child: Text('My Input Chip'),
6− ),
7 );
After
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'),
  ),
);
Migration assistantAI-generated · grounded in cited sources
AI explanations are not configured
Set 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.
Official migration guide·Verified classification (95%)

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 explanationAI-generated · grounded in cited sources
AI explanations are not configured
Set 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.
Was this useful?