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

Flutter中如何获取DropdownButton的显示文本及对应选中值?

解决Flutter DropdownButton同时获取id和显示文本的问题

给你两种可行的解决方案,按需选择:

方法一:直接绑定整个数据对象作为选项值

这种方式最直接,把整个FGItem对象设为DropdownMenuItem的value,onChanged回调就能直接拿到包含id和fg_name的完整数据。

步骤:

  1. 先确认你的数据模型类(如果还没定义):
class FGItem {
  final String id;
  final String fgName;

  FGItem({required this.id, required this.fgName});

  // 匹配你的数据集格式,从JSON解析的方法
  factory FGItem.fromJson(Map<String, dynamic> json) {
    return FGItem(
      id: json['id'],
      fgName: json['fg_name'],
    );
  }
}
  1. 修改DropdownButton代码:
return Obx(() => DropdownButton<FGItem>(
      focusColor: Colors.blue,
      underline: SizedBox(),
      isExpanded: true,
      isDense: true,
      hint: Text("Select from List"),
      // 选中值现在是FGItem对象,默认null
      value: fgTaskController.selectedFG.value,
      items: fgTaskController.fgList.map((item) {
        return DropdownMenuItem<FGItem>(
          value: item, // 绑定整个对象
          child: Text(
            item.fgName,
            style: GoogleFonts.notoSerif(
              textStyle: TextStyle(
                fontSize: 20,
                fontWeight: FontWeight.bold,
                color: Colors.blue,
              ),
            ),
          ),
        );
      }).toList(),
      onChanged: (newValue) {
        if (newValue != null) {
          fgTaskController.setSelectedFG(newValue);
          // 直接获取id和fg_name
          final selectedId = newValue.id;
          final selectedFgName = newValue.fgName;
          // 把这两个值添加到ListView的数据源中
          // 示例:_listDataSource.add({"id": selectedId, "fgName": selectedFgName});
        }
      },
    ));
  1. 更新控制器中的选中值定义:
// 在fgTaskController里,把selectedFG的类型改成FGItem?
final selectedFG = Rx<FGItem?>(null);

void setSelectedFG(FGItem? value) {
  selectedFG.value = value;
}

方法二:通过选中的id反向查找对应数据

如果不想改动现有控制器的选中值类型(还是用id作为value),可以在onChanged回调里用选中的id去列表中匹配对应的FGItem。

修改onChanged部分代码即可:

onChanged: (newValue) {
  if (newValue != null) {
    fgTaskController.setSelectedFG(newValue);
    _selectedFG = newValue;
    // 通过id查找对应的条目
    final selectedItem = fgTaskController.fgList.firstWhere(
      (item) => item.id == newValue,
      // 处理找不到的边界情况
      orElse: () => FGItem(id: "", fgName: ""),
    );
    final selectedFgName = selectedItem.fgName;
    // 将id和fgName保存到ListView数据源
    // 示例:_listDataSource.add({"id": newValue, "fgName": selectedFgName});
  }
},

两种方法对比:

  • 方法一:代码更简洁,无需额外查找操作,适合可以调整控制器选中值类型的场景。
  • 方法二:不需要改动现有选中值的逻辑,适合小范围修改的场景。

内容的提问来源于stack exchange,提问作者user19976096

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 11:25:17