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

Flutter:DropdownButton onChange时如何获取菜单项的e.name值

解决DropdownButton获取对应name值的问题

你当前代码里DropdownMenuItem的value绑定的是e.memberId,所以onChanged回调只能拿到memberId。要获取对应的e.name,可以通过选中的memberId从数据源_data中匹配到对应的成员对象,再提取name值。

修改步骤:

  1. 新增变量保存选中的name(比如accountName),初始化时和accountId一起赋值:
String accountId = _data[0].memberId;
String accountName = _data[0].name; // 初始化默认name
  1. 在onChanged回调中,通过memberId匹配对应的成员对象,提取并保存name:
onChanged: (String? value) {
  if (value != null) {
    dropdownvalue.value = value;
    accountId = value;
    // 根据memberId找到对应成员,找不到时返回默认项避免报错
    final selectedMember = _data.firstWhere(
      (member) => member.memberId == value,
      orElse: () => _data[0],
    );
    accountName = selectedMember.name; // 保存对应的name值
  }
}

完整修改后的代码片段:

BlocBuilder<MemberBloc, MemberState>(builder: (context, state) {
  if (state.hasError) {
    return const Text('error');
  } else if (state.isLoading) {
    return const CircularProgressIndicator(
      strokeWidth: 2,
    );
  } else {
    final _data = state.membersList;
    ValueNotifier<String> dropdownvalue =
        ValueNotifier(_data[0].memberId);
    String accountId = _data[0].memberId;
    String accountName = _data[0].name; // 新增name变量
    log(accountId);
    return ValueListenableBuilder(
        valueListenable: dropdownvalue,
        builder: (BuildContext context, String vale, Widget? _) {
          return DropdownButton(
              menuMaxHeight: 300,
              value: dropdownvalue.value,
              onChanged: (String? value) {
                if (value != null) {
                  dropdownvalue.value = value;
                  accountId = value;
                  // 匹配对应成员并获取name
                  final selectedMember = _data.firstWhere(
                    (member) => member.memberId == value,
                    orElse: () => _data[0],
                  );
                  accountName = selectedMember.name;
                }
              },
              items: _data.map((e) {
                return DropdownMenuItem(
                  child: Text(e.name),
                  value: e.memberId,
                );
              }).toList());
        });
  }
})

额外提醒:

你现在把ValueNotifier放在BlocBuilder的builder方法内,每次Bloc状态变化都会重新创建这个Notifier,可能引发不必要的组件重建。建议将ValueNotifier移到StatefulWidget的state类中,或者直接用setState管理选中值,这样逻辑更稳定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 08:06:23