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

Flutter如何为Dropdown下拉菜单添加筛选条件仅展示非inactive条目

实现方案

你只需要在遍历生成DropdownMenuItem之前,对数据源增加过滤条件即可,具体修改如下:

  1. 对store.tiposContato调用where方法,只保留inactive属性为false的条目
  2. 额外注意:如果当前已选中的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 01:15:07