Flutter中Autocomplete组件的optionsBuilder未调用原因排查
问题描述
以下是一段Flutter代码:
Widget returnAutoCompleteForTankLine(BuildContext context, MyAquariumManagerTanksModel tanksModel, TextEditingController textController, Tank? currentTank) { myPrint("in returnAutoCompleteForTankLine"); return Autocomplete<String>( //initialValue: TextEditingValue(text: initialText), optionsBuilder: (TextEditingValue textEditingValue) { myPrint("in optionsbuilder"); if (textEditingValue.text == '') { myPrint("in optionsbuilder, emptyee"); return const Iterable<String>.empty(); } myPrint("do we have tanklines, ${tanksModel.returnListOfTankLines()}"); return tanksModel.returnListOfTankLines().where((String option) { return option.contains(textEditingValue.text.toLowerCase()); }); }, fieldViewBuilder: (BuildContext context, TextEditingController textEditingController, FocusNode focusNode, VoidCallback onFieldSubmitted) { myPrint("in fieldViewBuilder"); return TextField( controller: textController, focusNode: focusNode, onChanged: (String value) { myPrint("do we come here?"); }, ); } ); }
这段代码中的TextField可正常工作,但optionsBuilder内部的代码从未被调用,请问这可能是什么原因?
原因分析与解决方案
核心问题:替换了Autocomplete的内部控制器
Autocomplete的optionsBuilder依赖自身内部的TextEditingController监听输入变化,但你在fieldViewBuilder里直接用了外部传入的textController,导致Autocomplete无法感知输入框的文本变化,自然不会触发optionsBuilder。
解决办法:直接使用fieldViewBuilder参数提供的textEditingController;如果需要和外部控制器同步,可以给内部控制器添加监听,双向同步文本内容。焦点传递异常(次要可能)
虽然你把focusNode传给了TextField,但如果焦点状态没有正确通知到Autocomplete组件,也可能导致选项面板不触发。可以检查焦点是否正确绑定,或者手动触发焦点测试。数据空值不影响调用(仅排查项)
即便tanksModel.returnListOfTankLines()返回空列表,optionsBuilder也应该会被调用,只是不会显示选项。所以数据为空不是optionsBuilder不执行的原因,但可以后续验证数据是否正常。
内容的提问来源于stack exchange,提问作者user22100324
相关产品推荐
相关产品推荐

