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

如何实时监听TextField内容变化并更新Text组件?

解决Flutter中TextField输入内容实时同步到Text组件的问题

你的代码无法实时更新Text组件的核心原因是:TextEditingController的text属性变化不会自动触发Widget树重建,所以即使输入内容改变,Text组件也不会重新渲染。下面提供两种可行的解决方案:

方案一:监听控制器变化并触发setState

通过给TextEditingController添加监听器,在内容变化时调用setState()触发页面重建,让Text组件读取最新的输入内容。

修改后的完整代码:

late final TextEditingController _importo;

@override
void initState() {
  super.initState();
  _importo = TextEditingController();
  // 添加监听器,内容变化时触发重建
  _importo.addListener(() {
    setState(() {});
  });
}

@override
void dispose() {
  // 销毁控制器,避免内存泄漏
  _importo.dispose();
  super.dispose();
}

@override
Widget build(BuildContext context) {
  return Column(children: [
    SizedBox(
      width: 50,
      child: TextField(
        textAlign: TextAlign.end,
        controller: _importo,
        decoration: const InputDecoration(
          hintText: '0.00',
        ),
        autocorrect: false,
        keyboardType: TextInputType.number,
      ),
    ),
    Text(
      _importo.text,
      style: const TextStyle(
        fontWeight: FontWeight.w400,
        fontSize: 15,
      ),
    ),
  ]);
}

方案二:使用ValueListenableBuilder(更高效)

ValueListenableBuilder可以监听TextEditingController的变化,自动更新子Widget,无需手动调用setState(),性能更优。

修改后的完整代码:

late final TextEditingController _importo;

@override
void initState() {
  super.initState();
  _importo = TextEditingController();
}

@override
void dispose() {
  _importo.dispose();
  super.dispose();
}

@override
Widget build(BuildContext context) {
  return Column(children: [
    SizedBox(
      width: 50,
      child: TextField(
        textAlign: TextAlign.end,
        controller: _importo,
        decoration: const InputDecoration(
          hintText: '0.00',
        ),
        autocorrect: false,
        keyboardType: TextInputType.number,
      ),
    ),
    // 用ValueListenableBuilder包裹Text组件
    ValueListenableBuilder<TextEditingValue>(
      valueListenable: _importo,
      builder: (context, value, child) {
        return Text(
          value.text,
          style: const TextStyle(
            fontWeight: FontWeight.w400,
            fontSize: 15,
          ),
        );
      },
    ),
  ]);
}

注意:两种方案都需要在dispose()方法中销毁TextEditingController,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 18:19:47