【问题标题】:Passing a function as parameter in flutter with null safety在具有空安全性的颤动中将函数作为参数传递
【发布时间】:2021-03-30 03:07:44
【问题描述】:

升级到 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 是必需参数,因此它不能为空,但尝试将函数传递给 CupertinoButton 时出现错误:

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

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

【问题讨论】:

    标签: flutter dart dart-null-safety


    【解决方案1】:

    使用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),
        );
      }
    }
    

    【讨论】:

      【解决方案2】:

      您可以像这样在函数声明中添加括号,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,
          );
        }
      }
      

      【讨论】:

      • 你应该包含void否则Function()会返回dynamic
      • @IBRAHIM ALI MUSAH 非常感谢。你节省了我的时间。
      【解决方案3】:

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

      【讨论】:

      • 是的,您总是需要在Function 之前添加 void 关键字,即使 dart 静态分析不会出错。
      猜你喜欢
      • 2021-06-12
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多