Skip to content

Commit 119f170

Browse files
Renzo-OlivaresRenzo Olivares
andauthored
CupertinoTextField accessibility behavior on Linux should match TextField (flutter#159823)
While going through `TextField` and `CupertinoTextField` I noticed flutter#94898 and flutter#129652 did not make it over to `CupertinoTextField`. This PR brings over those changes to `CupertinoTextField`. On Linux after this change the `CupertinoTextField` now focuses when gaining a11y focus, and unfocuses when losing a11y focus. ## Pre-launch Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [x] I signed the [CLA]. - [x] I listed at least one issue that this PR fixes in the description above. - [x] I updated/added relevant documentation (doc comments with `///`). - [x] I added new tests to check the change I am making, or this PR is [test-exempt]. - [x] I followed the [breaking change policy] and added [Data Driven Fixes] where supported. - [x] All existing and new tests are passing. Co-authored-by: Renzo Olivares <[email protected]>
1 parent fe0e219 commit 119f170

File tree

2 files changed

+26
-8
lines changed

2 files changed

+26
-8
lines changed

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1304,13 +1304,13 @@ class _CupertinoTextFieldState extends State<CupertinoTextField> with Restoratio
13041304

13051305
TextSelectionControls? textSelectionControls = widget.selectionControls;
13061306
VoidCallback? handleDidGainAccessibilityFocus;
1307+
VoidCallback? handleDidLoseAccessibilityFocus;
13071308
switch (defaultTargetPlatform) {
13081309
case TargetPlatform.iOS:
13091310
case TargetPlatform.android:
13101311
case TargetPlatform.fuchsia:
1311-
case TargetPlatform.linux:
13121312
textSelectionControls ??= cupertinoTextSelectionHandleControls;
1313-
1313+
case TargetPlatform.linux:
13141314
case TargetPlatform.macOS:
13151315
case TargetPlatform.windows:
13161316
textSelectionControls ??= cupertinoDesktopTextSelectionHandleControls;
@@ -1320,6 +1320,9 @@ class _CupertinoTextFieldState extends State<CupertinoTextField> with Restoratio
13201320
_effectiveFocusNode.requestFocus();
13211321
}
13221322
};
1323+
handleDidLoseAccessibilityFocus = () {
1324+
_effectiveFocusNode.unfocus();
1325+
};
13231326
}
13241327

13251328
final bool enabled = widget.enabled;
@@ -1484,6 +1487,7 @@ class _CupertinoTextFieldState extends State<CupertinoTextField> with Restoratio
14841487
_requestKeyboard();
14851488
},
14861489
onDidGainAccessibilityFocus: handleDidGainAccessibilityFocus,
1490+
onDidLoseAccessibilityFocus: handleDidLoseAccessibilityFocus,
14871491
onFocus: enabled
14881492
? () {
14891493
assert(

packages/flutter/test/cupertino/text_field_test.dart

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ void main() {
503503
);
504504
});
505505

506-
testWidgets('Activates the text field when receives semantics focus on Mac, Windows', (WidgetTester tester) async {
506+
testWidgets('Activates the text field when receives semantics focus on desktops', (WidgetTester tester) async {
507507
final SemanticsTester semantics = SemanticsTester(tester);
508508
final SemanticsOwner semanticsOwner = tester.binding.pipelineOwner.semanticsOwner!;
509509
final FocusNode focusNode = FocusNode();
@@ -538,6 +538,7 @@ void main() {
538538
SemanticsAction.tap,
539539
SemanticsAction.focus,
540540
SemanticsAction.didGainAccessibilityFocus,
541+
SemanticsAction.didLoseAccessibilityFocus,
541542
],
542543
textDirection: TextDirection.ltr,
543544
),
@@ -557,8 +558,11 @@ void main() {
557558
semanticsOwner.performAction(4, SemanticsAction.didGainAccessibilityFocus);
558559
await tester.pumpAndSettle();
559560
expect(focusNode.hasFocus, isTrue);
561+
semanticsOwner.performAction(4, SemanticsAction.didLoseAccessibilityFocus);
562+
await tester.pumpAndSettle();
563+
expect(focusNode.hasFocus, isFalse);
560564
semantics.dispose();
561-
}, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.macOS, TargetPlatform.windows }));
565+
}, variant: TargetPlatformVariant.desktop());
562566

563567
testWidgets(
564568
'takes available space horizontally and takes intrinsic space vertically no-strut',
@@ -10458,8 +10462,13 @@ void main() {
1045810462
actions: <SemanticsAction>[
1045910463
SemanticsAction.tap,
1046010464
SemanticsAction.focus,
10461-
if (defaultTargetPlatform == TargetPlatform.windows || defaultTargetPlatform == TargetPlatform.macOS)
10462-
SemanticsAction.didGainAccessibilityFocus,
10465+
if (defaultTargetPlatform == TargetPlatform.linux
10466+
|| defaultTargetPlatform == TargetPlatform.windows
10467+
|| defaultTargetPlatform == TargetPlatform.macOS)
10468+
...<SemanticsAction>[
10469+
SemanticsAction.didGainAccessibilityFocus,
10470+
SemanticsAction.didLoseAccessibilityFocus,
10471+
],
1046310472
// TODO(gspencergoog): also test for the presence of SemanticsAction.focus when
1046410473
// this iOS issue is addressed: https://github.com/flutter/flutter/issues/150030
1046510474
],
@@ -10515,8 +10524,13 @@ void main() {
1051510524
SemanticsFlag.isReadOnly,
1051610525
],
1051710526
actions: <SemanticsAction>[
10518-
if (defaultTargetPlatform == TargetPlatform.windows || defaultTargetPlatform == TargetPlatform.macOS)
10519-
SemanticsAction.didGainAccessibilityFocus,
10527+
if (defaultTargetPlatform == TargetPlatform.linux
10528+
|| defaultTargetPlatform == TargetPlatform.windows
10529+
|| defaultTargetPlatform == TargetPlatform.macOS)
10530+
...<SemanticsAction>[
10531+
SemanticsAction.didGainAccessibilityFocus,
10532+
SemanticsAction.didLoseAccessibilityFocus,
10533+
],
1052010534
],
1052110535
),
1052210536
],

0 commit comments

Comments
 (0)