在Dart中可以将extension扩展方法作为函数参数传递吗?
Dart扩展方法能否作为函数参数传递?
结论
Dart 2.17 及以上版本支持直接将扩展方法作为函数参数传递,你的示例写法可以直接运行;低于该版本则需要使用替代方案。
版本适配说明
1. Dart 2.17+ 直接使用
从Dart 2.17版本开始引入了扩展方法的tear-off特性,扩展方法可以直接拆分为独立的函数对象,签名完全匹配int Function(int)的要求,和普通顶层函数add100用法完全一致:
extension Add10 on int { int add10() { return this + 10; } } int add100(int x) => x + 100; void main() { // 完全合法,输出 [11,12,13,13,15] print([1, 2, 3, 3, 5].map(Add10.add10).toList()); // 和普通函数用法无区别 print([1, 2, 3, 4, 5].map(add100).toList()); }
2. Dart 2.17 以下版本替代方案
低版本不支持扩展方法tear-off,可选用两种写法实现同等效果:
- 匿名函数包裹调用(Dart箭头函数的参数需要加括号):
[1, 2, 3, 4, 5].map((x) => x.add10());
- 手动封装为符合签名的顶层/静态函数:
int add10(int x) => x.add10(); // 后续可以直接传递 [1,2,3,4,5].map(add10);
底层逻辑说明
扩展方法本质就是语法糖,编译后会生成对应静态函数,第一个参数默认是扩展类型的实例,你的Add10.add10编译后等价于:
static int Add10_add10(int $this) => $this + 10;
所以tear-off后天然匹配单参数的函数签名,不需要额外包裹。
内容的提问来源于stack exchange,提问作者GHvW
相关产品推荐
相关产品推荐

