为什么
发生这种情况的原因是因为启用了 null 安全性,您的不可为 null 的参数factor
或key
不能是null
。
在函数和构造函数中,这些值可能是null
在没有命名参数的情况下调用函数时:calculate()
或Foo()
。但是,因为类型 (int
和Key
) 是不可为空的,所以这是无效代码 - 它们决不能为空。
解决方案
基本上有三种方法可以解决这个问题:
required
这可能是这个问题最常见的解决方案,它表明必须设置一个变量。这意味着如果我们有(注意required
关键字):
void calculate({required int factor}) {
// ...
}
我们指出factor
必须始终指定参数,这解决了问题,因为只有calculate(factor: 42)
等人。将是函数的有效调用。
默认值
另一种解决方案是提供默认值。如果我们的参数有默认值,我们可以放心地在调用函数时不指定参数,因为将使用默认值来代替:
void calculate({int factor = 42}) {
// ...
}
现在,calculate()
调用将42
用作factor
,这显然是非空的。
可空参数
第三种解决方案是您真正要考虑的问题,即您是否想要一个可为空的参数?如果是这样,在函数中使用参数时,您必须对参数进行空检查。
但是,这是您最常希望解决Key key
问题的方式,因为您并不总是希望在 Flutter 中为您的小部件提供密钥(请注意可空Key?
类型):
class Foo extends StatelessWidget {
const Foo({Key? key}): super(key: key);
// ...
}
现在,您可以Foo()
在不提供密钥的情况下安全地构建。
位置参数
请注意,这同样适用于位置参数,即它们可以设为可空或不可空,但是,它们不能被注释required
并且不能具有默认值,因为它们总是需要传递。
void foo(int param1) {} // bar(null) is invalid.
void bar(int? param1) {} // bar(null) is valid.