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

Flutter TextField问题:首个输入内容自动同步到新增文本框

问题原因

你所有的TextField都绑定了同一个TextEditingController实例_triggersController,Flutter中一个控制器只能对应一个输入框的状态,多个输入框共用同一个控制器时,它们会共享文本内容和编辑状态,所以会出现输入内容同步的问题。

解决方案

改用控制器列表,为每个TextField分配独立的TextEditingController实例,具体步骤如下:

  1. 定义控制器列表
    在State类中替换单个控制器为列表:
List<TextEditingController> _triggerControllers = [];
  1. 初始化与添加逻辑
  • 如果初始需要一个输入框,在initState中添加第一个控制器:
    @override
    void initState() {
      super.initState();
      _triggerControllers.add(TextEditingController());
    }
    
  • 点击添加按钮时,向列表中新增控制器并刷新UI:
    ElevatedButton(
      onPressed: () {
        setState(() {
          _triggerControllers.add(TextEditingController());
        });
      },
      child: Text("Add"),
      // 保留你原有的按钮样式代码
    )
    
  1. 绑定对应控制器到TextField
    修改List.generate的逻辑,用列表长度代替totalTextField,并为每个输入框分配对应索引的控制器:
children: List.generate(
  _triggerControllers.length,
  (index) => Row(children: [
    SizedBox(
      width: 90,
      child: TextField(
        controller: _triggerControllers[index], // 绑定对应索引的控制器
        decoration: InputDecoration(
          isDense: true,
          contentPadding: EdgeInsets.zero,
          hintText: 'Add...',
          hintStyle: TextStyle(
              fontWeight: FontWeight.normal,
              color: Color.fromARGB(255, 194, 193, 193),
              fontSize: 13),
          filled: true,
          fillColor: Colors.white,
        ),
      ),
    ),
    SizedBox(width: 5),
    // 仅最后一个输入框显示添加按钮
    if (index == _triggerControllers.length - 1)
      ElevatedButton(
        style: ElevatedButton.styleFrom(
          primary: Color.fromARGB(255, 255, 255, 255),
          elevation: 2,
          shape: RoundedRectangleBorder(borderRadius: BorderRadius.zero),
          minimumSize: Size(60, 24),
        ),
        onPressed: () {
          setState(() {
            _triggerControllers.add(TextEditingController());
          });
        },
        child: Text("Add"),
      ),
  ]),
)
  1. 清理资源避免内存泄漏
    在页面销毁时,遍历列表销毁所有控制器:
@override
void dispose() {
  for (var controller in _triggerControllers) {
    controller.dispose();
  }
  super.dispose();
}

这样每个输入框都有独立的控制器,输入内容就不会互相干扰了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 15:57:17