Flutter中rawQuery无数据时触发空检查运算符错误的问题排查
问题修复方案
核心错误原因
首次查询无数据时,rawQuery返回空列表[],直接访问result[0]会触发Null check operator used on a null value错误——空列表不存在索引0对应的元素。
步骤1:修复getWaterDrank查询函数
修改函数处理空结果,调整返回类型支持空值,同时修正原代码的语法错误:
static Future<int?> getWaterDrank() async { final db = await WaterDBHelper.db(); List<Map<String, dynamic>> result = await db.rawQuery( "SELECT * FROM $tablename WHERE $columnDate = ?", [dateCurrent] ); if (result.isNotEmpty) { var waterDrank = result[0]['waterDrank']; return waterDrank != null ? int.parse(waterDrank.toString()) : 0; } else { // 无数据时返回null,便于调用方判断 return null; } }
步骤2:调整调用方getWaterDrankStored逻辑
处理getWaterDrank返回null的情况,确保后续计算和业务逻辑正常执行:
getWaterDrankStored(WaterButtonModel) async { int? waterStoredValueConvert = await WaterDBHelper.getWaterDrank(); // 无数据时默认设为0,避免相加运算报错 waterStoredValueInteger = waterStoredValueConvert ?? 0; print('4 this is the instance of getWaterStore ${waterStoredValueInteger}'); int waterDrank = WaterButtonModel.waterMillimeters; TotalWaterDrank = waterStoredValueInteger + waterDrank; print('5 total water ${TotalWaterDrank} ml'); Provider.of<WaterProvider>(context, listen: false).loadWaterData(waterStoredValueInteger); if (filteredInputs.isEmpty) { print('7 insert command ran - ${TotalWaterDrank}'); return _addWater(); } else { print('8 update command ran - ${TotalWaterDrank}'); // 注意:这里应传入最新的TotalWaterDrank,而非旧的存储值 return _updateWaterThrouDate(dateNow, TotalWaterDrank); } }
额外优化建议
- 减少重复查询:
getUserInputDate和getWaterDrank都在查询今日数据,可合并为一个函数,降低数据库访问次数。 - 增强类型安全:将
List result明确指定为List<Map<String, dynamic>> result,避免类型歧义。 - 统一日期判断:依赖
filteredInputs.isEmpty判断是否插入,可直接复用getWaterDrank的返回结果,无需额外查询。
内容的提问来源于stack exchange,提问作者user22187566
相关产品推荐
相关产品推荐

