Dart中如何累加多个卡片的TimeOfDay格式总时长
实现多卡片工作时长累加的方案
要实现所有卡片的工作时长累加,不能直接对"HH:mm"格式的字符串做拼接或数值运算,得先把每个时长转换成可计算的时间对象(Duration)或总分钟数,累加后再格式回字符串。以下是具体实现步骤:
1. 维护所有卡片的时长数据
在你的状态类中添加一个存储容器,用来记录每个卡片的时长(两种方案二选一即可):
// 方案一:用List存储每个卡片的Duration对象 List<Duration> allCardDurations = []; // 方案二:直接维护累加的总分钟数(更节省内存) int totalAccumulatedMinutes = 0;
2. 修改单卡片时长计算逻辑
在原有的increment方法中,计算出单个卡片的时长后,同步更新存储容器:
var format = DateFormat("HH:mm"); void increment() { setState(() { data = { 'beginHour': result['beginHour'], 'endHour': result['endHour'], // 其他字段... }; var one = format.parse(result['beginHour']); var two = format.parse(result['endHour']); var delta = two.difference(one); // 方案一:将当前卡片的Duration加入列表 allCardDurations.add(delta); // 方案二:直接累加总分钟数 totalAccumulatedMinutes += delta.inMinutes; // 保留原有单卡片时长的格式化逻辑(如果需要显示单卡片时长) String singleCardTotal = "${delta.inHours.toString().padLeft(2, '0')}:${delta.inMinutes.remainder(60).toString().padLeft(2,'0')}"; }); }
3. 计算并格式化总时长
写一个方法,把累加后的总时长转换成"HH:mm"格式的字符串:
对应方案一(基于List):
String getTotalWorkDuration() { Duration totalDuration = Duration(); // 遍历所有卡片的时长进行累加 for (var duration in allCardDurations) { totalDuration += duration; } // 格式化为HH:mm字符串 int hours = totalDuration.inHours; int minutes = totalDuration.inMinutes.remainder(60); return "${hours.toString().padLeft(2, '0')}:${minutes.toString().padLeft(2, '0')}"; }
对应方案二(基于总分钟数):
String getTotalWorkDuration() { int hours = totalAccumulatedMinutes ~/ 60; int minutes = totalAccumulatedMinutes % 60; return "${hours.toString().padLeft(2, '0')}:${minutes.toString().padLeft(2, '0')}"; }
4. 使用总时长
在需要展示总时长的位置调用方法即可,例如:
Text("总工作时长:${getTotalWorkDuration()}")
注意事项
- 如果卡片支持删除、编辑操作,记得同步更新
allCardDurations或totalAccumulatedMinutes,保证数据一致性。 - 使用
DateFormat需要导入intl包,若未导入,需在pubspec.yaml中添加依赖:dependencies: intl: ^0.18.1
内容的提问来源于stack exchange,提问作者blue8ird
相关产品推荐
相关产品推荐

