diff --git a/packages/material_ui/lib/src/search_anchor.dart b/packages/material_ui/lib/src/search_anchor.dart index 845de4d3ddb1..0dcf7ef3123e 100644 --- a/packages/material_ui/lib/src/search_anchor.dart +++ b/packages/material_ui/lib/src/search_anchor.dart @@ -606,7 +606,12 @@ class _SearchAnchorState extends State { duration: _kAnchorFadeDuration, child: IgnorePointer( ignoring: !widget.enabled, - child: GestureDetector(onTap: _openView, child: widget.builder(context, _searchController)), + child: GestureDetector( + // Avoid providing duplicate semantics actions. + excludeFromSemantics: true, + onTap: _openView, + child: widget.builder(context, _searchController), + ), ), ); } @@ -1825,6 +1830,10 @@ class _SearchBarState extends State { child: IgnorePointer( ignoring: !widget.enabled, child: InkWell( + canRequestFocus: false, + // Avoid providing duplicate semantics actions that the TextField + // already provides. + excludeFromSemantics: true, onTap: () { widget.onTap?.call(); if (!_focusNode.hasFocus) { diff --git a/packages/material_ui/pending_changelogs/change_2026_08_27_search_bar_semantics.yaml b/packages/material_ui/pending_changelogs/change_2026_08_27_search_bar_semantics.yaml new file mode 100644 index 000000000000..a353e374d3f8 --- /dev/null +++ b/packages/material_ui/pending_changelogs/change_2026_08_27_search_bar_semantics.yaml @@ -0,0 +1,3 @@ +changelog: | + - Fixes unlabeled tap target semantics in `SearchBar`. +version: patch diff --git a/packages/material_ui/test/search_anchor_test.dart b/packages/material_ui/test/search_anchor_test.dart index d810d74dce07..cb7a1fb8454d 100644 --- a/packages/material_ui/test/search_anchor_test.dart +++ b/packages/material_ui/test/search_anchor_test.dart @@ -3407,6 +3407,49 @@ void main() { semantics.dispose(); }); + testWidgets('SearchBar meets labeledTapTargetGuideline', (WidgetTester tester) async { + final semantics = SemanticsTester(tester); + await tester.pumpWidget( + MaterialApp( + home: Material( + child: Center( + child: SearchBar( + hintText: 'Search...', + trailing: [ + IconButton(tooltip: 'Clear', icon: const Icon(Icons.clear), onPressed: () {}), + ], + ), + ), + ), + ), + ); + + await expectLater(tester, meetsGuideline(labeledTapTargetGuideline)); + semantics.dispose(); + }); + + testWidgets('SearchAnchor.bar meets labeledTapTargetGuideline', (WidgetTester tester) async { + final semantics = SemanticsTester(tester); + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: SearchAnchor.bar( + barHintText: 'Search...', + barTrailing: [ + IconButton(tooltip: 'Clear', icon: const Icon(Icons.clear), onPressed: () {}), + ], + suggestionsBuilder: (BuildContext context, SearchController controller) { + return []; + }, + ), + ), + ), + ); + + await expectLater(tester, meetsGuideline(labeledTapTargetGuideline)); + semantics.dispose(); + }); + testWidgets('Check SearchBar opacity when disabled', (WidgetTester tester) async { await tester.pumpWidget( const MaterialApp(