使用dropdown_search添加新选项后弹窗未重建的问题求助
解决DropdownSearch弹窗不更新新增条目的问题
核心原因
你已经用Obx包裹了DropdownSearch,但弹窗打开后属于独立视图层级,初始化时会缓存items的快照,后续brands更新时,弹窗无法自动感知变化,必须关闭重开才能读取最新数据。
可行解决方案
方案1:通过更新Key强制DropdownSearch重建
- 在Controller中将
dropdownKey改为可响应的全局Key:
final dropdownKey = Rx<GlobalKey<DropdownSearchState>>(GlobalKey());
- 在
addNewBrand方法中,添加完新品牌后更新Key:
void addNewBrand() { // 执行你的品牌添加逻辑,例如获取输入值并加入列表 final newBrand = // 从表单获取新增品牌内容 brands.add(newBrand); // 更新Key触发DropdownSearch重建 dropdownKey.value = GlobalKey<DropdownSearchState>(); }
- 视图中使用更新后的Key:
key: cAliment.dropdownKey.value,
当Key变化时,Obx会触发DropdownSearch重建,下次打开弹窗时就能加载最新的品牌列表。
方案2:使用asyncItems实时获取数据
将原有的items参数替换为asyncItems,让弹窗每次打开时都主动拉取最新的品牌列表:
// 注释掉原有的items: cAliment.brands.value asyncItems: (filter) async { return cAliment.brands.value; },
这个方法不需要额外修改状态,弹窗每次打开都会重新获取brands的最新数据,自然能显示新增条目。
方案3:监听列表变化手动刷新弹窗
- 在Controller的
onInit方法中添加brands的监听:
@override void onInit() { super.onInit(); brands.listen((_) { // 调用DropdownSearch的刷新方法更新弹窗 dropdownKey.currentState?.updatePopup(); }); }
- 确保
dropdownKey是普通的全局Key(无需Rx):
final dropdownKey = GlobalKey<DropdownSearchState>();
当brands列表新增条目时,监听回调会触发updatePopup(),直接刷新已打开的弹窗内容,不需要关闭重开。
注意事项
- 确认你的
cAliment.brands是RxList<String>类型,而非普通List,这样GetX才能监听其变化:
final brands = RxList<String>([]);
内容的提问来源于stack exchange,提问作者Orane
相关产品推荐
相关产品推荐

