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
相关产品推荐
相关产品推荐

