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)
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