From c433b3f7c04db2f36be71dea3ea9fef38036d3ff Mon Sep 17 00:00:00 2001 From: flutteractionsbot <154381524+flutteractionsbot@users.noreply.github.com> Date: Tue, 27 Jan 2026 13:38:05 -0800 Subject: [PATCH] [CP-beta]Fixes Typo in codebase (#181354) This pull request is created by [automatic cherry pick workflow](https://github.com/flutter/flutter/blob/main/docs/releases/Flutter-Cherrypick-Process.md#automatically-creates-a-cherry-pick-request) Please fill in the form below, and a flutter domain expert will evaluate this cherry pick request. ### Issue Link: https://github.com/flutter/flutter/issues/181153 ### Impact Description: This PR is to fix a typo in a newly added API (AccessiblityFocusBlockType->AccessibilityFocusBlockType) The typo was inroduced in this PR https://github.com/flutter/flutter/pull/175551 which was merged on Nov 3, 2025 and is in 3.39-3.41 What is the impact The impact is to fix a small typo by hotfix, so we dont need to deprecate the API and add a new API. The risk is small because the API was recently added in Nov, 2025 and it's an API to control accessibility focus. I don't think it's widely used by external developers yet. Also the typo is not in the previous stable 3.38, so this only needs to be cp to beta. ### Changelog Description: Explain this cherry pick: * In one line that is accessible to most Flutter developers. * That describes the state prior to the fix. * That includes which platforms are impacted. See [best practices](https://github.com/flutter/flutter/blob/main/docs/releases/Hotfix-Documentation-Best-Practices.md) for examples. [flutter/181153] fix a typo in a newly added API (AccessiblityFocusBlockType->AccessibilityFocusBlockType) ### Workaround: Is there a workaround for this issue? no ### Risk: What is the risk level of this cherry-pick? ### Test Coverage: Are you confident that your fix is well-tested by automated tests? ### Validation Steps: What are the steps to validate that this fix works? N/A --- .../lib/src/material/expansion_tile.dart | 2 +- .../lib/src/rendering/custom_paint.dart | 4 +- .../flutter/lib/src/rendering/object.dart | 24 +++++------ .../flutter/lib/src/semantics/semantics.dart | 42 ++++++++++--------- packages/flutter/lib/src/widgets/basic.dart | 8 ++-- .../flutter/test/widgets/semantics_test.dart | 16 +++---- 6 files changed, 49 insertions(+), 47 deletions(-) diff --git a/packages/flutter/lib/src/material/expansion_tile.dart b/packages/flutter/lib/src/material/expansion_tile.dart index a316d13a930..41bae613676 100644 --- a/packages/flutter/lib/src/material/expansion_tile.dart +++ b/packages/flutter/lib/src/material/expansion_tile.dart @@ -636,7 +636,7 @@ class _ExpansionTileState extends State { // blockNode prevents this node from being part of the focus traversal. label: semanticsHint, liveRegion: true, - accessiblityFocusBlockType: AccessiblityFocusBlockType.blockNode, + accessibilityFocusBlockType: AccessibilityFocusBlockType.blockNode, child: Semantics(hint: semanticsHint, onTapHint: onTapHint, child: child), ); } diff --git a/packages/flutter/lib/src/rendering/custom_paint.dart b/packages/flutter/lib/src/rendering/custom_paint.dart index b2480822493..b280cfe5bac 100644 --- a/packages/flutter/lib/src/rendering/custom_paint.dart +++ b/packages/flutter/lib/src/rendering/custom_paint.dart @@ -950,8 +950,8 @@ class RenderCustomPaint extends RenderProxyBox { if (properties.focused != null) { config.isFocused = properties.focused; } - if (properties.accessiblityFocusBlockType != null) { - config.accessiblityFocusBlockType = properties.accessiblityFocusBlockType!; + if (properties.accessibilityFocusBlockType != null) { + config.accessibilityFocusBlockType = properties.accessibilityFocusBlockType!; } if (properties.enabled != null) { config.isEnabled = properties.enabled; diff --git a/packages/flutter/lib/src/rendering/object.dart b/packages/flutter/lib/src/rendering/object.dart index 2a01de7f330..0d849a4e487 100644 --- a/packages/flutter/lib/src/rendering/object.dart +++ b/packages/flutter/lib/src/rendering/object.dart @@ -4853,8 +4853,8 @@ mixin SemanticsAnnotationsMixin on RenderObject { if (_properties.focused != null) { config.isFocused = _properties.focused; } - if (_properties.accessiblityFocusBlockType != null) { - config.accessiblityFocusBlockType = _properties.accessiblityFocusBlockType!; + if (_properties.accessibilityFocusBlockType != null) { + config.accessibilityFocusBlockType = _properties.accessibilityFocusBlockType!; } if (_properties.inMutuallyExclusiveGroup != null) { config.isInMutuallyExclusiveGroup = _properties.inMutuallyExclusiveGroup!; @@ -5131,7 +5131,7 @@ final class _SemanticsParentData { required this.explicitChildNodes, required this.tagsForChildren, required this.localeForChildren, - required this.accessiblityFocusBlockType, + required this.accessibilityFocusBlockType, }); /// Whether [SemanticsNode]s created from this render object semantics subtree @@ -5154,7 +5154,7 @@ final class _SemanticsParentData { /// * **blockNode**: Blocks accessibility focus for the **current node only**. /// /// Only `blockSubtree` from a parent will be propagated down. - final AccessiblityFocusBlockType? accessiblityFocusBlockType; + final AccessibilityFocusBlockType? accessibilityFocusBlockType; /// Any immediate render object semantics that /// [_RenderObjectSemantics.contributesToSemanticsTree] should forms a node @@ -5581,11 +5581,11 @@ class _RenderObjectSemantics extends _SemanticsFragment with DiagnosticableTreeM final bool blocksUserAction = (parentData?.blocksUserActions ?? false) || configProvider.effective.isBlockingUserActions; - AccessiblityFocusBlockType accessiblityFocusBlockType; - if (parentData?.accessiblityFocusBlockType == AccessiblityFocusBlockType.blockSubtree) { - accessiblityFocusBlockType = AccessiblityFocusBlockType.blockSubtree; + AccessibilityFocusBlockType accessibilityFocusBlockType; + if (parentData?.accessibilityFocusBlockType == AccessibilityFocusBlockType.blockSubtree) { + accessibilityFocusBlockType = AccessibilityFocusBlockType.blockSubtree; } else { - accessiblityFocusBlockType = configProvider.effective.accessiblityFocusBlockType; + accessibilityFocusBlockType = configProvider.effective.accessibilityFocusBlockType; } // localeForSubtree from the config overrides parentData's inherited locale. @@ -5599,7 +5599,7 @@ class _RenderObjectSemantics extends _SemanticsFragment with DiagnosticableTreeM (parentData?.mergeIntoParent ?? false) || configProvider.effective.isMergingSemanticsOfDescendants, blocksUserActions: blocksUserAction, - accessiblityFocusBlockType: accessiblityFocusBlockType, + accessibilityFocusBlockType: accessibilityFocusBlockType, localeForChildren: localeForChildren, explicitChildNodes: explicitChildNodesForChildren, tagsForChildren: tagsForChildren, @@ -5645,9 +5645,9 @@ class _RenderObjectSemantics extends _SemanticsFragment with DiagnosticableTreeM tags.forEach(config.addTagForChildren); }); } - if (accessiblityFocusBlockType != configProvider.effective.accessiblityFocusBlockType) { + if (accessibilityFocusBlockType != configProvider.effective.accessibilityFocusBlockType) { configProvider.updateConfig((SemanticsConfiguration config) { - config.accessiblityFocusBlockType = accessiblityFocusBlockType; + config.accessibilityFocusBlockType = accessibilityFocusBlockType; }); } @@ -5725,7 +5725,7 @@ class _RenderObjectSemantics extends _SemanticsFragment with DiagnosticableTreeM effectiveChildParentData = _SemanticsParentData( mergeIntoParent: childParentData.mergeIntoParent, blocksUserActions: childParentData.blocksUserActions, - accessiblityFocusBlockType: childParentData.accessiblityFocusBlockType, + accessibilityFocusBlockType: childParentData.accessibilityFocusBlockType, explicitChildNodes: false, tagsForChildren: childParentData.tagsForChildren, localeForChildren: childParentData.localeForChildren, diff --git a/packages/flutter/lib/src/semantics/semantics.dart b/packages/flutter/lib/src/semantics/semantics.dart index f6eac48cabd..ab7896138ce 100644 --- a/packages/flutter/lib/src/semantics/semantics.dart +++ b/packages/flutter/lib/src/semantics/semantics.dart @@ -119,7 +119,7 @@ typedef ChildSemanticsConfigurationsDelegate = /// /// This is typically used to prevent screen readers /// from focusing on parts of the UI. -enum AccessiblityFocusBlockType { +enum AccessibilityFocusBlockType { /// Accessibility focus is **not blocked**. none, @@ -130,22 +130,22 @@ enum AccessiblityFocusBlockType { /// may still be focusable. blockNode; - /// The AccessiblityFocusBlockType when two nodes get merged. - AccessiblityFocusBlockType _merge(AccessiblityFocusBlockType other) { + /// The AccessibilityFocusBlockType when two nodes get merged. + AccessibilityFocusBlockType _merge(AccessibilityFocusBlockType other) { // 1. If either is blockSubtree, the result is blockSubtree. - if (this == AccessiblityFocusBlockType.blockSubtree || - other == AccessiblityFocusBlockType.blockSubtree) { - return AccessiblityFocusBlockType.blockSubtree; + if (this == AccessibilityFocusBlockType.blockSubtree || + other == AccessibilityFocusBlockType.blockSubtree) { + return AccessibilityFocusBlockType.blockSubtree; } // 2. If either is blockNode, the result is blockNode - if (this == AccessiblityFocusBlockType.blockNode || - other == AccessiblityFocusBlockType.blockNode) { - return AccessiblityFocusBlockType.blockNode; + if (this == AccessibilityFocusBlockType.blockNode || + other == AccessibilityFocusBlockType.blockNode) { + return AccessibilityFocusBlockType.blockNode; } // 3. If neither is blockSubtree nor blockNode, both must be none. - return AccessiblityFocusBlockType.none; + return AccessibilityFocusBlockType.none; } } @@ -1642,7 +1642,7 @@ class SemanticsProperties extends DiagnosticableTree { ) this.focusable, this.focused, - this.accessiblityFocusBlockType, + this.accessibilityFocusBlockType, this.inMutuallyExclusiveGroup, this.hidden, this.obscured, @@ -1857,7 +1857,7 @@ class SemanticsProperties extends DiagnosticableTree { /// This is for accessibility focus, which is the focus used by screen readers /// like TalkBack and VoiceOver. It is different from input focus, which is /// usually held by the element that currently responds to keyboard inputs. - final AccessiblityFocusBlockType? accessiblityFocusBlockType; + final AccessibilityFocusBlockType? accessibilityFocusBlockType; /// If non-null, whether a semantic node is in a mutually exclusive group. /// @@ -6306,14 +6306,16 @@ class SemanticsConfiguration { _hasBeenAnnotated = true; } - AccessiblityFocusBlockType _accessiblityFocusBlockType = AccessiblityFocusBlockType.none; + AccessibilityFocusBlockType _accessibilityFocusBlockType = AccessibilityFocusBlockType.none; /// Whether the owning [RenderObject] and its subtree /// is blocked in the a11y focus (different from input focus). - AccessiblityFocusBlockType get accessiblityFocusBlockType => _accessiblityFocusBlockType; - set accessiblityFocusBlockType(AccessiblityFocusBlockType value) { - _accessiblityFocusBlockType = value; - _flags = _flags.copyWith(isAccessibilityFocusBlocked: value != AccessiblityFocusBlockType.none); + AccessibilityFocusBlockType get accessibilityFocusBlockType => _accessibilityFocusBlockType; + set accessibilityFocusBlockType(AccessibilityFocusBlockType value) { + _accessibilityFocusBlockType = value; + _flags = _flags.copyWith( + isAccessibilityFocusBlocked: value != AccessibilityFocusBlockType.none, + ); _hasBeenAnnotated = true; } @@ -6797,8 +6799,8 @@ class SemanticsConfiguration { _validationResult = child._validationResult; } } - _accessiblityFocusBlockType = _accessiblityFocusBlockType._merge( - child._accessiblityFocusBlockType, + _accessibilityFocusBlockType = _accessibilityFocusBlockType._merge( + child._accessibilityFocusBlockType, ); _minValue ??= child._minValue; _maxValue ??= child._maxValue; @@ -6829,7 +6831,7 @@ class SemanticsConfiguration { .._attributedValue = _attributedValue .._attributedDecreasedValue = _attributedDecreasedValue .._attributedHint = _attributedHint - .._accessiblityFocusBlockType = _accessiblityFocusBlockType + .._accessibilityFocusBlockType = _accessibilityFocusBlockType .._hintOverrides = _hintOverrides .._tooltip = _tooltip .._flags = _flags diff --git a/packages/flutter/lib/src/widgets/basic.dart b/packages/flutter/lib/src/widgets/basic.dart index 66c7914b3a0..197bb365e14 100644 --- a/packages/flutter/lib/src/widgets/basic.dart +++ b/packages/flutter/lib/src/widgets/basic.dart @@ -4048,7 +4048,7 @@ sealed class _SemanticsBase extends SingleChildRenderObjectWidget { required bool? readOnly, required bool? focusable, required bool? focused, - required AccessiblityFocusBlockType? accessiblityFocusBlockType, + required AccessibilityFocusBlockType? accessibilityFocusBlockType, required bool? inMutuallyExclusiveGroup, required bool? obscured, required bool? multiline, @@ -4136,7 +4136,7 @@ sealed class _SemanticsBase extends SingleChildRenderObjectWidget { readOnly: readOnly, focusable: focusable, focused: focused, - accessiblityFocusBlockType: accessiblityFocusBlockType, + accessibilityFocusBlockType: accessibilityFocusBlockType, inMutuallyExclusiveGroup: inMutuallyExclusiveGroup, obscured: obscured, multiline: multiline, @@ -4384,7 +4384,7 @@ class SliverSemantics extends _SemanticsBase { super.readOnly, super.focusable, super.focused, - super.accessiblityFocusBlockType, + super.accessibilityFocusBlockType, super.inMutuallyExclusiveGroup, super.obscured, super.multiline, @@ -7969,7 +7969,7 @@ class Semantics extends _SemanticsBase { super.readOnly, super.focusable, super.focused, - super.accessiblityFocusBlockType, + super.accessibilityFocusBlockType, super.inMutuallyExclusiveGroup, super.obscured, super.multiline, diff --git a/packages/flutter/test/widgets/semantics_test.dart b/packages/flutter/test/widgets/semantics_test.dart index 0bdd401f611..5e9a55e9028 100644 --- a/packages/flutter/test/widgets/semantics_test.dart +++ b/packages/flutter/test/widgets/semantics_test.dart @@ -879,13 +879,13 @@ void main() { await tester.pumpWidget( Semantics( container: true, - accessiblityFocusBlockType: AccessiblityFocusBlockType.blockSubtree, + accessibilityFocusBlockType: AccessibilityFocusBlockType.blockSubtree, child: Column( children: [ // If the child set blockSubTreeAccessibilityFocus to `none`, it's still blcok because its parent. Semantics( container: true, - accessiblityFocusBlockType: AccessiblityFocusBlockType.none, + accessibilityFocusBlockType: AccessibilityFocusBlockType.none, customSemanticsActions: { const CustomSemanticsAction(label: 'action1'): () {}, }, @@ -944,12 +944,12 @@ void main() { await tester.pumpWidget( Semantics( container: true, - accessiblityFocusBlockType: AccessiblityFocusBlockType.blockNode, + accessibilityFocusBlockType: AccessibilityFocusBlockType.blockNode, child: Column( children: [ Semantics( container: true, - accessiblityFocusBlockType: AccessiblityFocusBlockType.none, + accessibilityFocusBlockType: AccessibilityFocusBlockType.none, customSemanticsActions: { const CustomSemanticsAction(label: 'action1'): () {}, }, @@ -1004,7 +1004,7 @@ void main() { children: [ Semantics( container: true, - accessiblityFocusBlockType: AccessiblityFocusBlockType.blockNode, + accessibilityFocusBlockType: AccessibilityFocusBlockType.blockNode, label: 'node1', child: const SizedBox(width: 10, height: 10), ), @@ -1050,7 +1050,7 @@ void main() { child: Semantics( label: 'root', child: Semantics( - accessiblityFocusBlockType: AccessiblityFocusBlockType.blockNode, + accessibilityFocusBlockType: AccessibilityFocusBlockType.blockNode, label: 'semantics label 0', child: Column( children: [ @@ -1105,7 +1105,7 @@ void main() { child: Semantics( label: 'root', child: Semantics( - accessiblityFocusBlockType: AccessiblityFocusBlockType.blockSubtree, + accessibilityFocusBlockType: AccessibilityFocusBlockType.blockSubtree, label: 'semantics label 0', child: Column( children: [ @@ -1151,7 +1151,7 @@ void main() { await tester.pumpWidget( Semantics( container: true, - accessiblityFocusBlockType: AccessiblityFocusBlockType.blockSubtree, + accessibilityFocusBlockType: AccessibilityFocusBlockType.blockSubtree, focused: true, customSemanticsActions: { const CustomSemanticsAction(label: 'action1'): () {},