Flutter如何将TextField输入填充到ListView并解决列表项值相同问题
问题原因
你的实现逻辑存在两处核心错误:
- 仅声明了单个
TextEditingController存储当前输入值,没有持久化存储每次提交的历史输入内容,所有列表项统一读取同一个controller的值,自然所有项内容完全一致。 - 列表渲染时直接打印
$Tcon,读取的是controller对象的字符串描述而非输入的文本内容,即使要取当前输入值也需要调用Tcon.text。
修改方案
步骤1:新增列表存储历史任务
在State类中新增列表存储所有已提交的任务内容,替换原有仅靠index计数的逻辑:
TextEditingController Tcon = TextEditingController(); List<String> taskList = []; // 存储所有已提交的任务内容
步骤2:修改输入提交逻辑
提交时将当前输入内容存入列表,同时清空输入框方便下次输入,可增加空内容校验:
child: TextField( textAlign: TextAlign.center, controller: Tcon, onSubmitted: (value) { if (value.trim().isNotEmpty) { setState(() { taskList.add(value); Tcon.clear(); }); } }, ),
步骤3:重构列表构建逻辑
直接根据任务列表长度渲染条目,读取对应下标存储的任务内容:
Widget _list(context) { if (taskList.isNotEmpty) { return ListView.builder( itemCount: taskList.length, itemBuilder: (BuildContext context, int index) { return ListTile( title: Text('Task: ${index + 1} ${taskList[index]}'), ); }, ); } else { return ListView( shrinkWrap: true, padding: const EdgeInsets.all(30.0), children: const <Widget>[ Text("Add task..."), ], ); } }
步骤4:补充资源释放逻辑
页面销毁时释放TextEditingController避免内存泄漏:
@override void dispose() { Tcon.dispose(); super.dispose(); }
你提到的FAB功能异常问题,只需将FAB的点击提交逻辑和上述onSubmitted逻辑保持一致,统一往taskList中添加内容即可解决。
内容的提问来源于stack exchange,提问作者Nyctophilius
相关产品推荐
相关产品推荐

