Change the enterText method to move the caret to the end of the input text
Summary
#The WidgetTester.enterText and TestTextInput.enterText methods
now move the caret to the end of the input text.
Context
#The caret indicates the insertion point within the current text in an active input field. Typically, when a new character is entered, the caret stays immediately after it. In Flutter the caret position is represented by a collapsed selection. When the selection is invalid, usually the user won't be able to modify or add text until they change the selection to a valid value.
WidgetTester.enterText and TestTextInput.enterText are 2 methods
used in tests to replace the content of the target text field. Prior
to this change, WidgetTester.enterText and TestTextInput.enterText
set the selection to an invalid range (-1, -1), indicating there's
no selection or caret. This contradicts the typical behavior of an
input field.
Description of change
#In addition to replacing the text with the supplied text,
WidgetTester.enterText and TestTextInput.enterText now set the
selection to TextSelection.collapsed(offset: text.length), instead
of TextSelection.collapsed(offset: -1).
Migration guide
#It should be very uncommon for tests to have to rely on the
previous behavior of enterText, since usually the selection
should not be invalid. Consider changing the expected values of
your tests to adopt the enterText change.
Common test failures this change may introduce includes:
-
Golden test failures:
The caret appears at the end of the text, as opposed to before the text prior to the change.
-
Different
TextEditingValue.selectionafter callingenterText:The text field's
TextEditingValuenow has a collapsed selection with a non-negative offset, as opposed toTextSelection.collapsed(offset: -1)prior to the change. For instance, you may seeexpect(controller.value.selection.baseOffset, -1);failing afterenterTextcalls.
If your tests have to rely on setting the selection to invalid,
the previous behavior can be achieved usingupdateEditingValue:
TestTextInput.enterText
#Code before migration:
await testTextInput.enterText(text);Code after migration:
await testTextInput.updateEditingValue(TextEditingValue(
text: text,
));WidgetTester.enterText
#Code before migration:
await tester.enterText(finder, text);Code after migration:
await tester.showKeyboard(finder);
await tester.updateEditingValue(TextEditingValue(
text: text,
));
await tester.idle();Timeline
#Landed in version: 2.1.0-13.0.pre
In stable release: 2.5
References
#API documentation:
Relevant issues:
Relevant PR:
除非另有说明,本文档之所提及适用于 Flutter 的最新稳定版本,本页面最后更新时间: 2024-04-04。 查看文档源码 或者 为本页面内容提出建议.