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
相关产品推荐
相关产品推荐

