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

Flutter带防抖的AutoComplete下拉选项不显示问题排查

自定义Flutter AutoComplete下拉选项不显示问题排查

你遇到的核心问题是Autocomplete组件未感知到API返回后更新的_options列表,导致下拉框无法刷新展示新选项。以下是具体问题点和修复方案:

问题根源分析

  1. Autocomplete未响应_options更新
    Autocomplete的optionsBuilder仅在文本框的TextEditingValue变化时触发,但你的防抖逻辑是延迟800ms后才更新_options,此时文本框内容已经稳定,不会再触发optionsBuilder,新的_options无法被Autocomplete识别。

  2. 重复过滤导致匹配失效
    API已经根据输入的关键词返回了匹配结果,但你在optionsBuilder里又对_options做了一次本地过滤。如果防抖完成后用户输入的文本已经变化(比如输入速度快于800ms),两次过滤的条件不一致,会导致没有符合条件的选项被返回。

  3. 冗余控制器引发状态混乱
    你自行维护了_controller,但Autocomplete的fieldViewBuilder已经提供了专用的fieldTextEditingController,两者状态不同步会导致逻辑冲突。

修复方案

1. 让Autocomplete感知_options变化

给Autocomplete设置动态Key,当_options更新时强制组件重建,触发optionsBuilder重新执行:

Autocomplete<String>(
  key: ValueKey<List<String>>(_options), // 用_options作为Key,更新时自动重建
  // ...其他属性
)

2. 移除重复过滤逻辑

API返回的结果已经是匹配当前搜索词的,直接返回_options即可,避免本地二次过滤导致的匹配问题:

optionsBuilder: (TextEditingValue textEditingValue) {
  if (textEditingValue.text.isEmpty) {
    return const Iterable<String>.empty();
  }
  return _options; // 直接返回API获取的结果
},

3. 清理冗余控制器

去掉自行维护的_controller,直接使用Autocomplete提供的控制器,保证状态同步:

// 移除initState和dispose中对_controller的代码
// 修改onSelected逻辑
onSelected: (String selection) {
  fieldTextEditingController.text = selection;
  state.didChange(selection);
},

额外优化点

在_getOptions方法中,先清空旧的_options再赋值新数据,避免旧数据干扰:

setState(() {
  _isLoading = false;
  _options = []; // 先清空旧数据
  _options = data.map((item) => item[widget.config['api']['labelKey']].toString()).toList();
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 19:13:19