如何解析参数类型“字符串”?不能分配给参数类型 'String'

时间:2021-05-11 23:22:13

标签: flutter dart dart-null-safety

在大于 2.12.0 的 dart sdk 中,我们经常使用 '?'确保该参数也可以具有空值,但是如何使用 ?数据类型没有?或相反亦然。什么可以是最喜欢的方式来整理“int”?不能是“int”类型。

5 个答案:

答案 0 :(得分:2)

null 安全是一种表示类型可以或不可以为 null 的方法,您没有在对象内包装任何东西,因此您没有任何东西可以解包。

也许您将其与函数式语言或 Java 中的可选类型混淆了。如果一个可选类型包含一个值,它可以被解包。

使用 dart,谷歌做出另一个决定,让用户有可能在不检查对象是否为 null 的情况下编写干净的代码,反之亦然,因此使用 null 安全性,您可以获得代码无法访问的数学证明到空引用。

所以,如果你需要解开空对象或者你不需要它,或者你需要这样的检查

foo(int? i) {
  if (i != null) {
    print(i + 1);
  }
}

我想指出一位 dart 开发人员的重要参考资料,其中描述了为什么谷歌做出这个决定https://medium.com/dartlang/why-nullable-types-7dd93c28c87a

答案 1 :(得分:1)

将可空字符串 (String?) 分配给不可空字符串 (String) 时会出现此错误。例如:

String? s = 'a';

int expectsString(String s) => s.length;

void main() {
  expectsString(s); // <-- Error
}

解决方案是提供一个不可为空的 String。您可以使用:

(1) 局部变量:

void main() {
  var s1 = s; // Local variable 
  expectsString(s1 ?? 'default value');
}

(2) Bang 运算符:

void main() {
  expectsString(s!); // Bang operator
}

答案 2 :(得分:0)

如果编译器知道可空变量已初始化,您可以将其赋予不可空变量,例如,这有效:

String? a; //a is nullable
a = 'some value'; // a is initialized

String b = ''; // b is not nullable
b = a; //b can receive a once a is initialized

那是因为编译器知道 a 不为空,但如果 a 没有初始化,这将不起作用。

答案 3 :(得分:0)

我在我的一个 flutter 应用程序中遇到了类似的问题,我已经通过从 String?String 的类型转换修复了它。

就像下面的代码:

// I'm using a List with one element to generate the same error,
// because the error doesn't happen for one single variable.

List<String?> imageUrls = ['https://www.example.com/example_image.png',];

// you cast the element imageUrls[0] with 'as' keyword from String? to String

NetworkImage(imageUrls[0] as String); // NetworkImage() takes String parameter

答案 4 :(得分:0)

处理字符串时,我会用空字符串实例化变量。

例如而不是写作

字符串?一种; 我会一起去

字符串 a = ""; 这并不理想,但它是一种临时解决方案,尤其是在使用变量 a 作为命名构造函数时。

有了这个,我可以和平地使用 a 作为变量而不必担心 String?与 String 的类型不同。