Flutter DropDownButton选中新值不更新,保存至DynamoDB后状态未同步问题
问题根因
你的实现存在两个核心问题:
- 临时修改值存在全局变量里,每次改任意一行的下拉框都会覆盖全局值,调用
setState刷新时所有行都读取同一个全局值,自然会出现整列取值都被修改的问题 - 下拉框的
value属性绑定的是aprts列表中对应元素的availabily属性,你选了新值之后只改了全局变量,没有更新本地列表里对应元素的属性,界面自然不会刷新,必须手动拉取最新数据才会更新展示
修复方案
1. 修复下拉框逻辑
修改下拉框的onChanged回调,选中新值时先更新当前行对应元素的本地属性,再调用setState刷新界面,这一步仅修改内存数据,不会触发云端更新:
DropdownButton<String>( value: element.availabily, onChanged: (String newValue) { setState((){ // 仅修改本地对象属性,刷新界面展示 element.availabily = newValue; }); // 保留原有记录逻辑,供保存按钮提交用 availValue = newValue; tempAvail = element; }, items: <String>['AVAILABLE', 'SOLD', 'RESERVED'] .map((String value) { return DropdownMenuItem<String>( value: value, child: Text(value), ); }).toList(), )
2. 修复TextField输入异常问题
你当前每次渲染都会新建TextEditingController,会导致输入时焦点丢失、输入回弹的问题,建议替换为TextFormField用initialValue绑定值:
DataCell(TextFormField( initialValue: element.price.toString(), onChanged: (text) { // 同样先更新本地属性刷新界面 element.price = int.tryParse(text) ?? element.price; aptPrice = text; tempPrice = element; }, )), DataCell(TextFormField( initialValue: element.area, onChanged: (text) { element.area = text; aptArea = text; tempArea = element; }, )),
3. 保存逻辑保持不变
点击保存按钮时,你原有提交到DynamoDB的逻辑不需要修改,提交成功后也不需要额外刷新界面,本地列表的属性已经和提交值完全一致。
内容的提问来源于stack exchange,提问作者Asfand Salam Alavi
相关产品推荐
相关产品推荐

