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); }); }
代码关键点说明
- 空输入处理:输入为空时清空搜索结果并更新UI,同时设置
loading状态 - 统一大小写:将搜索文本和地址转为小写,实现不区分大小写的模糊匹配
- 空值安全:使用
?.和??处理可能为空的address和addr1字段,避免空指针崩溃 - 遍历原始数据:基于原始
items列表筛选,不修改原始数据源 - 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
相关产品推荐
相关产品推荐

