Flutter DropdownButton选中值后不更新,如何用_selectedLocation更新默认值
核心问题原因
你代码存在两处核心错误导致选中值无法同步更新:
- 未给
DropdownButton组件绑定value属性,组件无法识别当前选中的对应值 DropdownMenuItem的value赋值为location(从取location["name"]判断为Map类型),但onChanged回调中将值强转为String赋值给_selectedLocation,类型不匹配导致组件无法匹配到对应选中项
两种修复方案,按需选择
方案1:value存储完整location对象(适合后续需要使用location其他字段的场景)
- 修正
_selectedLocation的变量类型,和item的value类型保持一致:
Map<String, dynamic>? _selectedLocation;
- 给
DropdownButton补充value属性,同时修正hint处的取值逻辑:
DropdownButton( // 新增此行,绑定当前选中值 value: _selectedLocation, hint:_selectedLocation==null ? const Text('Dropdown') : Text( // 取Map里的name字段展示 _selectedLocation!["name"].toString(), style: const TextStyle(color: Colors.black), ), // 其余原有属性不变... items: countrylist!.map((location){ return DropdownMenuItem( value: location, child: Text(location["name"].toString()), ); }).toList(), onChanged: (newValue){ setState(() { // 无需强转String,直接匹配Map类型 _selectedLocation = newValue as Map<String, dynamic>?; }); }, )
方案2:value仅存储名称字符串(仅需要展示选中名称的场景)
不需要修改_selectedLocation的原有String?类型,直接调整组件配置即可:
DropdownButton( // 新增此行,绑定当前选中值 value: _selectedLocation, hint:_selectedLocation==null ? const Text('Dropdown') : Text( _selectedLocation.toString(), style: const TextStyle(color: Colors.black), ), // 其余原有属性不变... items: countrylist!.map((location){ return DropdownMenuItem( // 修改value为字符串类型的名称 value: location["name"].toString(), child: Text(location["name"].toString()), ); }).toList(), onChanged: (newValue){ setState(() { _selectedLocation = newValue as String?; }); }, )
注意事项
- 所有
DropdownMenuItem的value不能重复,否则会抛出匹配异常 - 上述代码必须在
StatefulWidget的build方法中实现,setState才能触发界面重绘更新
内容的提问来源于stack exchange,提问作者Ctnkaya
相关产品推荐
相关产品推荐

