为什么可以将类型 (() => int) 的回调传递到 flutter setState 函数中?

Mic*_*han 3 dart flutter

flutter setState 函数具有签名:

void setState (VoidCallback fn) // VoidCallback equivalent to void Function()
Run Code Online (Sandbox Code Playgroud)

文档声明它需要没有参数和返回值的回调。

我注意到将这样的函数传递给 setState 是完全合法的(在默认 flutter create 示例应用程序的情况下)

void _incrementCounter() {
  setState(() => _counter++);
}
Run Code Online (Sandbox Code Playgroud)

但是() => _counter++定义了一个返回值的函数。Type (() => dynamic)

所以我创建了自己的测试台:

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

void main(List<String> arguments) {

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

  setState(a);
}

Run Code Online (Sandbox Code Playgroud)

这工作得很好!我错过了什么吗?为什么可以将带有返回值的函数回调传递给 setState?

ps:如果我向 a 添加一个参数 -int a(int b)那么它会正确地抱怨 -

The argument type 'int Function(int)' can't be assigned to the parameter type 'void Function()'.dartargument_type_not_assignable
Run Code Online (Sandbox Code Playgroud)

jam*_*lin 6

Dart 将返回非 void 类型的函数视为返回 void 类型的函数的子类型。也就是说,一个有返回值的函数可以替代一个没有返回值的函数;你只是丢弃返回值。

此外,voidDart 中的类型实际上意味着该值不能被使用。例如,这是合法的:

void x = 5;
Run Code Online (Sandbox Code Playgroud)

补充阅读:https : //medium.com/flutter-community/the-curious-case-of-void-in-dart-f0535705e529