Flutter中删除TextField文本时列表值异常变更问题求助
问题原因及解决方案
问题根源
Dart里的List是引用类型,你代码里的_initList = myList只是把列表的引用赋值给了_initList,并不是创建新的列表副本。这意味着_initList和myList指向内存中同一个列表对象,当你调用myList.removeWhere()修改列表时,_initList自然也会跟着变——因为它们本质是同一个东西。
解决步骤
- 提前复制初始列表:别等到输入搜索词时才赋值
_initList,最好在组件初始化阶段(比如initState)就把初始列表完整复制一份,确保_initList是独立的新列表:
@override void initState() { super.initState(); // 两种复制方式任选其一 _initList = List.from(myList); // 或者用展开运算符:_initList = [...myList]; }
- 基于初始列表做过滤:每次搜索都从
_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
相关产品推荐
相关产品推荐

