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

Flutter Autocomplete组件无法显示全部匹配列表项问题

问题原因及解决方案

问题出在大小写匹配逻辑上:你的代码仅将输入文本转为小写,但原列表中的选项(比如"Banana")保留了首字母大写的格式。直接执行option.contains(textEditingValue.text.toLowerCase())时,"Banana"字符串中并不包含小写的"ban",导致匹配失败。

修正后的核心代码

只需将选项也转为小写,再和转小写的输入文本做包含判断:

Autocomplete<String>(
  optionsBuilder: (TextEditingValue textEditingValue) {
    if (textEditingValue.text == '') {
      return const Iterable<String>.empty();
    }
    final inputText = textEditingValue.text.toLowerCase();
    return food.where((String option) {
      // 同时将选项转为小写,消除大小写差异
      return option.toLowerCase().contains(inputText);
    });
  },
  onSelected: (String selection) {
    debugPrint('You just selected $selection');
  },
),

针对900+条数据的性能优化建议

每次输入都遍历全量数据并做字符串转小写,可能带来轻微性能损耗。可以提前生成小写缓存,减少重复计算:

// 提前初始化缓存:原字符串与对应小写字符串的映射
final Map<String, String> foodLowercaseMap = {
  for (var item in food) item: item.toLowerCase()
};

// 在Autocomplete中使用缓存
Autocomplete<String>(
  optionsBuilder: (TextEditingValue textEditingValue) {
    if (textEditingValue.text == '') {
      return const Iterable<String>.empty();
    }
    final inputText = textEditingValue.text.toLowerCase();
    return food.where((option) {
      return foodLowercaseMap[option]!.contains(inputText);
    });
  },
  onSelected: (String selection) {
    debugPrint('You just selected $selection');
  },
),

内容的提问来源于stack exchange,提问作者Milie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:50:21