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

Flutter中删除TextField文本时列表值异常变更问题求助

问题原因及解决方案

问题根源

Dart里的List是引用类型,你代码里的_initList = myList只是把列表的引用赋值给了_initList,并不是创建新的列表副本。这意味着_initList和myList指向内存中同一个列表对象,当你调用myList.removeWhere()修改列表时,_initList自然也会跟着变——因为它们本质是同一个东西。

解决步骤

  1. 提前复制初始列表:别等到输入搜索词时才赋值_initList,最好在组件初始化阶段(比如initState)就把初始列表完整复制一份,确保_initList是独立的新列表:
@override
void initState() {
  super.initState();
  // 两种复制方式任选其一
  _initList = List.from(myList);
  // 或者用展开运算符:_initList = [...myList];
}
  1. 基于初始列表做过滤:每次搜索都从_initList(原始数据)里筛选结果,生成新列表赋值给myList,而不是直接修改myList。这样既不会破坏原始数据,也能保证每次搜索都是基于完整的初始列表:
onChanged: (val) {
  setState(() {
    if (val.length > 2) {
      // 从初始列表过滤,生成新列表
      myList = _initList.where((element) => 
        element.getName().toLowerCase().contains(val.toLowerCase())
      ).toList();
    } else {
      // 恢复为初始列表的副本
      myList = List.from(_initList);
    }
  });
},

额外提醒

  • 不要在onChanged里才初始化_initList,否则如果用户快速输入又删除,可能会出现_initList还没被赋值就进入else分支的情况。
  • 把myList作为纯展示用的变量,始终从_initList派生数据,就能彻底避免原始数据被污染的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:03:34