【问题标题】:I have few questions relating to the null safety feature which is offered by dart or flutter关于 dart 或 flutter 提供的 null 安全功能,我没有几个问题
【发布时间】:2021-09-14 04:54:42
【问题描述】:

关于 Flutter/Dart 提供的 null 安全功能,我有几个问题。

  1. flutter 项目是否必须使用 null 安全功能?
  2. 如果我不使用 null 安全功能,我是否仍然能够使用所有现有和最新的颤振小部件,以及它们必须提供的所有最新功能?我的意思是,是否有任何特定功能仅在启用 null 安全功能时可用。
  3. 如果我不对 Flutter 项目使用 null 安全功能,除了 null 检查之外,我还会遇到哪些主要缺点?
  4. 即使代码是正确的,我发现null安全特性会一直抛出null check operator错误,这很烦人。

谁能帮助回答我的问题,因为我发现这种空安全性非常令人困惑和烦人。我确实浏览了一些视频,但我仍然不相信。

非常感谢您提前提供的帮助。

【问题讨论】:

    标签: flutter dart flutter-layout flutter-web


    【解决方案1】:
    1. 可以覆盖空安全性

    2. 是的,您应该仍然可以使用新的颤振小部件。

    3. 如果你使用 don't null-safety,它会更慢

    4. 这更像是一个陈述而不是一个问题

    Understanding Null Safety.

    【讨论】:

      【解决方案2】:
      1. flutter 项目是否必须使用 null 安全功能?

      不,您仍然可以使用以前的 SDK 约束来不遵守 NULL 安全规则

      environment:
        sdk: ">=2.11.0 <3.0.0"
      

      1. 如果我不使用 null 安全功能,我是否仍然能够使用所有现有和最新的颤振小部件,以及它们必须提供的所有最新功能?我的意思是,是否有任何特定功能仅在启用 null 安全功能时可用。

      是的,前提是您如上所述设置了环境,或者您也可以在 Dart 文件的顶部指定禁用对该文件的空检查。

      // @dart=2.9
      

      1. 如果我不对 Flutter 项目使用 null 安全功能,除了 null 检查之外,我还会遇到哪些主要缺点?

      请注意,消除 null 不是目标。 null 没有任何问题。相反,能够表示没有值真的很有用。有时表明缺席真的很重要。不好的不是 null,而是 让 null 出现在你意想不到的地方会导致问题。所以为了避免这种崩溃,Dart 迁移到 Sound NULL Safety。


      1. 即使代码是正确的,我发现null安全特性会一直抛出null check operator错误,这很烦人。

      您绝对可以使用方便的? null-aware 运算符将某些类型设为 NULL。例如,您可以将您的String 设为String?,前提是表明缺席非常重要,并且不会在未来的程序流程中造成问题。

      在任何表达式之后添加!(空断言运算符)相当于说“嘿 Dart!相信我,这个值永远不会为空”。

      最初,它可能会给您带来很多麻烦。但请记住,将您的应用迁移到 Sound Null Safety 是值得的。


      进一步阅读 -

      1. https://dart.dev/null-safety
      2. Why NULL Safety ?

      【讨论】:

        【解决方案3】:

        示例:

        class Animal {
          Dog dog;
        }
        
        class Dog{
         String name;
        }
        

        运算符“!”: 如果允许它为 null 并允许它抛出异常。

        main(){
          Animal animal = Animal();
          print(animal.dog!.name); // throw exception dog is null
        }
        

        运算符“?” 如果你想要,如果当前参数为空,它什么也不做

        main(){
          Animal animal = Animal();
          print(animal.dog?.name); // output emplty
        }
        

        如果当前值为null,可以给参数一个替换值

        main(){
          Animal animal = Animal();
          print(animal.dog?.name ?? "The kiki"); // output "The kiki"
        }
        

        要求的函数不为空

        fun getName(String name){
         print(name); 
        }
        
        main(){
           String? name = null;
          getName(name); // throw an exception because the required the name argument is not null
        }
        

        函数允许null

        fun getName(String? name){
         print(name); 
        }
        
        main(){
           String? name = null;
          getName(name); // output null
        }
        

        构造函数中的空值安全

        使用必需的运算符

        class Animal {
          String? name;
          String age;
          Animal({this.name,required this.age}); // The age argument not allowed to be null so you must add the required operator first
        }
        

        或使用位置参数构造函数

        class Animal {
              String? name;
              String age;
              Animal(this.age, {this.name}); // age is positional argument
            }
        

        或使用默认值构造函数

        class Animal {
              String? name;
              String age;
              Animal({this.name, this.age = "18" }); // age is positional argument
            }
        

        【讨论】:

          猜你喜欢
          • 2021-04-21
          • 2022-07-20
          • 1970-01-01
          • 2015-10-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-06-19
          • 1970-01-01
          相关资源
          最近更新 更多