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

Flutter中DropdownButton同时使用int与string值的实现求助

解决方案:用数据类封装关联的int和string值

要同时获取DropdownMenuItem对应的int值和显示的string文本,最简洁的方式是创建一个数据类来封装这两个关联值,而非单独存储int。选中项时可直接拿到包含双值的对象,轻松调用对应属性。

步骤1:定义数据类

创建类保存每个选项的数值与文本:

class SizeOption {
  final int value;
  final String label;

  SizeOption({required this.value, required this.label});
}

步骤2:重构选中变量与下拉选项列表

将原有selectedValue改为SizeOption类型,同时重构下拉选项列表:

// 默认选中第一个选项
SizeOption selectedOption = SizeOption(value: 10, label: 'Small');

List<DropdownMenuItem<SizeOption>> dropdownItems = [
  DropdownMenuItem(
    value: SizeOption(value: 10, label: 'Small'),
    child: Text(
      'Small',
      style: TextStyle(
        fontSize: 20,
        fontFamily: 'Inconsolata',
        fontWeight: FontWeight.bold,
        color: Color(0xCBFDC4AB),
      ),
    ),
  ),
  const DropdownMenuItem(
    value: SizeOption(value: 20, label: 'Medium'),
    child: Text(
      'Medium',
      style: TextStyle(
        fontSize: 20,
        fontFamily: 'Inconsolata',
        fontWeight: FontWeight.bold,
        color: Color(0xCBFDC4AB),
      ),
    ),
  ),
  const DropdownMenuItem(
    value: SizeOption(value: 30, label: 'Large'),
    child: Text(
      'Large',
      style: TextStyle(
        fontSize: 20,
        fontFamily: 'Inconsolata',
        fontWeight: FontWeight.bold,
        color: Color(0xCBFDC4AB),
      ),
    ),
  ),
];

步骤3:更新DropdownButton组件

修改DropdownButton泛型为SizeOption,并在onChanged中更新选中对象:

DropdownButton<SizeOption>(
  value: selectedOption,
  items: dropdownItems,
  dropdownColor: Colors.brown,
  underline: Container(
    height: 3,
    color: const Color(0xCBFDC4AB),
  ),
  icon: Icon(
    CupertinoIcons.arrowtriangle_down_fill,
    color: const Color(0xCBFDC4AB),
    size: 10,
    shadows: [
      Shadow(
        color: Colors.yellow.withOpacity(0.9),
        blurRadius: 10,
      )
    ],
  ),
  onChanged: (SizeOption? newOption) {
    setState(() {
      selectedOption = newOption!;
    });
  },
),

步骤4:分别调用int值与string值

通过selectedOption直接获取两个值:

// 显示int值的文本组件
Text(
  "\$${selectedOption.value}",
  style: const TextStyle(
    fontSize: 40,
    fontFamily: 'Inconsolata',
    fontWeight: FontWeight.bold,
    color: Color(0xADFFF0E8),
  ),
),

// 显示string值的文本组件
Text(selectedOption.label),

补充:优化选项列表写法

若选项较多,可通过循环简化列表创建,避免重复代码:

// 定义原始数据列表
final List<Map<String, dynamic>> sizeData = [
  {'value': 10, 'label': 'Small'},
  {'value': 20, 'label': 'Medium'},
  {'value': 30, 'label': 'Large'},
];

// 生成DropdownMenuItem列表
List<DropdownMenuItem<SizeOption>> dropdownItems = sizeData.map((item) {
  return DropdownMenuItem(
    value: SizeOption(value: item['value'], label: item['label']),
    child: Text(
      item['label'],
      style: TextStyle(
        fontSize: 20,
        fontFamily: 'Inconsolata',
        fontWeight: FontWeight.bold,
        color: Color(0xCBFDC4AB),
      ),
    ),
  );
}).toList();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 06:44:59