Flutter TextField点击表情按钮后TextEditingController文本还原为初始值
问题根源
你遇到的问题核心是每次Widget重绘时都会强制把TextEditingController的文本重置为初始值。点击表情键盘会触发Flutter的Widget rebuild,而你在_myTextFieldWidget()方法里每次都会执行controller.myTextEditingController.text = controller.initialValue;,这就导致输入表情前文本被强制还原。
另外,你在build方法里给controller的getParams和initialValue赋值也是错误的——build方法会被多次调用,这部分初始化逻辑应该只执行一次。
解决方案
1. 修正Controller的初始化逻辑
把参数获取、TextEditingController初始值设置移到GetX控制器的onInit方法中,确保只执行一次:
class MyClassController extends GetxController { late Map<String, String?> getParams; late String initialValue; late TextEditingController myTextEditingController; @override void onInit() { super.onInit(); // 获取参数只执行一次 getParams = Get.parameters; initialValue = getParams['key'] ?? ''; // 初始化TextEditingController时直接设置初始值 myTextEditingController = TextEditingController(text: initialValue); } @override void onClose() { // 销毁controller,避免内存泄漏 myTextEditingController.dispose(); super.onClose(); } }
2. 移除Widget中的重复赋值操作
在MyClass的build方法和_myTextFieldWidget里,删除所有给myTextEditingController.text赋值的代码,避免重绘时重置文本:
class MyClass extends GetView<MyClassController> { @override Widget build(BuildContext context) { // 移除原有的controller参数赋值逻辑 return Scaffold( body: Column( children: [ _myTextFieldWidget(), // 其他组件 ], ), ); } Widget _myTextFieldWidget() { // 移除这行:controller.myTextEditingController.text = controller.initialValue; return TextField( controller: controller.myTextEditingController, onChanged: (value) { // 你的业务逻辑 }, onEditingComplete: () {}, // 其他配置 ); } }
关键说明
- GetX控制器的
onInit是初始化逻辑的正确位置,只会在控制器创建时执行一次,不会因为Widget重绘重复执行。 - 直接在TextEditingController构造时传入初始值,避免后续手动赋值导致的重复重置问题。
- 一定要在
onClose中销毁TextEditingController,防止内存泄漏。
内容的提问来源于stack exchange,提问作者nkrut123
相关产品推荐
相关产品推荐

