在Dart中使用Map的firstWhereOrNull扩展报错,求原因解析
问题
我了解已有同类问题,但仍有疑惑。我参考已有实现编写了如下Map扩展:
extension ExtendedMap on Map { /// The first entry satisfying test, or null if there are none. MapEntry? firstWhereOrNull(bool Function(MapEntry entry) test) { for (var entry in this.entries) { if (test(entry)) return entry; } return null; } }
随后我尝试调用:
someMap?.firstWhereOrNull((date) => (date > recentSunday )&& (date <= nextSunday)
却出现如下错误:
The operator '>' isn't defined for the type 'MapEntry<dynamic, dynamic>'.Try defining the operator '>'. The operator '<=' isn't defined for the type 'MapEntry<dynamic, dynamic>'.Try defining the operator '<='.
我对此感到困惑,原以为传入任意布尔函数即可生效,请问为何会要求定义该运算符?
解答
问题核心是你误解了回调参数的类型:firstWhereOrNull的回调函数接收的是**MapEntry类型**的参数,但你直接把它当成日期类型做比较(date > recentSunday),而MapEntry本身并没有定义>和<=运算符,所以编译器报错。
你需要从MapEntry里明确取出要比较的键或值:
- 如果你的
someMap的键是日期类型,就用entry.key - 如果值是日期类型,就用
entry.value
修正后的调用示例:
// 假设键为日期类型 someMap?.firstWhereOrNull((entry) => (entry.key > recentSunday) && (entry.key <= nextSunday)); // 假设值为日期类型 someMap?.firstWhereOrNull((entry) => (entry.value > recentSunday) && (entry.value <= nextSunday));
另外,建议给扩展加上泛型约束,让代码类型更安全:
extension ExtendedMap<K, V> on Map<K, V> { /// The first entry satisfying test, or null if there are none. MapEntry<K, V>? firstWhereOrNull(bool Function(MapEntry<K, V> entry) test) { for (var entry in entries) { if (test(entry)) return entry; } return null; } }
这样后续调用时,IDE会自动提示entry.key或entry.value的类型,避免类似的类型错误。
内容的提问来源于stack exchange,提问作者Flitzcore
相关产品推荐
相关产品推荐

