change TextEditingController.clear() behavior (#68775)
Fixes a bug where keyboard capitalization mode was exited when pressing clear.
This commit is contained in:
parent
8e8f61856a
commit
95909c2a04
@ -230,14 +230,14 @@ class TextEditingController extends ValueNotifier<TextEditingValue> {
|
|||||||
/// Set the [value] to empty.
|
/// Set the [value] to empty.
|
||||||
///
|
///
|
||||||
/// After calling this function, [text] will be the empty string and the
|
/// After calling this function, [text] will be the empty string and the
|
||||||
/// selection will be invalid.
|
/// selection will be collapsed at zero offset.
|
||||||
///
|
///
|
||||||
/// Calling this will notify all the listeners of this [TextEditingController]
|
/// Calling this will notify all the listeners of this [TextEditingController]
|
||||||
/// that they need to update (it calls [notifyListeners]). For this reason,
|
/// that they need to update (it calls [notifyListeners]). For this reason,
|
||||||
/// this method should only be called between frames, e.g. in response to user
|
/// this method should only be called between frames, e.g. in response to user
|
||||||
/// actions, not during the build, layout, or paint phases.
|
/// actions, not during the build, layout, or paint phases.
|
||||||
void clear() {
|
void clear() {
|
||||||
value = TextEditingValue.empty;
|
value = const TextEditingValue(selection: TextSelection.collapsed(offset: 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set the composing region to an empty range.
|
/// Set the composing region to an empty range.
|
||||||
|
@ -5391,6 +5391,79 @@ void main() {
|
|||||||
expect(focusNode.hasFocus, false);
|
expect(focusNode.hasFocus, false);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
testWidgets('TextEditingController.clear() behavior test', (WidgetTester tester) async {
|
||||||
|
// Regression test for https://github.com/flutter/flutter/issues/66316
|
||||||
|
final List<MethodCall> log = <MethodCall>[];
|
||||||
|
SystemChannels.textInput.setMockMethodCallHandler((MethodCall methodCall) async {
|
||||||
|
log.add(methodCall);
|
||||||
|
});
|
||||||
|
final TextEditingController controller = TextEditingController();
|
||||||
|
|
||||||
|
final FocusNode focusNode = FocusNode(debugLabel: 'EditableText Focus Node');
|
||||||
|
Widget builder() {
|
||||||
|
return StatefulBuilder(
|
||||||
|
builder: (BuildContext context, StateSetter setter) {
|
||||||
|
return MaterialApp(
|
||||||
|
home: MediaQuery(
|
||||||
|
data: const MediaQueryData(devicePixelRatio: 1.0),
|
||||||
|
child: Directionality(
|
||||||
|
textDirection: TextDirection.ltr,
|
||||||
|
child: Center(
|
||||||
|
child: Material(
|
||||||
|
child: EditableText(
|
||||||
|
controller: controller,
|
||||||
|
focusNode: focusNode,
|
||||||
|
style: textStyle,
|
||||||
|
cursorColor: Colors.red,
|
||||||
|
backgroundCursorColor: Colors.red,
|
||||||
|
keyboardType: TextInputType.multiline,
|
||||||
|
onChanged: (String value) { },
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
await tester.pumpWidget(builder());
|
||||||
|
await tester.tap(find.byType(EditableText));
|
||||||
|
await tester.pump();
|
||||||
|
|
||||||
|
// The keyboard is shown after tap the EditableText.
|
||||||
|
expect(focusNode.hasFocus, true);
|
||||||
|
|
||||||
|
log.clear();
|
||||||
|
|
||||||
|
final EditableTextState state = tester.firstState(find.byType(EditableText));
|
||||||
|
|
||||||
|
state.updateEditingValue(const TextEditingValue(
|
||||||
|
text: 'a',
|
||||||
|
));
|
||||||
|
await tester.pump();
|
||||||
|
|
||||||
|
// Nothing called when only the remote changes.
|
||||||
|
expect(log.length, 0);
|
||||||
|
|
||||||
|
controller.clear();
|
||||||
|
|
||||||
|
expect(log.length, 1);
|
||||||
|
expect(
|
||||||
|
log[0],
|
||||||
|
isMethodCall('TextInput.setEditingState', arguments: <String, dynamic>{
|
||||||
|
'text': '',
|
||||||
|
'selectionBase': 0,
|
||||||
|
'selectionExtent': 0,
|
||||||
|
'selectionAffinity': 'TextAffinity.downstream',
|
||||||
|
'selectionIsDirectional': false,
|
||||||
|
'composingBase': -1,
|
||||||
|
'composingExtent': -1,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
testWidgets('autofocus:true on first frame does not throw', (WidgetTester tester) async {
|
testWidgets('autofocus:true on first frame does not throw', (WidgetTester tester) async {
|
||||||
final TextEditingController controller = TextEditingController(text: testText);
|
final TextEditingController controller = TextEditingController(text: testText);
|
||||||
controller.selection = const TextSelection(
|
controller.selection = const TextSelection(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user