我正在编写一个移动 Flutter 应用程序(使用 GetX),并且有一个文本字段小部件,通过设置
controller.myTextEditingController.text = controller.initialValue;
为其赋予初始值。我希望用户能够输入他们想要的任何文本。当我开始编辑文本字段时,一切都按预期进行。但是,一旦我单击键盘上的表情符号按钮开始输入表情符号(正如我预计许多用户会这样做),textEditingController.text 就会恢复为其给出的原始值。
以下是一些代码片段:
class MyClassController extends GetxController {
...
late Map<String, String?> getParams;
late String initalValue;
TextEditingController myTextEditingController = TextEditingController();
...
}
class MyClass extends GetView<MyClassController> {
...
@override
Widget build(BuildContext context) {
controller.getParams = Get.parameters;
controller.initialValue = controller.getParams['key'] ?? '';
...
return Scaffold(
body: Column(
...
_myTextFieldWidget(),
...
)
);
}
Widget _myTextFieldWidget() {
controller.myTextEditingController.text = controller.initialValue;
return TextField(
...
controller: controller.myTextEditingController,
onChanged: (value) {...},
onEditingComplete: () {}, // left this empty so that the 'done' button on keyboard does nothing
...
);
}
}
我尝试重写小部件,将其直接移动到脚手架中,并更改 textEditingController 的范围及其文本的定义位置。什么都不起作用。
任何帮助将不胜感激!
要解决这个问题,你应该只设置一次TextEditingController的初始值。 看来您面临这个问题是因为在 MyClass 中处理 TextEditingController 的方式。 因此,每次调用 _myTextFieldWidget() 时,controller.myTextEditingController.text 都会被重置为controller.initialValue
因为你打电话
control.myTextEditingController.text = control.initialValue;
在 build() 函数中。 每次您单击软键盘上的表情符号按钮时,页面都会重建,导致您的文本字段控制器将文本重置为初始值。
将此行移至 onInit 以确保在页面重建期间不会调用它。