[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
This commit is contained in:
flutteractionsbot 2026-01-27 13:38:05 -08:00 committed by GitHub
parent f3c54a697e
commit c433b3f7c0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 49 additions and 47 deletions

View File

@ -636,7 +636,7 @@ class _ExpansionTileState extends State<ExpansionTile> {
// 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),
);
}

View File

@ -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;

View File

@ -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,

View File

@ -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

View File

@ -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,

View File

@ -879,13 +879,13 @@ void main() {
await tester.pumpWidget(
Semantics(
container: true,
accessiblityFocusBlockType: AccessiblityFocusBlockType.blockSubtree,
accessibilityFocusBlockType: AccessibilityFocusBlockType.blockSubtree,
child: Column(
children: <Widget>[
// If the child set blockSubTreeAccessibilityFocus to `none`, it's still blcok because its parent.
Semantics(
container: true,
accessiblityFocusBlockType: AccessiblityFocusBlockType.none,
accessibilityFocusBlockType: AccessibilityFocusBlockType.none,
customSemanticsActions: <CustomSemanticsAction, VoidCallback>{
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: <Widget>[
Semantics(
container: true,
accessiblityFocusBlockType: AccessiblityFocusBlockType.none,
accessibilityFocusBlockType: AccessibilityFocusBlockType.none,
customSemanticsActions: <CustomSemanticsAction, VoidCallback>{
const CustomSemanticsAction(label: 'action1'): () {},
},
@ -1004,7 +1004,7 @@ void main() {
children: <Widget>[
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: <Widget>[
@ -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: <Widget>[
@ -1151,7 +1151,7 @@ void main() {
await tester.pumpWidget(
Semantics(
container: true,
accessiblityFocusBlockType: AccessiblityFocusBlockType.blockSubtree,
accessibilityFocusBlockType: AccessibilityFocusBlockType.blockSubtree,
focused: true,
customSemanticsActions: <CustomSemanticsAction, VoidCallback>{
const CustomSemanticsAction(label: 'action1'): () {},