You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 05:25:05