Flutter:DropdownButton onChange时如何获取菜单项的e.name值
你当前代码里DropdownMenuItem的value绑定的是e.memberId,所以onChanged回调只能拿到memberId。要获取对应的e.name,可以通过选中的memberId从数据源_data中匹配到对应的成员对象,再提取name值。
修改步骤:
- 新增变量保存选中的name(比如
accountName),初始化时和accountId一起赋值:
String accountId = _data[0].memberId; String accountName = _data[0].name; // 初始化默认name
- 在
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
相关产品推荐
相关产品推荐

