diff --git a/packages/flutter/lib/src/material/selectable_text.dart b/packages/flutter/lib/src/material/selectable_text.dart index 21e0667ea85..943050c7bc7 100644 --- a/packages/flutter/lib/src/material/selectable_text.dart +++ b/packages/flutter/lib/src/material/selectable_text.dart @@ -198,6 +198,7 @@ class SelectableText extends StatefulWidget { this.selectionControls, this.onTap, this.scrollPhysics, + this.semanticsLabel, this.textHeightBehavior, this.textWidthBasis, this.onSelectionChanged, @@ -255,6 +256,7 @@ class SelectableText extends StatefulWidget { this.selectionControls, this.onTap, this.scrollPhysics, + this.semanticsLabel, this.textHeightBehavior, this.textWidthBasis, this.onSelectionChanged, @@ -409,6 +411,9 @@ class SelectableText extends StatefulWidget { /// {@macro flutter.widgets.editableText.scrollPhysics} final ScrollPhysics? scrollPhysics; + /// {@macro flutter.widgets.Text.semanticsLabel} + final String? semanticsLabel; + /// {@macro flutter.dart:ui.textHeightBehavior} final TextHeightBehavior? textHeightBehavior; @@ -425,6 +430,7 @@ class SelectableText extends StatefulWidget { void debugFillProperties(DiagnosticPropertiesBuilder properties) { super.debugFillProperties(properties); properties.add(DiagnosticsProperty('data', data, defaultValue: null)); + properties.add(DiagnosticsProperty('semanticsLabel', semanticsLabel, defaultValue: null)); properties.add(DiagnosticsProperty('focusNode', focusNode, defaultValue: null)); properties.add(DiagnosticsProperty('style', style, defaultValue: null)); properties.add(DiagnosticsProperty('autofocus', autofocus, defaultValue: false)); @@ -697,6 +703,7 @@ class _SelectableTextState extends State with AutomaticKeepAlive ); return Semantics( + label: widget.semanticsLabel, onLongPress: () { _effectiveFocusNode.requestFocus(); }, diff --git a/packages/flutter/lib/src/widgets/text.dart b/packages/flutter/lib/src/widgets/text.dart index 7b32b088ecd..6b3f20d22db 100644 --- a/packages/flutter/lib/src/widgets/text.dart +++ b/packages/flutter/lib/src/widgets/text.dart @@ -494,6 +494,7 @@ class Text extends StatelessWidget { /// widget directly to entirely override the [DefaultTextStyle]. final int? maxLines; + /// {@template flutter.widgets.Text.semanticsLabel} /// An alternative semantics label for this text. /// /// If present, the semantics of this widget will contain this value instead @@ -506,6 +507,7 @@ class Text extends StatelessWidget { /// ```dart /// Text(r'$$', semanticsLabel: 'Double dollars') /// ``` + /// {@endtemplate} final String? semanticsLabel; /// {@macro flutter.painting.textPainter.textWidthBasis} diff --git a/packages/flutter/test/widgets/selectable_text_test.dart b/packages/flutter/test/widgets/selectable_text_test.dart index 03e0870f902..03781420746 100644 --- a/packages/flutter/test/widgets/selectable_text_test.dart +++ b/packages/flutter/test/widgets/selectable_text_test.dart @@ -2235,6 +2235,40 @@ void main() { semantics.dispose(); }); + testWidgets('SelectableText semantics, with semanticsLabel', (WidgetTester tester) async { + final SemanticsTester semantics = SemanticsTester(tester); + final Key key = UniqueKey(); + + await tester.pumpWidget( + overlay( + child: SelectableText( + 'Guten Tag', + semanticsLabel: 'German greeting for good day', + key: key, + ), + ), + ); + + expect(semantics, hasSemantics(TestSemantics.root( + children: [ + TestSemantics.rootChild( + id: 1, + textDirection: TextDirection.ltr, + label: 'German greeting for good day', + value: 'Guten Tag', + actions: [ + SemanticsAction.longPress, + ], + flags: [ + SemanticsFlag.isTextField, + SemanticsFlag.isReadOnly, + SemanticsFlag.isMultiline, + ], + ), + ], + ), ignoreTransform: true, ignoreRect: true)); + }); + testWidgets('SelectableText semantics, enableInteractiveSelection = false', (WidgetTester tester) async { final SemanticsTester semantics = SemanticsTester(tester); final Key key = UniqueKey(); @@ -3850,6 +3884,7 @@ void main() { cursorRadius: Radius.zero, cursorColor: Color(0xff00ff00), scrollPhysics: ClampingScrollPhysics(), + semanticsLabel: 'something else', enableInteractiveSelection: false, ).debugFillProperties(builder); @@ -3859,6 +3894,7 @@ void main() { expect(description, [ 'data: something', + 'semanticsLabel: something else', 'style: TextStyle(inherit: true, color: Color(0xff00ff00))', 'autofocus: true', 'showCursor: true',