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

Flutter调用firstWhere报StateError (Bad state: No element)的解决方法

报错原因

firstWhere默认逻辑为:列表无满足匹配条件的元素时,直接抛出StateError (Bad state: No element)。当传入的value小于10或大于50时,你定义的所有区间都无法匹配,就会触发该报错。

最优修复方案

你原有实现先查找匹配元素、再查询索引,会遍历两次列表,完全可以用内置的indexWhere方法一步实现,该方法找不到匹配项时默认返回-1,无需额外写空判断逻辑,性能更好代码更简洁:

int getIndexSmallPink(int value, List<RangeSmallPink> ranges) {
  return ranges.indexWhere((range) => range.includes(value));
}
firstWhere + orElse 实现方式

如果你明确要使用firstWhere的orElse参数做兜底,不引入额外依赖的实现代码如下:

// 定义私有标记异常,用于识别无匹配区间的场景
class _NoMatchedRangeException implements Exception {
  const _NoMatchedRangeException();
}

int getIndexSmallPink(int value, List<RangeSmallPink> ranges) {
  try {
    final matchedRange = ranges.firstWhere(
      (range) => range.includes(value),
      orElse: () => throw const _NoMatchedRangeException(),
    );
    return ranges.indexOf(matchedRange);
  } on _NoMatchedRangeException {
    // 无匹配区间时返回-1,和List.indexOf找不到元素的返回规则对齐
    return -1;
  }
}

该写法相比indexWhere实现代码冗余,且需要两次遍历列表,非特殊场景不推荐使用。

效果验证
  • 传入区间内数值:如getIndexSmallPink(17, xRangesSmallPink)返回1,对应第二个区间RangeSmallPink(16, 20)
  • 传入区间外数值:如getIndexSmallPink(60, xRangesSmallPink)返回-1,不会再抛出状态异常

内容的提问来源于stack exchange,提问作者Leon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 01:39:18