You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么useTextEditingController的value更新无法被useEffect监听?

问题原因
  • useTextEditingController返回的控制器实例在组件生命周期内是稳定的,不会随输入内容变化重新创建
  • 控制器的value更新时默认不会触发HookWidget重构建,build方法不会重复执行,useEffect的依赖数组不会触发重新比对,因此回调仅在初始化时执行一次
修复方案

在useEffect中主动给控制器添加文本变化监听器,同时返回清理函数避免内存泄漏,修改后的核心代码如下:

class RecordForm extends HookWidget {
  final Record? record;
  const RecordForm({
    Key? key,
    this.record,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final initialTitle = record != null ? record!.title : "";
    final _title = useTextEditingController.fromValue(
      TextEditingValue(text: initialTitle)
    );

    useEffect((){
      // 定义文本变化回调
      void onTextChanged() {
        log.wtf(_title.value.text);
      }
      // 给控制器添加监听
      _title.addListener(onTextChanged);
      // 组件销毁时移除监听,避免内存泄漏
      return () => _title.removeListener(onTextChanged);
    }, [_title]); // 依赖项填入稳定的控制器实例即可

    return // ...
      TextFormField(
        controller: _title,
        // ...
      ),
    // ...
    ;
  }
}

修改后只要TextFormField的输入内容发生变化,就会触发控制器的监听回调,打印最新的文本值。

内容的提问来源于stack exchange,提问作者Stuck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 12:36:04