Flutter设置对象属性时陷入循环问题求助
问题:无法更新MyObject的unit_value属性,程序卡在赋值行
定义的MyObject类
class MyObject { final int? id; final String name; double? quantity; double? unit_value; MyObject({ this.id, required this.name, this.quantity, this.unit_value, }); }
编写的getData方法
Future<List<MyObject>> getData() async { // 从数据库获取当前对象列表 List<MyObject> myobjects = await DatabaseHandler().listObjects(); for (var i = 0; i < myobjects.length; i++) { var current_object = myobjects[i]; print(1); var current_unit_value = _dataMap[current_object.id]['price']; print(current_unit_value); current_object.unit_value = current_unit_value; print(2); // 更新数据库 DatabaseHandler().updateObject(current_object); } // 重新从数据库拉取数据 myobjects = await DatabaseHandler().listObjects(); return myobjects; }
遇到的问题
循环执行到current_object.unit_value = current_unit_value;时卡住,控制台仅输出:
flutter: 1 flutter: 45
程序从未执行到第二个print(2)语句,且无任何错误提示。注释掉该行代码后,程序运行完全正常,但无法更新目标字段。
解决建议
问题根源是从数据库取出的MyObject实例可能处于不可修改状态(多数ORM框架会将查询返回的对象标记为不可变,或底层存在代理监听机制,直接赋值时触发了静默异常/死锁)。
具体修复方案
- 不要直接修改数据库返回的对象,而是创建新的MyObject实例来更新属性:
for (var i = 0; i < myobjects.length; i++) { var current_object = myobjects[i]; print(1); var current_unit_value = _dataMap[current_object.id]['price']; print(current_unit_value); // 创建新实例,复制原有属性并更新unit_value var updatedObject = MyObject( id: current_object.id, name: current_object.name, quantity: current_object.quantity, unit_value: current_unit_value, ); print(2); // 用新实例更新数据库,注意添加await确保操作完成 await DatabaseHandler().updateObject(updatedObject); }
- 补充注意点:
updateObject是异步操作,必须添加await,否则可能导致数据库操作未完成就进入下一次循环,引发未知问题。
原理说明
如果你的DatabaseHandler使用了Room、Hive或其他ORM框架,这类工具通常会返回不可变的对象实例,直接修改属性会触发内部异常(可能被框架静默捕获),导致代码执行中断。通过创建新实例的方式可以绕过这个限制,同时保证数据更新的正确性。
内容的提问来源于stack exchange,提问作者apardes
相关产品推荐
相关产品推荐

