Flutter多地址数组ListView搜索的索引问题求助
问题分析与解决方案
核心问题
- 遍历中修改集合:直接在遍历
searchitems时调用clear()和add(),会破坏遍历迭代器,引发索引异常或数据丢失。 - 搜索范围不全:仅检查每个客户的第一个地址(
address![0]),未覆盖所有地址条目,不符合"匹配任意地址"的需求。 - 依赖已筛选数据:搜索时基于
searchitems而非原始items,会导致后续搜索丢失初始数据,无法正确回显或重新筛选。
修正后的代码
void onSearchAddr(String text) { setState(() { if (text.isNotEmpty) { // 基于原始全量数据筛选,避免依赖已修改的searchitems searchitems = items.where((item) { // 检查当前客户的所有地址,只要有一个addr1包含搜索文本就保留 return item.address?.any((addr) => addr.addr1?.contains(text) ?? false) ?? false; }).toList(); } else { // 清空搜索时,回到初始筛选逻辑(按custnum匹配searchText) searchitems = items.where((element) => element.custnum == searchText).toList(); } print('searchitems length: ${searchitems.length}'); }); }
代码说明
- 规避遍历修改风险:通过
where+toList()直接生成新的筛选列表,替代遍历修改原集合的操作,彻底解决索引异常问题。 - 覆盖全地址匹配:使用
any方法检查客户的所有地址条目,只要有一个地址的addr1包含搜索文本,就将该客户保留在结果中。 - 基于原始数据源:始终从
items(原始全量数据)中筛选,确保每次搜索都基于完整数据集,不会出现数据丢失。 - 空值安全处理:添加
??运算符处理address或addr1为null的情况,避免空指针异常。
内容的提问来源于stack exchange,提问作者Ppnncs
相关产品推荐
相关产品推荐

