由于Dart中的类型,该参数的值不能为“null”

fsi0uk1n  于 2023-11-14  发布在  其他
关注(0)|答案(9)|浏览(177)

Dart函数

我有下面的Dart函数,我现在使用null safety:

  1. void calculate({int factor}) {
  2. // ...
  3. }

字符串
分析仪投诉:
由于其类型,参数“factor”不能具有“null”值,并且未提供非null默认值。

Flutter小部件

在Flutter中的StatelessWidget也是如此:

  1. class Foo extends StatelessWidget {
  2. const Foo({Key key}): super(key: key);
  3. // ...
  4. }


我得到以下错误:
由于其类型,参数“key”不能具有“null”值,并且未提供非null默认值。
如何解决此问题?

vmdwslir

vmdwslir1#

为什么

发生这种情况的原因是,在启用了 *null安全性 * 的情况下,不可为null的参数factorkey不能null
在函式和建构函式中,如果在没有具名参数的情况下呼叫函式:calculate()Foo(),则这些值 * 可能 * 是null。但是,因为型别(intKey)是不可为Null的,所以这是无效的程式码-它们绝对不能为Null。

解决方案

基本上有三种方法可以解决这个问题:

required第一代

这可能是这个问题最常见的解决方案,它指示变量必须被设置为。这意味着如果我们有(注意required关键字):

  1. void calculate({required int factor}) {
  2. // ...
  3. }

字符串
我们指出,必须始终指定factor参数,这解决了问题,因为只有calculate(factor: 42)等才是函数的有效调用。

默认值

另一个解决方案是提供一个默认值。如果我们的参数有一个默认值,我们可以安全地不指定参数时,调用函数,因为默认值将被使用:

  1. void calculate({int factor = 42}) {
  2. // ...
  3. }


现在,一个calculate()调用将使用42作为factor,这显然是非空的。

可为空的参数

第三个解决方案是您真正需要考虑的问题,也就是说,您是否希望有一个可为空的参数?如果是,那么在函数中使用该参数时,您将不得不对该参数进行空值检查。
但是,这是您最常希望解决Key key问题的方法,因为您并不总是希望在Flutter中为小部件提供密钥(请注意可空的Key?类型):

  1. class Foo extends StatelessWidget {
  2. const Foo({Key? key}): super(key: key);
  3. // ...
  4. }


现在,您可以安全地构造Foo()而无需提供密钥。

定位参数

请注意,这同样适用于positional参数,即它们可以设置为可空或不可空,但是,它们不能使用required进行注解,并且不能具有默认值,因为它们是 * 始终需要 * 传递的。

  1. void foo(int param1) {} // foo(null) is invalid.
  2. void bar(int? param1) {} // bar(null) is valid.

展开查看全部
pcww981p

pcww981p2#

这就是为什么Dart中增加了不可空特性的主要原因。因为,你要将Key传递给超类,超类可能是null,所以你要确保它是非空的。你可以做的是根本不使用key,或者为它提供一个默认值,或者使它成为required。比如:

  1. MyPage({Key key = const Key("any_key")}) : super(key: key);

字符串
或者像这样设置key

  1. MyPage({required Key key}) : super(key: key);

ykejflvf

ykejflvf3#

如果我从一个指向**key的类的constructor得到这个错误,我在Key前面添加一个'?**'标记,如下所示:

  1. const ClassName({Key? key}) : super(key: key);

字符串
'?'表示可以是nullable

6jjcrrmo

6jjcrrmo4#

为Eg添加requuired函数

  1. required Key key,
  2. required this.id,
  3. required this.name,
  4. required this.code,
  5. required this.img,
  6. required this.price,
  7. required this.promotionPrice,
  8. required this.size,
  9. required this.color,

字符串

5ssjco0h

5ssjco0h5#

作为前面 @creativecreatorormaybenot 的答案的附加信息,您还可以使用位置参数(没有花括号),默认情况下是强制性的,因此不可为空。

  1. void calculate(int factor) {
  2. // ...
  3. }

字符串
并在不命名参数的情况下调用:

  1. calculate(12);


这些类型的参数可以通过以下方式在构造函数上使用:

  1. class Foo extends StatelessWidget {
  2. final String myVar;
  3. const Foo(this.myVar, {Key? key}): super(key: key);
  4. // ...
  5. }


“后面可以跟命名参数或可选的位置参数(但不能同时跟)",请参阅文档:箭头参数
关于命名参数和位置参数之间的区别的有趣答案:What is the difference between named and positional parameters in Dart?

展开查看全部
wkftcu5l

wkftcu5l6#

在构造函数中的变量之前添加一个必需的关键字,并在Key旁边添加'?'。

  1. MyHomePage({Key? key, required this.title}) : super(key: key);

字符串

cuxqih21

cuxqih217#

在pubspec中更改sdk版本

  1. environment:
  2. sdk: ">=2.7.0 <3.0.0"

字符串

gk7wooem

gk7wooem8#

在pubspec.yaml中更改SDK版本可以解决以下问题:
环境:sdk:“>=2.1.0 <3.0.0”

iyfjxgzm

iyfjxgzm9#

你有没有试过提供一个默认值?

  1. void calculate({int factor=0}) {

字符串
对于小部件,添加required修饰符:

  1. final String yourParameter;
  2. const Foo({Key? key, required this.yourParameter}): super(key: key);


注意“

  1. const Foo({Key? key}): super(key: key);

展开查看全部

相关问题