Flutter+sqflite实现指定日期区间价格总和计算的方案问询
Flutter中使用sqflite实现日期区间总价计算
针对你现有代码中的问题,以下是修正和优化后的实现方案:
1. 数据库层函数优化
修正函数拼写错误,同时使用SQL参数绑定避免安全隐患,并直接返回处理后的数值类型:
class DatabaseHelper { // ... 原有代码保持不变 ... // 修正函数名拼写,优化SQL参数绑定,返回处理后的double值 Future<double> calculateTotalPeriod(String startDate, String endDate) async { final db = await database; // 使用?占位符绑定参数,避免SQL注入风险 final result = await db.rawQuery( "SELECT SUM($colPrix) AS TOTAL FROM $clientTable WHERE $colDate BETWEEN ? AND ?", [startDate, endDate], ); // 处理查询结果,空值或非数值情况返回0.0 return double.tryParse(result.first['TOTAL'].toString()) ?? 0.0; } }
2. UI层逻辑修正
修复结果取值错误、变量名错误,并增加日期合法性校验:
class ClientListState extends State<ClientList> { // ... 原有代码保持不变 ... // 修正总价计算逻辑 void calculateTotalPeriod() async { // 校验日期是否完整选择 if (startDate.isEmpty || endDate.isEmpty) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('请选择完整的起止日期')), ); return; } // 校验结束日期不早于开始日期 final start = DateTime.parse(startDate); final end = DateTime.parse(endDate); if (end.isBefore(start)) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('结束日期不能早于开始日期')), ); return; } // 调用优化后的数据库函数 final totalSum = await databaseHelper.calculateTotalPeriod(startDate, endDate); setState(() { somme_period = totalSum; // 修正变量名错误:somme → somme_period somme_total_period = somme_period.toStringAsFixed(2); }); } @override Widget build(BuildContext context) { // ... 原有代码保持不变 ... // 对话框内的按钮绑定修正后的函数 OutlinedButton( onPressed: calculateTotalPeriod, child: const Text('计算区间总价'), ), // ... 原有代码保持不变 ... } }
关键注意事项
- 确保数据库中
colDate字段的存储格式与日期选择器输出格式一致(均为yyyy-MM-dd) - 可根据需求增加加载状态提示(比如计算时显示CircularProgressIndicator)
- 如果涉及多语言或不同地区日期格式,需统一日期解析/格式化规则
内容的提问来源于stack exchange,提问作者flutter2022
相关产品推荐
相关产品推荐

