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

如何在Dart列表中搜索两个不同参数?能否用contains实现?

Dart列表多参数搜索的简便实现及contains用法解析

现有代码的问题

你当前的实现会重复添加匹配element.image的元素——第一个where已经包含了“名称匹配 或 图片路径匹配”的结果,后续再追加仅图片路径匹配的结果,会导致最终列表里出现大量重复项,这显然不是你想要的效果。

核心问题解答

  1. 能不能用contains解决?
    完全可以,contains本身就是Dart字符串用来判断是否包含指定子串的方法,你的需求刚好可以基于它实现。

  2. 更简便高效的实现方式
    只需要一次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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 08:40:41