Flutter饮品追踪器:如何在数值即将低于0时将其设为0?
饮品追踪器递减计数器问题解决方案
问题根源
原代码的逻辑错误在于:递减操作时先判断当前组件状态的_counter值,而非计算递减后的结果是否小于0。比如当前存储的数值是500ml,点击移除750ml时,会直接执行500-750=-250并存入SharedPreferences,直到下次点击递减按钮时才会触发归零逻辑,这不符合需求。
修复后的代码
Future<void> _decrementCounter({required int amount}) async { final prefs = await SharedPreferences.getInstance(); final currentValue = prefs.getInt('counter') ?? 0; // 计算递减后的值,确保不低于0 int newValue = currentValue - amount; if (newValue < 0) { newValue = 0; } // 先更新存储,再同步UI状态 await prefs.setInt('counter', newValue); setState(() { _counter = newValue; }); }
核心修改点
- 优先从SharedPreferences获取真实存储值,避免组件状态
_counter和存储数据不同步的问题 - 先计算递减后的结果,再判断是否小于0,直接将负数结果修正为0
- 调整执行顺序:先完成SharedPreferences的存储更新,再调用
setState同步UI状态,保证数据一致性
内容的提问来源于stack exchange,提问作者Fabian M
相关产品推荐
相关产品推荐

