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

Flutter中切换交易收支类型的两种实现方法:哪种更优?

两种交易类型切换方法的差异与优劣分析

我实现了切换交易类型的功能,可将支出转为收入、收入转为支出。最初编写了如下方法:

void swapTransaction(TransactionModel transaction)
{
  transaction.isExpense=!transaction.isExpense;
  update();
}

该方法运行正常,但之后不得不改用另一种方法:

void swapTransaction(TransactionModel transaction)
{
  int index=_transactions.indexOf(transaction);
  _transactions[index].isExpense=!_transactions[index].isExpense;
  update();
}

想了解哪种方法更优,二者是否存在显著差异?


核心差异

两种写法都是修改TransactionModel的isExpense属性,但修改的对象指向可靠性有本质区别:

  • 第一种直接修改传入的transaction对象。只有当这个对象和_transactions列表里的是同一个内存引用时,列表内的对象状态才会同步改变,UI更新才能生效。如果传入的是原对象的拷贝(比如某些状态管理场景下的不可变副本),修改操作只会作用在副本上,原列表里的对象毫无变化,自然触发不了正确的UI更新。
  • 第二种先通过indexOf定位对象在列表中的位置,再直接修改列表内的对象。这种写法强制确保修改的是列表里的原对象,只要indexOf能找到有效索引,就不会出现“修改无效”的问题,彻底规避了第一种写法的引用一致性风险。

优劣对比

  • 第一种写法:更简洁,少了一次列表查找的性能开销。但仅适用于能100%保证传入的transaction就是_transactions列表中原对象引用的场景,一旦出现引用不一致,就会导致逻辑失效。
  • 第二种写法:兼容性更强,可靠性更高,能应对更多复杂场景(比如不可变对象、状态同步延迟等)。但要注意:如果indexOf返回-1(找不到目标对象),直接访问_transactions[index]会抛出数组越界异常,建议补充判断逻辑:
void swapTransaction(TransactionModel transaction)
{
  int index = _transactions.indexOf(transaction);
  if (index != -1) {
    _transactions[index].isExpense = !_transactions[index].isExpense;
    update();
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 19:55:33