Flutter如何为Dropdown下拉菜单添加筛选条件仅展示非inactive条目
实现方案
你只需要在遍历生成DropdownMenuItem之前,对数据源增加过滤条件即可,具体修改如下:
- 对
store.tiposContato调用where方法,只保留inactive属性为false的条目 - 额外注意:如果当前已选中的
store.tipoContato属于被过滤的未激活条目,需要主动清空选中值,否则会触发Dropdown的value不在可选列表内的异常,你可以视业务需求决定是否要加这个兼容逻辑。
修改后的完整代码
Widget _createAssuntoField(BuildContext context, ContatoStore store) { // 先过滤得到可用的选项列表 final availableTiposContato = store.tiposContato.where((a) => !a.inactive).toList(); // 可选兼容逻辑:如果当前选中值不在可用列表里,清空选中,避免组件渲染异常 if (store.tipoContato != null && !availableTiposContato.any((a) => a.id == store.tipoContato!.id)) { WidgetsBinding.instance.addPostFrameCallback((_) { store.tipoContato = null; }); } return DropdownButtonFormField<int>( key: Key(ContatoKeys.assuntoInput), hint: Text(LocaleKeys.contactSubjectHint).tr(), value: store.tipoContato?.id, onChanged: (value) => store.tipoContato = availableTiposContato.firstWhere((assunto) => assunto.id == value), validator: (a) => store.validateAssunto ? null : LocaleKeys.selectRequired.tr(), items: availableTiposContato .map((a) => DropdownMenuItem<int>( value: a.id, child: Container( width: MediaQuery.of(context).size.width * 0.85, child: Text(a.assunto, maxLines: 1, overflow: TextOverflow.ellipsis)), )) .toList(), ); }
核心修改说明
- 新增
availableTiposContato变量,预先过滤掉inactive == true的条目,后续生成选项和选中匹配都基于这个过滤后的列表,避免数据不一致 - 可选的兼容逻辑可以避免已选中条目被设置为未激活后,Dropdown组件出现渲染报错
内容的提问来源于stack exchange,提问作者abrev
相关产品推荐
相关产品推荐

