【问题标题】:How to Resolve The Argument type 'String?' can't be assign to parameter type 'String'如何解决参数类型“字符串?”不能分配给参数类型“字符串”
【发布时间】:2021-08-02 08:03:37
【问题描述】:

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

【问题讨论】:

  • 你可以询问一些代码以及你得到的错误。这是一个不完整的问题。

标签: flutter dart dart-null-safety


【解决方案1】:

你可以像这样转换类型:

int? a = 2;
int b;
b = a.toInt();

int? a = 2;
int b;
b = (a as int);

与字符串相同,我们有.toString()as String

【讨论】:

    【解决方案2】:

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

    例如而不是写

    字符串?一种; 我会去的

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

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

    【讨论】:

      【解决方案3】:

      我在我的一个 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
      

      【讨论】:

      • !本质上等同于as String
      • 你是对的,只是as String! bang 运算符更易读,但是! bang 运算符使代码更短!
      【解决方案4】:

      将可空字符串 (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
      }
      

      【讨论】:

        【解决方案5】:

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

        也许您将此与函数式语言或 Java 中的可选类型混淆了。如果可选类型包含值,则可以对其进行解包。

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

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

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

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

        【讨论】:

          【解决方案6】:

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

          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 未初始化,这将不起作用。

          【讨论】:

          • 另一种选择是检查该值是否为空,编译器进行代码分析,我们所有人都很高兴和安全:)
          猜你喜欢
          • 2021-10-21
          • 2021-10-13
          • 2021-09-04
          • 1970-01-01
          • 2021-12-10
          • 2021-12-20
          • 1970-01-01
          • 2022-01-21
          相关资源
          最近更新 更多