使用GetX如何监听TextEditingController的内部文本变化?
问题原因
你当前的写法是将TextEditingController实例本身封装为Rx对象,GetX的响应式机制默认仅在Rx.value的内存引用发生变化时才会触发监听回调。输入文本修改的是controller实例内部的text属性,controller实例本身没有被替换,因此debounce监听不会被触发。
修复方案
推荐采用同步controller文本到独立响应式变量的方式实现需求,代码调整如下:
class Controller extends GetxController{ // 用于响应式监听输入内容的变量 final inputText = ''.obs; late final TextEditingController txtList; @override void onInit() { super.onInit(); txtList = TextEditingController(); // 绑定controller的文本变化同步到响应式变量 txtList.addListener(() { inputText.value = txtList.text; }); // 防抖监听输入内容变化 debounce(inputText, (content) { print("debounce $content"); }, time: const Duration(seconds: 1)); } @override void onClose() { // 销毁controller避免内存泄漏 txtList.dispose(); super.onClose(); } }
UI侧无需额外调整,仍将txtList直接绑定到TextField的controller属性即可。
注意事项
- 上述方案的防抖逻辑仅在输入停止满1秒后触发回调,符合防抖的常规使用场景
- 必须在
onClose生命周期中销毁TextEditingController,否则会产生内存泄漏
内容的提问来源于stack exchange,提问作者Dmitry Bubnenkov
相关产品推荐
相关产品推荐

