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

Flutter多地址数组ListView搜索的索引问题求助

问题分析与解决方案

核心问题

  1. 遍历中修改集合:直接在遍历searchitems时调用clear()和add(),会破坏遍历迭代器,引发索引异常或数据丢失。
  2. 搜索范围不全:仅检查每个客户的第一个地址(address![0]),未覆盖所有地址条目,不符合"匹配任意地址"的需求。
  3. 依赖已筛选数据:搜索时基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 06:35:24