You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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框架会将查询返回的对象标记为不可变,或底层存在代理监听机制,直接赋值时触发了静默异常/死锁)。

具体修复方案

  1. 不要直接修改数据库返回的对象,而是创建新的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);
}
  1. 补充注意点:updateObject是异步操作,必须添加await,否则可能导致数据库操作未完成就进入下一次循环,引发未知问题。

原理说明

如果你的DatabaseHandler使用了Room、Hive或其他ORM框架,这类工具通常会返回不可变的对象实例,直接修改属性会触发内部异常(可能被框架静默捕获),导致代码执行中断。通过创建新实例的方式可以绕过这个限制,同时保证数据更新的正确性。

内容的提问来源于stack exchange,提问作者apardes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 19:11:04