Flutter带防抖的AutoComplete下拉选项不显示问题排查
你遇到的核心问题是Autocomplete组件未感知到API返回后更新的_options列表,导致下拉框无法刷新展示新选项。以下是具体问题点和修复方案:
问题根源分析
Autocomplete未响应
_options更新
Autocomplete的optionsBuilder仅在文本框的TextEditingValue变化时触发,但你的防抖逻辑是延迟800ms后才更新_options,此时文本框内容已经稳定,不会再触发optionsBuilder,新的_options无法被Autocomplete识别。重复过滤导致匹配失效
API已经根据输入的关键词返回了匹配结果,但你在optionsBuilder里又对_options做了一次本地过滤。如果防抖完成后用户输入的文本已经变化(比如输入速度快于800ms),两次过滤的条件不一致,会导致没有符合条件的选项被返回。冗余控制器引发状态混乱
你自行维护了_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

