Commit a7a95daa authored by Chris Bracken's avatar Chris Bracken Committed by GitHub

Update TextEditingValue.selection on selection change (#9284)

Fixes a bug where tapping in the text under edit moved the cursor but
did not push the updated selection to the engine.

Adds a test for caret position updates.
parent 5b89c101
...@@ -381,12 +381,13 @@ class EditableTextState extends State<EditableText> implements TextInputClient { ...@@ -381,12 +381,13 @@ class EditableTextState extends State<EditableText> implements TextInputClient {
} }
void _handleSelectionChanged(TextSelection selection, RenderEditable renderObject, bool longPress) { void _handleSelectionChanged(TextSelection selection, RenderEditable renderObject, bool longPress) {
config.controller.selection = selection;
// Note that this will show the keyboard for all selection changes on the // Note that this will show the keyboard for all selection changes on the
// EditableWidget, not just changes triggered by user gestures. // EditableWidget, not just changes triggered by user gestures.
requestKeyboard(); requestKeyboard();
_hideSelectionOverlayIfNeeded(); _hideSelectionOverlayIfNeeded();
config.controller.selection = selection;
if (config.selectionControls != null) { if (config.selectionControls != null) {
_selectionOverlay = new TextSelectionOverlay( _selectionOverlay = new TextSelectionOverlay(
......
...@@ -191,6 +191,39 @@ void main() { ...@@ -191,6 +191,39 @@ void main() {
await tester.pump(); await tester.pump();
}); });
testWidgets('Caret position is updated on tap', (WidgetTester tester) async {
final TextEditingController controller = new TextEditingController();
Widget builder() {
return overlay(new Center(
child: new Material(
child: new TextField(
controller: controller,
),
),
));
}
await tester.pumpWidget(builder());
expect(controller.selection.baseOffset, -1);
expect(controller.selection.extentOffset, -1);
final String testValue = 'abc def ghi';
await tester.enterText(find.byType(EditableText), testValue);
await tester.idle();
await tester.pumpWidget(builder());
// Tap to reposition the caret.
final int tapIndex = testValue.indexOf('e');
final Point ePos = textOffsetToPosition(tester, tapIndex);
await tester.tapAt(ePos);
await tester.pump();
expect(controller.selection.baseOffset, tapIndex);
expect(controller.selection.extentOffset, tapIndex);
});
testWidgets('Can long press to select', (WidgetTester tester) async { testWidgets('Can long press to select', (WidgetTester tester) async {
final TextEditingController controller = new TextEditingController(); final TextEditingController controller = new TextEditingController();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment