[英]Passing a function as parameter in flutter with null safety
升级到 Flutter 1.25.0-8.1.pre null 安全默认启用后,我开始修改我的项目的代码。 一切正常,除了作为参数传递的函数,如下例所示:
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是必需的参数,因此它不能是 null 但在尝试将 function 传递给CupertinoButton时出现错误:
The argument type 'Function' can't be assigned to the parameter type 'void Function()?'.
我已经在寻找答案和可能的解决方案很长时间了,但我还没有找到。 任何帮助将非常感激。
您正在将Function()
值传递给void Function()
参数,就像它说的那样。 将您的声明更改为“final void Function() onPressed;” 以便打字更接近匹配并且不可能返回 null 或带参数。
您可以像这样将括号添加到 function 声明中, 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),
);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.