【问题标题】:Why is it possible to pass a callback of type `int Function()` as a `void Function()` (e.g. for Flutter setState)?为什么可以将 Type (() => int) 的回调传递给 Flutter setState 函数?
【发布时间】:2020-09-30 03:24:03
【问题描述】:

flutter setState 函数有签名:

void setState (VoidCallback fn) // VoidCallback equivalent to void Function()

文档声明它接受没有参数且没有返回值的回调。

我注意到向 setState 传递这样的函数是完全合法的(在默认的 Flutter 创建示例应用的情况下)

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

但是() => _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);
}

这很好用!我错过了什么吗?为什么可以给 setState 传递一个带返回值的函数回调?

p.s:如果我将参数添加到 - 所以int a(int b) 那么它会正确地抱怨 -

The argument type 'int Function(int)' can't be assigned to the parameter type 'void Function()'.dartargument_type_not_assignable

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

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

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

    void x = 5;
    

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

    【讨论】:

    • 谢谢!非常感谢
    猜你喜欢
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多