Dart/Flutter中Function与Function()的区别是什么?
Dart/Flutter中
Function和Function()的核心区别 二者本质是通用基类和具体函数类型的差异,约束性、类型检查逻辑完全不同,具体差异如下:
- 类型约束强度不同
Function是Dart所有函数类型的顶层基类,不限制参数数量、参数类型、返回值类型,声明的变量可以接收任意函数:
final Function x; // 以下赋值全部合法 x = () => print('无参无返回值函数'); x = (int count) => count * 2; // 单参函数 x = (String name, int age) => '$name:$age'; // 多参函数
Function()是明确的无参函数类型签名,只允许接收无参的函数,赋值其他类型函数会直接触发编译报错:
final Function() x; x = () => print('合法赋值'); // 编译通过 x = (int a) => print(a); // 编译报错:参数类型不匹配
- 调用时的校验逻辑不同
调用Function类型的变量时,编译阶段不会校验传参是否正确,只有运行时才会抛出异常,隐患极大:
final Function x = () => print('测试'); x(123, '测试参数'); // 编译完全正常,运行时才会报参数数量不匹配的错误
调用Function()类型的变量时,编译阶段就会校验传参合法性,提前发现问题:
final Function() x = () => print('测试'); x(123); // 编译直接报错,不用等到运行阶段
- 适用场景不同
- 仅当你需要接收完全未知签名的通用函数时,才建议使用
Function,绝大多数业务场景都不推荐,会丢失静态类型检查能力 - 明确接收无参函数时使用
Function(),如果需要更严格的类型约束,还可以进一步声明带参数、返回值的签名,比如int Function(String)代表接收一个String类型参数、返回int的函数,类型安全性最高。
- 仅当你需要接收完全未知签名的通用函数时,才建议使用
内容的提问来源于stack exchange,提问作者Jaszczurga
相关产品推荐
相关产品推荐

