From 21efdff8a51b176748c12795863463ca3b06e844 Mon Sep 17 00:00:00 2001 From: chunhtai <47866232+chunhtai@users.noreply.github.com> Date: Tue, 7 May 2019 15:07:11 -0700 Subject: [PATCH] fix issue 32212 Text field keyboard selection crashes (#32256) --- .../flutter/lib/src/rendering/editable.dart | 2 +- .../flutter/test/material/text_field_test.dart | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/flutter/lib/src/rendering/editable.dart b/packages/flutter/lib/src/rendering/editable.dart index 69199e4642..a10f7212ca 100644 --- a/packages/flutter/lib/src/rendering/editable.dart +++ b/packages/flutter/lib/src/rendering/editable.dart @@ -428,7 +428,7 @@ class RenderEditable extends RenderBox { int _handleHorizontalArrows(bool rightArrow, bool leftArrow, bool shift, int newOffset) { // Set the new offset to be +/- 1 depending on which arrow is pressed // If shift is down, we also want to update the previous cursor location - if (rightArrow && _extentOffset < text.text.length) { + if (rightArrow && _extentOffset < text.toPlainText().length) { newOffset += 1; if (shift) _previousCursorLocation += 1; diff --git a/packages/flutter/test/material/text_field_test.dart b/packages/flutter/test/material/text_field_test.dart index 3e67d7fff3..db8802b7bd 100644 --- a/packages/flutter/test/material/text_field_test.dart +++ b/packages/flutter/test/material/text_field_test.dart @@ -2973,6 +2973,23 @@ void main() { expect(controller.selection.extentOffset - controller.selection.baseOffset, 1); }); + testWidgets('Shift test 2', (WidgetTester tester) async { + await setupWidget(tester); + + const String testValue = 'abcdefghi'; + await tester.showKeyboard(find.byType(TextField)); + tester.testTextInput.updateEditingValue(const TextEditingValue( + text: testValue, + selection: TextSelection.collapsed(offset: 3), + composing: TextRange(start: 0, end: testValue.length) + )); + await tester.pump(); + + sendKeyEventWithCode(22, true, true, false); + await tester.pumpAndSettle(); + expect(controller.selection.extentOffset - controller.selection.baseOffset, 1); + }); + testWidgets('Control Shift test', (WidgetTester tester) async { await setupWidget(tester); const String testValue = 'their big house';