diff --git a/packages/flutter/lib/src/material/chip.dart b/packages/flutter/lib/src/material/chip.dart index d31a6ab63d71d..bfd74e5ee4edf 100644 --- a/packages/flutter/lib/src/material/chip.dart +++ b/packages/flutter/lib/src/material/chip.dart @@ -1944,9 +1944,10 @@ class _RawChipState extends State with TickerProviderStateMixin[ + SemanticsFlag.hasEnabledState, + SemanticsFlag.isButton, + ], ), ], ), @@ -1662,6 +1666,10 @@ void main() { TestSemantics( label: 'test', textDirection: TextDirection.ltr, + flags: [ + SemanticsFlag.hasEnabledState, + SemanticsFlag.isButton, + ], children: [ TestSemantics( label: 'Delete', @@ -1712,6 +1720,7 @@ void main() { textDirection: TextDirection.ltr, flags: [ SemanticsFlag.hasEnabledState, + SemanticsFlag.isButton, SemanticsFlag.isEnabled, SemanticsFlag.isFocusable, ], @@ -1763,6 +1772,7 @@ void main() { textDirection: TextDirection.ltr, flags: [ SemanticsFlag.hasEnabledState, + SemanticsFlag.isButton, SemanticsFlag.isEnabled, SemanticsFlag.isFocusable, ], @@ -1808,6 +1818,7 @@ void main() { textDirection: TextDirection.ltr, flags: [ SemanticsFlag.hasEnabledState, + SemanticsFlag.isButton, SemanticsFlag.isEnabled, SemanticsFlag.isFocusable, SemanticsFlag.isSelected, @@ -1853,7 +1864,10 @@ void main() { TestSemantics( label: 'test', textDirection: TextDirection.ltr, - flags: [], + flags: [ + SemanticsFlag.hasEnabledState, + SemanticsFlag.isButton, + ], actions: [], ), ], @@ -1867,6 +1881,140 @@ void main() { semanticsTester.dispose(); }); + + testWidgets('tapEnabled explicitly false', (WidgetTester tester) async { + final SemanticsTester semanticsTester = SemanticsTester(tester); + + await tester.pumpWidget(const MaterialApp( + home: Material( + child: RawChip( + tapEnabled: false, + label: Text('test'), + ), + ), + )); + + expect(semanticsTester, hasSemantics( + TestSemantics.root( + children: [ + TestSemantics( + textDirection: TextDirection.ltr, + children: [ + TestSemantics( + children: [ + TestSemantics( + flags: [SemanticsFlag.scopesRoute], + children: [ + TestSemantics( + label: 'test', + textDirection: TextDirection.ltr, + flags: [], // Must not be a button when tapping is disabled. + actions: [], + ), + ], + ), + ], + ), + ], + ), + ], + ), ignoreTransform: true, ignoreId: true, ignoreRect: true)); + + semanticsTester.dispose(); + }); + + testWidgets('enabled when tapEnabled and canTap', (WidgetTester tester) async { + final SemanticsTester semanticsTester = SemanticsTester(tester); + + // These settings make a Chip which can be tapped, both in general and at this moment. + await tester.pumpWidget(MaterialApp( + home: Material( + child: RawChip( + isEnabled: true, + tapEnabled: true, + onPressed: () {}, + label: const Text('test'), + ), + ), + )); + + expect(semanticsTester, hasSemantics( + TestSemantics.root( + children: [ + TestSemantics( + textDirection: TextDirection.ltr, + children: [ + TestSemantics( + children: [ + TestSemantics( + flags: [SemanticsFlag.scopesRoute], + children: [ + TestSemantics( + label: 'test', + textDirection: TextDirection.ltr, + flags: [ + SemanticsFlag.hasEnabledState, + SemanticsFlag.isButton, + SemanticsFlag.isEnabled, + SemanticsFlag.isFocusable, + ], + actions: [SemanticsAction.tap], + ), + ], + ), + ], + ), + ], + ), + ], + ), ignoreTransform: true, ignoreId: true, ignoreRect: true)); + + semanticsTester.dispose(); + }); + + testWidgets('disabled when tapEnabled but not canTap', (WidgetTester tester) async { + final SemanticsTester semanticsTester = SemanticsTester(tester); + // These settings make a Chip which _could_ be tapped, but not currently (ensures `canTap == false`). + await tester.pumpWidget(const MaterialApp( + home: Material( + child: RawChip( + isEnabled: true, + tapEnabled: true, + label: Text('test'), + ), + ), + )); + + expect(semanticsTester, hasSemantics( + TestSemantics.root( + children: [ + TestSemantics( + textDirection: TextDirection.ltr, + children: [ + TestSemantics( + children: [ + TestSemantics( + flags: [SemanticsFlag.scopesRoute], + children: [ + TestSemantics( + label: 'test', + textDirection: TextDirection.ltr, + flags: [ + SemanticsFlag.hasEnabledState, + SemanticsFlag.isButton, + ], + ), + ], + ), + ], + ), + ], + ), + ], + ), ignoreTransform: true, ignoreId: true, ignoreRect: true)); + + semanticsTester.dispose(); + }); }); testWidgets('can be tapped outside of chip delete icon', (WidgetTester tester) async {