Skip to content

Commit fdb17ab

Browse files
authored
Reland [a11y] Add isEnabled semantics flag to text field (#143601)
Reland #143334
1 parent 2c2fed1 commit fdb17ab

7 files changed

Lines changed: 94 additions & 16 deletions

File tree

packages/flutter/lib/src/material/text_field.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1574,6 +1574,7 @@ class _TextFieldState extends State<TextField> with RestorationMixin implements
15741574
animation: controller, // changes the _currentLength
15751575
builder: (BuildContext context, Widget? child) {
15761576
return Semantics(
1577+
enabled: _isEnabled,
15771578
maxValueLength: semanticsMaxValueLength,
15781579
currentValueLength: _currentLength,
15791580
onTap: widget.readOnly ? null : () {

packages/flutter/test/cupertino/text_field_test.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -529,8 +529,11 @@ void main() {
529529
children: <TestSemantics>[
530530
TestSemantics(
531531
id: 4,
532-
flags: <SemanticsFlag>[SemanticsFlag.isTextField,
533-
SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled,],
532+
flags: <SemanticsFlag>[
533+
SemanticsFlag.isTextField,
534+
SemanticsFlag.hasEnabledState,
535+
SemanticsFlag.isEnabled,
536+
],
534537
actions: <SemanticsAction>[SemanticsAction.tap,
535538
SemanticsAction.didGainAccessibilityFocus,],
536539
textDirection: TextDirection.ltr,

packages/flutter/test/material/input_date_picker_form_field_test.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,8 @@ void main() {
279279
expect(tester.getSemantics(find.byType(EditableText)), matchesSemantics(
280280
label: 'Enter Date',
281281
isTextField: true,
282+
hasEnabledState: true,
283+
isEnabled: true,
282284
isFocused: true,
283285
value: '01/15/2016',
284286
hasTapAction: true,

packages/flutter/test/material/search_test.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -670,6 +670,8 @@ void main() {
670670
id: 9,
671671
flags: <SemanticsFlag>[
672672
SemanticsFlag.isTextField,
673+
SemanticsFlag.hasEnabledState,
674+
SemanticsFlag.isEnabled,
673675
SemanticsFlag.isFocused,
674676
SemanticsFlag.isHeader,
675677
if (debugDefaultTargetPlatformOverride != TargetPlatform.iOS &&
@@ -818,6 +820,8 @@ void main() {
818820
id: 11,
819821
flags: <SemanticsFlag>[
820822
SemanticsFlag.isTextField,
823+
SemanticsFlag.hasEnabledState,
824+
SemanticsFlag.isEnabled,
821825
SemanticsFlag.isFocused,
822826
SemanticsFlag.isHeader,
823827
if (debugDefaultTargetPlatformOverride != TargetPlatform.iOS &&

packages/flutter/test/material/text_field_test.dart

Lines changed: 65 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -746,7 +746,7 @@ void main() {
746746
children: <TestSemantics>[
747747
TestSemantics(
748748
id: 4,
749-
flags: <SemanticsFlag>[SemanticsFlag.isTextField],
749+
flags: <SemanticsFlag>[SemanticsFlag.isTextField, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled],
750750
actions: <SemanticsAction>[
751751
SemanticsAction.tap,
752752
SemanticsAction.didGainAccessibilityFocus,
@@ -1856,7 +1856,12 @@ void main() {
18561856
children: <TestSemantics>[
18571857
TestSemantics(
18581858
id: 1,
1859-
flags: <SemanticsFlag>[SemanticsFlag.isTextField, SemanticsFlag.isFocused],
1859+
flags: <SemanticsFlag>[
1860+
SemanticsFlag.isTextField,
1861+
SemanticsFlag.hasEnabledState,
1862+
SemanticsFlag.isEnabled,
1863+
SemanticsFlag.isFocused,
1864+
],
18601865
actions: <SemanticsAction>[
18611866
SemanticsAction.tap,
18621867
SemanticsAction.moveCursorBackwardByCharacter,
@@ -5189,6 +5194,8 @@ void main() {
51895194
],
51905195
flags: <SemanticsFlag>[
51915196
SemanticsFlag.isTextField,
5197+
SemanticsFlag.hasEnabledState,
5198+
SemanticsFlag.isEnabled,
51925199
],
51935200
),
51945201
TestSemantics.rootChild(
@@ -6530,7 +6537,7 @@ void main() {
65306537
),
65316538
);
65326539

6533-
expect(semantics, includesNodeWith(flags: <SemanticsFlag>[SemanticsFlag.isTextField]));
6540+
expect(semantics, includesNodeWith(flags: <SemanticsFlag>[SemanticsFlag.isTextField, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled]));
65346541

65356542
semantics.dispose();
65366543
});
@@ -6944,7 +6951,7 @@ void main() {
69446951
);
69456952

69466953
expect(semantics, includesNodeWith(
6947-
flags: <SemanticsFlag>[SemanticsFlag.isTextField],
6954+
flags: <SemanticsFlag>[SemanticsFlag.isTextField, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled],
69486955
maxValueLength: 10,
69496956
currentValueLength: 0,
69506957
));
@@ -6959,7 +6966,12 @@ void main() {
69596966
await tester.pump();
69606967

69616968
expect(semantics, includesNodeWith(
6962-
flags: <SemanticsFlag>[SemanticsFlag.isTextField, SemanticsFlag.isFocused],
6969+
flags: <SemanticsFlag>[
6970+
SemanticsFlag.isTextField,
6971+
SemanticsFlag.hasEnabledState,
6972+
SemanticsFlag.isEnabled,
6973+
SemanticsFlag.isFocused,
6974+
],
69636975
maxValueLength: 10,
69646976
currentValueLength: 3,
69656977
));
@@ -6985,7 +6997,12 @@ void main() {
69856997

69866998
expect(
69876999
semantics,
6988-
includesNodeWith(flags: <SemanticsFlag>[SemanticsFlag.isTextField, SemanticsFlag.isReadOnly]),
7000+
includesNodeWith(flags: <SemanticsFlag>[
7001+
SemanticsFlag.isTextField,
7002+
SemanticsFlag.hasEnabledState,
7003+
SemanticsFlag.isEnabled,
7004+
SemanticsFlag.isReadOnly,
7005+
]),
69897006
);
69907007

69917008
semantics.dispose();
@@ -8011,6 +8028,8 @@ void main() {
80118028
],
80128029
flags: <SemanticsFlag>[
80138030
SemanticsFlag.isTextField,
8031+
SemanticsFlag.hasEnabledState,
8032+
SemanticsFlag.isEnabled,
80148033
],
80158034
),
80168035
],
@@ -8030,6 +8049,8 @@ void main() {
80308049
],
80318050
flags: <SemanticsFlag>[
80328051
SemanticsFlag.isTextField,
8052+
SemanticsFlag.hasEnabledState,
8053+
SemanticsFlag.isEnabled,
80338054
],
80348055
),
80358056
],
@@ -8055,6 +8076,8 @@ void main() {
80558076
],
80568077
flags: <SemanticsFlag>[
80578078
SemanticsFlag.isTextField,
8079+
SemanticsFlag.hasEnabledState,
8080+
SemanticsFlag.isEnabled,
80588081
SemanticsFlag.isFocused,
80598082
],
80608083
),
@@ -8083,6 +8106,8 @@ void main() {
80838106
],
80848107
flags: <SemanticsFlag>[
80858108
SemanticsFlag.isTextField,
8109+
SemanticsFlag.hasEnabledState,
8110+
SemanticsFlag.isEnabled,
80868111
SemanticsFlag.isFocused,
80878112
],
80888113
),
@@ -8110,6 +8135,8 @@ void main() {
81108135
],
81118136
flags: <SemanticsFlag>[
81128137
SemanticsFlag.isTextField,
8138+
SemanticsFlag.hasEnabledState,
8139+
SemanticsFlag.isEnabled,
81138140
SemanticsFlag.isFocused,
81148141
],
81158142
),
@@ -8135,6 +8162,8 @@ void main() {
81358162
textDirection: TextDirection.ltr,
81368163
flags: <SemanticsFlag>[
81378164
SemanticsFlag.isTextField,
8165+
SemanticsFlag.hasEnabledState,
8166+
SemanticsFlag.isEnabled,
81388167
],
81398168
value: 'Hello',
81408169
)
@@ -8150,6 +8179,8 @@ void main() {
81508179
textDirection: TextDirection.ltr,
81518180
flags: <SemanticsFlag>[
81528181
SemanticsFlag.isTextField,
8182+
SemanticsFlag.hasEnabledState,
8183+
SemanticsFlag.isEnabled,
81538184
SemanticsFlag.isObscured,
81548185
],
81558186
)
@@ -8165,6 +8196,8 @@ void main() {
81658196
textDirection: TextDirection.ltr,
81668197
flags: <SemanticsFlag>[
81678198
SemanticsFlag.isTextField,
8199+
SemanticsFlag.hasEnabledState,
8200+
SemanticsFlag.isEnabled,
81688201
],
81698202
value: 'Hello',
81708203
)
@@ -8207,6 +8240,8 @@ void main() {
82078240
],
82088241
flags: <SemanticsFlag>[
82098242
SemanticsFlag.isTextField,
8243+
SemanticsFlag.hasEnabledState,
8244+
SemanticsFlag.isEnabled,
82108245
SemanticsFlag.isFocused,
82118246
],
82128247
),
@@ -8242,6 +8277,8 @@ void main() {
82428277
],
82438278
flags: <SemanticsFlag>[
82448279
SemanticsFlag.isTextField,
8280+
SemanticsFlag.hasEnabledState,
8281+
SemanticsFlag.isEnabled,
82458282
],
82468283
),
82478284
],
@@ -8268,6 +8305,8 @@ void main() {
82688305
],
82698306
flags: <SemanticsFlag>[
82708307
SemanticsFlag.isTextField,
8308+
SemanticsFlag.hasEnabledState,
8309+
SemanticsFlag.isEnabled,
82718310
SemanticsFlag.isFocused,
82728311
],
82738312
),
@@ -8298,6 +8337,8 @@ void main() {
82988337
],
82998338
flags: <SemanticsFlag>[
83008339
SemanticsFlag.isTextField,
8340+
SemanticsFlag.hasEnabledState,
8341+
SemanticsFlag.isEnabled,
83018342
SemanticsFlag.isFocused,
83028343
],
83038344
),
@@ -8347,6 +8388,8 @@ void main() {
83478388
],
83488389
flags: <SemanticsFlag>[
83498390
SemanticsFlag.isTextField,
8391+
SemanticsFlag.hasEnabledState,
8392+
SemanticsFlag.isEnabled,
83508393
SemanticsFlag.isFocused,
83518394
],
83528395
),
@@ -8395,6 +8438,8 @@ void main() {
83958438
],
83968439
flags: <SemanticsFlag>[
83978440
SemanticsFlag.isTextField,
8441+
SemanticsFlag.hasEnabledState,
8442+
SemanticsFlag.isEnabled,
83988443
SemanticsFlag.isFocused,
83998444
],
84008445
),
@@ -8431,7 +8476,7 @@ void main() {
84318476
children: <TestSemantics>[
84328477
TestSemantics(
84338478
id: inputFieldId,
8434-
flags: <SemanticsFlag>[SemanticsFlag.isTextField],
8479+
flags: <SemanticsFlag>[SemanticsFlag.isTextField, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled],
84358480
actions: <SemanticsAction>[SemanticsAction.tap],
84368481
value: textInTextField,
84378482
textDirection: TextDirection.ltr,
@@ -8451,6 +8496,8 @@ void main() {
84518496
id: inputFieldId,
84528497
flags: <SemanticsFlag>[
84538498
SemanticsFlag.isTextField,
8499+
SemanticsFlag.hasEnabledState,
8500+
SemanticsFlag.isEnabled,
84548501
SemanticsFlag.isFocused,
84558502
],
84568503
actions: <SemanticsAction>[
@@ -8504,7 +8551,7 @@ void main() {
85048551
children: <TestSemantics>[
85058552
TestSemantics(
85068553
id: inputFieldId,
8507-
flags: <SemanticsFlag>[SemanticsFlag.isTextField],
8554+
flags: <SemanticsFlag>[SemanticsFlag.isTextField, SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled],
85088555
actions: <SemanticsAction>[SemanticsAction.tap],
85098556
value: textInTextField,
85108557
textDirection: TextDirection.ltr,
@@ -8524,6 +8571,8 @@ void main() {
85248571
id: inputFieldId,
85258572
flags: <SemanticsFlag>[
85268573
SemanticsFlag.isTextField,
8574+
SemanticsFlag.hasEnabledState,
8575+
SemanticsFlag.isEnabled,
85278576
SemanticsFlag.isFocused,
85288577
],
85298578
actions: <SemanticsAction>[
@@ -8704,6 +8753,8 @@ void main() {
87048753
],
87058754
flags: <SemanticsFlag>[
87068755
SemanticsFlag.isTextField,
8756+
SemanticsFlag.hasEnabledState,
8757+
SemanticsFlag.isEnabled,
87078758
],
87088759
children: <TestSemantics>[
87098760
TestSemantics(
@@ -8739,6 +8790,8 @@ void main() {
87398790
],
87408791
flags: <SemanticsFlag>[
87418792
SemanticsFlag.isTextField,
8793+
SemanticsFlag.hasEnabledState,
8794+
SemanticsFlag.isEnabled,
87428795
SemanticsFlag.isFocused,
87438796
],
87448797
children: <TestSemantics>[
@@ -8796,6 +8849,8 @@ void main() {
87968849
],
87978850
flags: <SemanticsFlag>[
87988851
SemanticsFlag.isTextField,
8852+
SemanticsFlag.hasEnabledState,
8853+
SemanticsFlag.isEnabled,
87998854
],
88008855
children: <TestSemantics>[
88018856
TestSemantics(
@@ -8843,6 +8898,8 @@ void main() {
88438898
],
88448899
flags: <SemanticsFlag>[
88458900
SemanticsFlag.isTextField,
8901+
SemanticsFlag.hasEnabledState,
8902+
SemanticsFlag.isEnabled,
88468903
],
88478904
children: <TestSemantics>[
88488905
TestSemantics(

packages/flutter/test/material/time_picker_test.dart

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1343,7 +1343,12 @@ void main() {
13431343
label: 'Hour',
13441344
value: '07',
13451345
actions: <SemanticsAction>[SemanticsAction.tap],
1346-
flags: <SemanticsFlag>[SemanticsFlag.isTextField, SemanticsFlag.isMultiline],
1346+
flags: <SemanticsFlag>[
1347+
SemanticsFlag.isTextField,
1348+
SemanticsFlag.hasEnabledState,
1349+
SemanticsFlag.isEnabled,
1350+
SemanticsFlag.isMultiline,
1351+
],
13471352
),
13481353
);
13491354
expect(
@@ -1352,7 +1357,12 @@ void main() {
13521357
label: 'Minute',
13531358
value: '00',
13541359
actions: <SemanticsAction>[SemanticsAction.tap],
1355-
flags: <SemanticsFlag>[SemanticsFlag.isTextField, SemanticsFlag.isMultiline],
1360+
flags: <SemanticsFlag>[
1361+
SemanticsFlag.isTextField,
1362+
SemanticsFlag.hasEnabledState,
1363+
SemanticsFlag.isEnabled,
1364+
SemanticsFlag.isMultiline,
1365+
],
13561366
),
13571367
);
13581368

packages/flutter_test/test/controller_test.dart

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -883,6 +883,7 @@ void main() {
883883
group('simulatedTraversal', () {
884884
final List<Matcher> fullTraversalMatchers = <Matcher>[
885885
containsSemantics(isHeader: true, label: 'Semantics Test'),
886+
containsSemantics(label: 'Text Field'),
886887
containsSemantics(isTextField: true),
887888
containsSemantics(label: 'Off Switch'),
888889
containsSemantics(hasToggledState: true),
@@ -913,7 +914,7 @@ void main() {
913914
await tester.pumpWidget(const MaterialApp(home: _SemanticsTestWidget()));
914915

915916
// We're expecting the traversal to start where the slider is.
916-
final List<Matcher> expectedMatchers = <Matcher>[...fullTraversalMatchers]..removeRange(0, 8);
917+
final List<Matcher> expectedMatchers = <Matcher>[...fullTraversalMatchers]..removeRange(0, 9);
917918

918919
expect(
919920
tester.semantics.simulatedAccessibilityTraversal(start: find.byType(Slider)),
@@ -988,7 +989,7 @@ void main() {
988989
await tester.pumpWidget(const MaterialApp(home: _SemanticsTestWidget()));
989990

990991
// We're expecting the traversal to end where the slider is, inclusive.
991-
final Iterable<Matcher> expectedMatchers = <Matcher>[...fullTraversalMatchers].getRange(0, 9);
992+
final Iterable<Matcher> expectedMatchers = <Matcher>[...fullTraversalMatchers].getRange(0, 10);
992993

993994
expect(
994995
tester.semantics.simulatedAccessibilityTraversal(end: find.byType(Slider)),
@@ -1049,7 +1050,7 @@ void main() {
10491050
await tester.pumpWidget(const MaterialApp(home: _SemanticsTestWidget()));
10501051

10511052
// We're expecting the traversal to start at the text field and end at the slider.
1052-
final Iterable<Matcher> expectedMatchers = <Matcher>[...fullTraversalMatchers].getRange(1, 9);
1053+
final Iterable<Matcher> expectedMatchers = <Matcher>[...fullTraversalMatchers].getRange(1, 10);
10531054

10541055
expect(
10551056
tester.semantics.simulatedAccessibilityTraversal(
@@ -1777,7 +1778,7 @@ class _SemanticsTestWidget extends StatelessWidget {
17771778
child: Column(
17781779
children: <Widget>[
17791780
const _SemanticsTestCard(
1780-
label: 'TextField',
1781+
label: 'Text Field',
17811782
widget: TextField(),
17821783
),
17831784
_SemanticsTestCard(

0 commit comments

Comments
 (0)