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

Flutter ListView地址模糊搜索求助:输入部分地址搜索崩溃

解决地址模糊搜索崩溃问题及实现方案

现有尝试代码的问题分析

  • 语法错误:函数参数String "text"不符合Dart语法规范,应改为String text
  • 空指针崩溃风险:直接访问searchitems[0],当searchitems为空时会触发空指针异常
  • 逻辑错误:仅遍历已搜索结果的地址而非全部客户数据,且错误将匹配项添加到原始items列表,会污染数据源
  • 未更新UI:未调用setState更新searchitems,导致ListView无法刷新

修复后的地址模糊搜索实现

// 地址模糊搜索函数
void onSearchAddr(String text) {
  if (text.isEmpty) {
    setState(() {
      searchitems.clear();
      loading = false;
    });
    return;
  }

  // 遍历所有客户数据,筛选地址匹配的项
  List<Item> matchedItems = [];
  final searchText = text.toLowerCase(); // 统一转为小写,实现不区分大小写搜索
  for (var item in items) {
    // 检查当前客户的地址列表中是否有匹配项,空值判断避免崩溃
    bool isAddrMatched = item.address?.any((addr) => 
      addr.addr1?.toLowerCase().contains(searchText) == true
    ) ?? false;

    if (isAddrMatched) {
      matchedItems.add(item);
    }
  }

  setState(() {
    loading = false;
    searchitems.clear();
    searchitems.addAll(matchedItems);
  });
}

代码关键点说明

  1. 空输入处理:输入为空时清空搜索结果并更新UI,同时设置loading状态
  2. 统一大小写:将搜索文本和地址转为小写,实现不区分大小写的模糊匹配
  3. 空值安全:使用?.和??处理可能为空的address和addr1字段,避免空指针崩溃
  4. 遍历原始数据:基于原始items列表筛选,不修改原始数据源
  5. UI更新:通过setState更新searchitems,触发ListView刷新

原客户编号搜索代码优化(可选)

原代码存在多次调用setState和冗余大小写转换的问题,优化后:

// 优化后的客户编号搜索
void onSearch(String text) {
  if (text.isNotEmpty) {
    List<Item> itemList = [];
    final targetCustnum = text.trim().toUpperCase();
    for (var item in items) {
      // 增加空值判断,避免custnum为空时崩溃
      if (item.custnum?.toUpperCase() == targetCustnum) {
        itemList.add(item);
      }
    }
    setState(() {
      searchitems.clear();
      searchitems.addAll(itemList);
      if (searchitems.isNotEmpty) {
        print('name : ${searchitems[0].name}');
      }
    });
  } else {
    setState(() {
      searchitems.clear();
      print('searchitems : $searchitems');
    });
  }
}

内容的提问来源于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 16:46:16