Revert "Handle setting TextEditingController text to null (#68638)"
This reverts commit 3217906efbda5fd1922b3e497bf745eabfe3f0c6.
diff --git a/packages/flutter/lib/src/material/text_form_field.dart b/packages/flutter/lib/src/material/text_form_field.dart
index 071f2d7..deb9a4e 100644
--- a/packages/flutter/lib/src/material/text_form_field.dart
+++ b/packages/flutter/lib/src/material/text_form_field.dart
@@ -340,14 +340,14 @@
super.didChange(value);
if (_effectiveController!.text != value)
- _effectiveController!.text = value ?? '';
+ _effectiveController!.text = value;
}
@override
void reset() {
super.reset();
setState(() {
- _effectiveController!.text = widget.initialValue ?? '';
+ _effectiveController!.text = widget.initialValue;
});
}
diff --git a/packages/flutter/lib/src/services/text_input.dart b/packages/flutter/lib/src/services/text_input.dart
index dade8c5..d5d44ca 100644
--- a/packages/flutter/lib/src/services/text_input.dart
+++ b/packages/flutter/lib/src/services/text_input.dart
@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+
import 'dart:async';
import 'dart:io' show Platform;
import 'dart:ui' show
diff --git a/packages/flutter/lib/src/widgets/editable_text.dart b/packages/flutter/lib/src/widgets/editable_text.dart
index bda6cc5..78e6ecb 100644
--- a/packages/flutter/lib/src/widgets/editable_text.dart
+++ b/packages/flutter/lib/src/widgets/editable_text.dart
@@ -154,7 +154,7 @@
/// [TextEditingController]; however, one should not also set [selection]
/// in a separate statement. To change both the [text] and the [selection]
/// change the controller's [value].
- set text(String newText) {
+ set text(String? newText) {
value = value.copyWith(
text: newText,
selection: const TextSelection.collapsed(offset: -1),
diff --git a/packages/flutter/test/material/text_form_field_test.dart b/packages/flutter/test/material/text_form_field_test.dart
index c2e12a0..02a7888 100644
--- a/packages/flutter/test/material/text_form_field_test.dart
+++ b/packages/flutter/test/material/text_form_field_test.dart
@@ -406,56 +406,6 @@
expect(find.text('initialValue'), findsOneWidget);
});
- // Regression test for https://github.com/flutter/flutter/issues/34847.
- testWidgets('didChange resets the text field\'s value to empty when passed null', (WidgetTester tester) async {
- await tester.pumpWidget(
- MaterialApp(
- home: Material(
- child: Center(
- child: TextFormField(
- initialValue: null,
- ),
- ),
- ),
- )
- );
-
- await tester.enterText(find.byType(TextFormField), 'changedValue');
- await tester.pump();
- expect(find.text('changedValue'), findsOneWidget);
-
- final FormFieldState<String> state = tester.state<FormFieldState<String>>(find.byType(TextFormField));
- state.didChange(null);
-
- expect(find.text('changedValue'), findsNothing);
- expect(find.text(''), findsOneWidget);
- });
-
- // Regression test for https://github.com/flutter/flutter/issues/34847.
- testWidgets('reset resets the text field\'s value to empty when intialValue is null', (WidgetTester tester) async {
- await tester.pumpWidget(
- MaterialApp(
- home: Material(
- child: Center(
- child: TextFormField(
- initialValue: null,
- ),
- ),
- ),
- )
- );
-
- await tester.enterText(find.byType(TextFormField), 'changedValue');
- await tester.pump();
- expect(find.text('changedValue'), findsOneWidget);
-
- final FormFieldState<String> state = tester.state<FormFieldState<String>>(find.byType(TextFormField));
- state.reset();
-
- expect(find.text('changedValue'), findsNothing);
- expect(find.text(''), findsOneWidget);
- });
-
// Regression test for https://github.com/flutter/flutter/issues/54472.
testWidgets('didChange changes text fields value', (WidgetTester tester) async {
await tester.pumpWidget(
diff --git a/packages/flutter/test/widgets/editable_text_test.dart b/packages/flutter/test/widgets/editable_text_test.dart
index 659fd1b..5fabb27 100644
--- a/packages/flutter/test/widgets/editable_text_test.dart
+++ b/packages/flutter/test/widgets/editable_text_test.dart
@@ -5566,114 +5566,77 @@
expect(focusNode.hasFocus, false);
});
- group('TextEditingController', () {
- testWidgets('TextEditingController.text set to empty string clears field', (WidgetTester tester) async {
- final TextEditingController controller = TextEditingController();
- await tester.pumpWidget(
- 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) { },
- ),
- ),
- ),
- ),
- ),
- ),
- );
-
- controller.text = '...';
- await tester.pump();
- expect(find.text('...'), findsOneWidget);
-
- controller.text = '';
- await tester.pump();
- expect(find.text('...'), findsNothing);
+ 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();
- 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) { },
- ),
+ 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,
- }),
+ ),
+ );
+ },
);
- });
+ }
+
+ 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 {