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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:31:03