问题描述
升级到 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),);
}
}