如何在Dart列表中搜索两个不同参数?能否用contains实现?
Dart列表多参数搜索的简便实现及contains用法解析
现有代码的问题
你当前的实现会重复添加匹配element.image的元素——第一个where已经包含了“名称匹配 或 图片路径匹配”的结果,后续再追加仅图片路径匹配的结果,会导致最终列表里出现大量重复项,这显然不是你想要的效果。
核心问题解答
能不能用
contains解决?
完全可以,contains本身就是Dart字符串用来判断是否包含指定子串的方法,你的需求刚好可以基于它实现。更简便高效的实现方式
只需要一次where筛选,同时优化重复的大小写转换操作(避免循环里反复执行相同计算),就能得到正确结果:
void _runFilter(String searchKeyword) { List<Product> results = []; // 提前把搜索关键词转小写,只做一次 final lowerCaseKeyword = searchKeyword.toLowerCase(); if (lowerCaseKeyword.isEmpty) { // 用List.from创建副本,避免后续修改影响原列表 results = List.from(allProducts); } else { results = allProducts.where((element) { // 每个元素的字段也只转一次小写 final lowerCaseName = element.name.toLowerCase(); final lowerCaseImage = element.image.toLowerCase(); // 同时判断两个字段是否包含关键词 return lowerCaseName.contains(lowerCaseKeyword) || lowerCaseImage.contains(lowerCaseKeyword); }).toList(); } setState(() { filteredProducts = results; }); }
优化点说明
- 减少重复计算:把搜索关键词、元素的name和image提前转成小写,避免在循环中反复执行相同的字符串转换操作,提升性能
- 避免重复元素:只用一次
where筛选,确保每个符合条件的元素只出现一次 - 安全处理原列表:用
List.from(allProducts)代替直接赋值,防止后续修改results时意外改动原allProducts列表
内容的提问来源于stack exchange,提问作者umutcan bağdu
相关产品推荐
相关产品推荐

