mirror of
https://github.com/flutter/flutter
synced 2024-10-13 03:32:55 +00:00
Hide selection handles from semantics (#76641)
* Hide selection handles from semantics * update comment
This commit is contained in:
parent
1794e81f61
commit
d75cfa584c
|
@ -547,22 +547,31 @@ class TextSelectionOverlay {
|
|||
}
|
||||
|
||||
Widget _buildHandle(BuildContext context, _TextSelectionHandlePosition position) {
|
||||
Widget handle;
|
||||
if ((_selection.isCollapsed && position == _TextSelectionHandlePosition.end) ||
|
||||
selectionControls == null)
|
||||
return Container(); // hide the second handle when collapsed
|
||||
return Visibility(
|
||||
visible: handlesVisible,
|
||||
child: _TextSelectionHandleOverlay(
|
||||
onSelectionHandleChanged: (TextSelection newSelection) { _handleSelectionHandleChanged(newSelection, position); },
|
||||
onSelectionHandleTapped: onSelectionHandleTapped,
|
||||
startHandleLayerLink: startHandleLayerLink,
|
||||
endHandleLayerLink: endHandleLayerLink,
|
||||
renderObject: renderObject,
|
||||
selection: _selection,
|
||||
selectionControls: selectionControls,
|
||||
position: position,
|
||||
dragStartBehavior: dragStartBehavior,
|
||||
));
|
||||
handle = Container(); // hide the second handle when collapsed
|
||||
else {
|
||||
handle = Visibility(
|
||||
visible: handlesVisible,
|
||||
child: _TextSelectionHandleOverlay(
|
||||
onSelectionHandleChanged: (TextSelection newSelection) {
|
||||
_handleSelectionHandleChanged(newSelection, position);
|
||||
},
|
||||
onSelectionHandleTapped: onSelectionHandleTapped,
|
||||
startHandleLayerLink: startHandleLayerLink,
|
||||
endHandleLayerLink: endHandleLayerLink,
|
||||
renderObject: renderObject,
|
||||
selection: _selection,
|
||||
selectionControls: selectionControls,
|
||||
position: position,
|
||||
dragStartBehavior: dragStartBehavior,
|
||||
)
|
||||
);
|
||||
}
|
||||
return ExcludeSemantics(
|
||||
child: handle,
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildToolbar(BuildContext context) {
|
||||
|
|
|
@ -1119,6 +1119,47 @@ void main() {
|
|||
expect(fadeFinder, findsNothing);
|
||||
});
|
||||
|
||||
testWidgets('selection handles are excluded from the semantics', (WidgetTester tester) async {
|
||||
final SemanticsTester semantics = SemanticsTester(tester);
|
||||
final TextEditingController controller = TextEditingController();
|
||||
|
||||
await tester.pumpWidget(
|
||||
overlay(
|
||||
child: TextField(
|
||||
controller: controller,
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
const String testValue = 'abcdefghi';
|
||||
await tester.enterText(find.byType(TextField), testValue);
|
||||
expect(controller.value.text, testValue);
|
||||
await skipPastScrollingAnimation(tester);
|
||||
// Tap on the text field to show the handle.
|
||||
await tester.tap(find.byType(TextField));
|
||||
await tester.pumpAndSettle();
|
||||
// The semantics should only have the text field.
|
||||
expect(semantics, hasSemantics(
|
||||
TestSemantics.root(
|
||||
children: <TestSemantics>[
|
||||
TestSemantics(
|
||||
id: 1,
|
||||
flags: <SemanticsFlag>[SemanticsFlag.isTextField, SemanticsFlag.isFocused],
|
||||
actions: <SemanticsAction>[SemanticsAction.tap,
|
||||
SemanticsAction.moveCursorBackwardByCharacter, SemanticsAction.setSelection, SemanticsAction.paste,
|
||||
SemanticsAction.moveCursorBackwardByWord],
|
||||
value: 'abcdefghi',
|
||||
textDirection: TextDirection.ltr,
|
||||
textSelection: const TextSelection.collapsed(offset: 9),
|
||||
),
|
||||
],
|
||||
),
|
||||
ignoreRect: true,
|
||||
ignoreTransform: true,
|
||||
));
|
||||
semantics.dispose();
|
||||
});
|
||||
|
||||
testWidgets('Mouse long press is just like a tap', (WidgetTester tester) async {
|
||||
final TextEditingController controller = TextEditingController();
|
||||
|
||||
|
|
Loading…
Reference in a new issue