为什么
发生这种情况的原因是因为启用了 null 安全,您的 non-nullable 参数 factor 或 key 不能 是 @ 987654323@.
在函数和构造函数中,当函数在没有命名参数的情况下调用时,这些值可能为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.