在具有空安全性的颤振中将函数作为参数传递

问题描述

升级Flutter 1.25.0-8.1.pre 后认开启空安全,我开始修改我的项目代码。除了作为参数传递的函数外,一切正常,如下例所示:

class AppBarIcon extends StatelessWidget {
  final IconData icon;
  final Function onpressed;
  const AppBarIcon({Key? key,required this.icon,required this.onpressed}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return CupertinoButton(
      child: Icon(icon,size: 28,color: Colors.white),onpressed: onpressed,);
  }
}

onpressed 是必需的参数,因此它不能为空,但是在尝试将函数传递给 CupertinoButton 时出现错误

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

我已经寻找了很长时间的答案和可能的解决方案,但我还没有找到。任何帮助将不胜感激。

解决方法

您像它所说的那样将 Function() 值传递给 void Function() 参数。将您的声明更改为“final void Function() onPressed;”以便输入更接近匹配,并且不可能返回 null 或采用 args。

,

您可以像这样将括号添加到函数声明中,Function() 更新后的代码如下。

class AppBarIcon extends StatelessWidget {
  final IconData icon;
  final Function() onPressed;
  const AppBarIcon({Key? key,required this.icon,required this.onPressed}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return CupertinoButton(
      child: Icon(icon,size: 28,color: Colors.white),onPressed: onPressed,);
  }
}
,

使用 VoidCallback 而不是 void Function(),并为未定义的那些创建自己的。

class FooWidget extends StatelessWidget {
  final VoidCallback onPressed; // Required
  final Widget Function(BuildContext context) builder; // Required 
  final VoidCallback? onLongPress; // Optional (nullable)

  FooWidget({
    required this.onPressed,required this.builder,this.onLongPress,});

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: onPressed,onLongPress: onLongPress,child: builder(context),);
  }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...