Flutter TextField问题:首个输入内容自动同步到新增文本框
问题原因
你所有的TextField都绑定了同一个TextEditingController实例_triggersController,Flutter中一个控制器只能对应一个输入框的状态,多个输入框共用同一个控制器时,它们会共享文本内容和编辑状态,所以会出现输入内容同步的问题。
解决方案
改用控制器列表,为每个TextField分配独立的TextEditingController实例,具体步骤如下:
- 定义控制器列表
在State类中替换单个控制器为列表:
List<TextEditingController> _triggerControllers = [];
- 初始化与添加逻辑
- 如果初始需要一个输入框,在
initState中添加第一个控制器:@override void initState() { super.initState(); _triggerControllers.add(TextEditingController()); } - 点击添加按钮时,向列表中新增控制器并刷新UI:
ElevatedButton( onPressed: () { setState(() { _triggerControllers.add(TextEditingController()); }); }, child: Text("Add"), // 保留你原有的按钮样式代码 )
- 绑定对应控制器到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"), ), ]), )
- 清理资源避免内存泄漏
在页面销毁时,遍历列表销毁所有控制器:
@override void dispose() { for (var controller in _triggerControllers) { controller.dispose(); } super.dispose(); }
这样每个输入框都有独立的控制器,输入内容就不会互相干扰了。
内容的提问来源于stack exchange,提问作者DARIO
相关产品推荐
相关产品推荐

