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

Flutter技术问题:如何更新模型中final类型的int值?

解决方案

方案一:优化现有对象替换逻辑

你当前的临时方案是可行的,但可以优化效率——list.indexOf(model)会额外遍历列表找索引,加上外层循环相当于两次遍历。可以直接通过索引遍历,一次搞定:

for (int i = 0; i < list.length; i++) {
  if (list[i].title == _title) {
    list[i] = Model(
      title: list[i].title,
      amount: _selectedAmount,
    );
    break; // 找到目标后直接跳出循环,不用继续遍历
  }
}

如果用Dart集合操作,还能更简洁:

list = list.map((model) {
  return model.title == _title 
      ? Model(title: model.title, amount: _selectedAmount) 
      : model;
}).toList();

方案二:调整Model类设计(按需选择)

如果业务上需要更灵活的更新方式,可以从Model类本身入手:

方式1:将amount改为非final

直接去掉final关键字,就能直接修改字段值:

class Model {
  Model({required this.title, required this.amount});

  final String title;
  int amount; // 移除final约束
}

之后就可以直接用list[index].amount = 3修改,简单直接。

方式2:添加copyWith方法(推荐的不可变对象更新方式)

保持字段为final,给Model加一个copyWith方法,用来创建新对象并修改指定字段,代码更优雅:

class Model {
  Model({required this.title, required this.amount});

  final String title;
  final int amount;

  // 复制对象并修改指定字段
  Model copyWith({String? title, int? amount}) {
    return Model(
      title: title ?? this.title,
      amount: amount ?? this.amount,
    );
  }
}

使用时这样更新:

for (int i = 0; i < list.length; i++) {
  if (list[i].title == _title) {
    list[i] = list[i].copyWith(amount: _selectedAmount);
    break;
  }
}

或者用集合操作简化:

list = list.map((model) => 
  model.title == _title ? model.copyWith(amount: _selectedAmount) : model
).toList();

补充说明

Dart里的final字段在对象初始化完成后就无法再赋值,这是语言层面的约束,用来保证不可变对象的状态稳定。所以如果坚持用final字段,就只能通过创建新对象替换旧对象的方式更新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:55:29