Dart中的Function first class和void function有什么区别

问题描述

为了优化我的代码,我尝试在 GestureDetector 小部件的 onTap 属性中使用 Function first class,如下面的代码所示:

 import 'package:Flutter/material.dart';

class ReusableCard extends StatelessWidget {
  final Color colour;
  final Widget? childCard;
  final Function? onPress;
  ReusableCard({required this.colour,this.childCard,this.onPress}) ;

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: onPress,child: Container(
        child: childCard,margin: EdgeInsets.all(15.0),decoration: Boxdecoration(
          color: colour,borderRadius:BorderRadius.circular(10.0),),);
  }
}

但我得到了那个错误:参数类型“函数?”不能分配给参数类型“void Function()?”。

希望有人能解释一下这里发生了什么,并在此之前感谢您。

解决方法

您需要使用 Function()? 而不是 Function? 作为 onPress 变量的类型,因为 onTap 需要一个 GestureTapCallback,它是 {{1 }}。

Function()
,

在这种情况下使用 VoidCallback? 而不是 Function?

最后,VoidCallback 被定义为 typedef VoidCallback = void Function(),因此您甚至可以最终使用 Function()?,但这是一个很酷的快捷方式。