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

Flutter如何将TextField输入填充到ListView并解决列表项值相同问题

问题原因

你的实现逻辑存在两处核心错误:

  1. 仅声明了单个TextEditingController存储当前输入值,没有持久化存储每次提交的历史输入内容,所有列表项统一读取同一个controller的值,自然所有项内容完全一致。
  2. 列表渲染时直接打印$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 00:36:05