为什么可以将类型为`int Function()`的回调作为`void Function()`(例如,用于Flutter setState)的回调函数?

4
Flutter 的 setState 函数的签名如下:
void setState (VoidCallback fn) // VoidCallback equivalent to `void Function()`

文件说明文档指出回调函数没有参数且没有返回值。

我注意到在默认的Flutter创建示例应用程序中可以完全合法地传递这样的函数给setState

void _incrementCounter() {
  setState(() => _counter++);
}

然而,() => _counter++ 定义了一个返回值为 int Function() 的函数。

因此,我创建了自己的测试:

void setState(void Function() fn) {
  fn();
}

void main(List<String> arguments) {

  //Ordinary int function
  int a() {
    print('go tiger!');
    return 5;
  }

  setState(a);
}

这个方法完全正常!我有什么遗漏吗?为什么可以将带有返回值的函数回调传递给 setState 方法?

p.s:如果我为一个函数添加参数,例如 int a(int b),则会产生正确的错误提示。

The argument type 'int Function(int)' can't be assigned to the parameter type 'void Function()'. argument_type_not_assignable
1个回答

7
Dart将返回非void类型的函数视为返回void类型函数的子类型。也就是说,返回值的函数可以替代返回空的函数;只需要丢弃返回值即可。
此外,在Dart中void类型实际上意味着该值不能被使用。例如,以下写法是合法的:
void x = 5;

额外阅读:Dart 中 void 的奇特现象


谢谢!非常感谢。 - Michael Than

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接