Flutter封装复用的DropdownButton值不更新,setState不生效如何解决
问题原因
你封装的buildDropdown方法中的selectedValue是函数的传入参数,属于局部变量,你在onChanged回调里修改的只是这个局部变量的值,并没有更新State类中存储状态的selectedCredit/selectedGrade列表的对应元素。即便调用了setState,重新构建组件时传入buildDropdown的依旧是状态列表里的旧值,所以下拉框的选中状态不会发生变化。
解决方案
修改思路是给buildDropdown方法新增回调参数,选中新值时直接修改外部状态列表的对应元素,具体修改如下:
- 调整
buildDropdown方法的定义,接收外部传入的选中回调:
DropdownButton<String> buildDropdown({ required String? selectedValue, required List<String> selectedList, required Function(String?) onChanged, // 新增回调参数 }) { return DropdownButton( value: selectedValue, items: selectedList.map((location) { return DropdownMenuItem( value: location, child: Text( location, style: kDropdownTextStyle, ), ); }).toList(), onChanged: onChanged, // 直接使用外部传入的回调逻辑 ); }
- 在
dataRow方法中调用buildDropdown时,传入修改对应状态的逻辑:
Row dataRow({required int index}) { return Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Text( '${index+1}', style: kGPATextStyle, ), buildDropdown( selectedValue: selectedCredit[index], selectedList: _credits, onChanged: (newValue) { setState(() { selectedCredit[index] = newValue; // 直接修改学分列表对应位置的状态值 }); }, ), buildDropdown( selectedValue: selectedGrade[index], selectedList: _grades, onChanged: (newValue) { setState(() { selectedGrade[index] = newValue; // 直接修改成绩列表对应位置的状态值 }); }, ), ], ); }
修改后选中值会直接同步更新到状态列表中,setState触发重绘时下拉框就可以正确显示最新选中值。
内容的提问来源于stack exchange,提问作者Yaswanth
相关产品推荐
相关产品推荐

