Dart函数
我有下面的Dart函数,我现在使用null safety:
void calculate({int factor}) {
// ...
}
字符串
分析仪投诉:
由于其类型,参数“factor”不能具有“null”值,并且未提供非null默认值。
Flutter小部件
在Flutter中的StatelessWidget
也是如此:
class Foo extends StatelessWidget {
const Foo({Key key}): super(key: key);
// ...
}
型
我得到以下错误:
由于其类型,参数“key”不能具有“null”值,并且未提供非null默认值。
如何解决此问题?
9条答案
按热度按时间vmdwslir1#
为什么
发生这种情况的原因是,在启用了 *null安全性 * 的情况下,不可为null的参数
factor
或key
不能为null
。在函式和建构函式中,如果在没有具名参数的情况下呼叫函式:
calculate()
或Foo()
,则这些值 * 可能 * 是null
。但是,因为型别(int
和Key
)是不可为Null的,所以这是无效的程式码-它们绝对不能为Null。解决方案
基本上有三种方法可以解决这个问题:
required
第一代这可能是这个问题最常见的解决方案,它指示变量必须被设置为。这意味着如果我们有(注意
required
关键字):字符串
我们指出,必须始终指定
factor
参数,这解决了问题,因为只有calculate(factor: 42)
等才是函数的有效调用。默认值
另一个解决方案是提供一个默认值。如果我们的参数有一个默认值,我们可以安全地不指定参数时,调用函数,因为默认值将被使用:
型
现在,一个
calculate()
调用将使用42
作为factor
,这显然是非空的。可为空的参数
第三个解决方案是您真正需要考虑的问题,也就是说,您是否希望有一个可为空的参数?如果是,那么在函数中使用该参数时,您将不得不对该参数进行空值检查。
但是,这是您最常希望解决
Key key
问题的方法,因为您并不总是希望在Flutter中为小部件提供密钥(请注意可空的Key?
类型):型
现在,您可以安全地构造
Foo()
而无需提供密钥。定位参数
请注意,这同样适用于positional参数,即它们可以设置为可空或不可空,但是,它们不能使用
required
进行注解,并且不能具有默认值,因为它们是 * 始终需要 * 传递的。型
pcww981p2#
这就是为什么Dart中增加了不可空特性的主要原因。因为,你要将
Key
传递给超类,超类可能是null
,所以你要确保它是非空的。你可以做的是根本不使用key
,或者为它提供一个默认值,或者使它成为required
。比如:字符串
或者像这样设置
key
:型
ykejflvf3#
如果我从一个指向**
key
的类的constructor
得到这个错误,我在Key
前面添加一个'?
**'标记,如下所示:字符串
'
?
'表示可以是nullable
6jjcrrmo4#
为Eg添加requuired函数
字符串
5ssjco0h5#
作为前面 @creativecreatorormaybenot 的答案的附加信息,您还可以使用位置参数(没有花括号),默认情况下是强制性的,因此不可为空。
字符串
并在不命名参数的情况下调用:
型
这些类型的参数可以通过以下方式在构造函数上使用:
型
和 “后面可以跟命名参数或可选的位置参数(但不能同时跟)",请参阅文档:箭头参数
关于命名参数和位置参数之间的区别的有趣答案:What is the difference between named and positional parameters in Dart?
wkftcu5l6#
在构造函数中的变量之前添加一个必需的关键字,并在Key旁边添加'?'。
字符串
cuxqih217#
在pubspec中更改sdk版本
字符串
gk7wooem8#
在pubspec.yaml中更改SDK版本可以解决以下问题:
环境:sdk:“>=2.1.0 <3.0.0”
iyfjxgzm9#
你有没有试过提供一个默认值?
字符串
对于小部件,添加required修饰符:
型
注意“?”
型