繁体   English   中英

将 function 作为 flutter 中的参数传递给 null 安全

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM