错误:尝试添加初始化表达式,或在此构造函数中添加字段初始化器,或将其标记为“迟到”

Kod*_*rth 0 constructor dart flutter

void main() {
  Car c1 = new Car('E1001');
}

class Car {
  String engine;
  Car(String engine) {
    this.engine = engine;
    print("The engine is : ${engine}");
  }
}
Run Code Online (Sandbox Code Playgroud)

Rav*_*vta 6

在飞镖零安全功能中,

  1. 要么使引擎变量可以为空?

    class Car {
      String? engine;
      Car(String engine){
         this.engine = engine;
         print("The engine is : ${engine}");
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 或者添加late关键字来懒惰地初始化它,

    class Car {
      late String engine;
      Car(String engine){
         this.engine = engine;
         print("The engine is : ${engine}");
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 或者在构造函数的初始化块中初始化变量。

    class Car {
      String engine;
      Car(String engine) : engine = engine {
         print("The engine is : ${engine}");
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)

  • 或更多构造函数:Car(this.engine); (2认同)

小智 3

Ravi Setva 接受的答案有助于解决这个问题,但这里解释了为什么方法 1 和 2 有效:

  1. 允许 Nullable:默认情况下,Dart 是“不可为空”的,这意味着变量不能包含值,除非它首先null被初始化。null通过标记在整个程序生命周期中不能为 null 的内容,这具有编译器优化的优点。然而,using?允许nulls 被允许使用。因此,我们应该使用 Dart 没有强加给我们的这一原则。
  2. 延迟初始化:这个概念基本上意味着变量可以在其声明后的瞬间进行初始化。这是通过在变量声明期间使用late关键字来实现的。这样做有许多复杂的原因,其中最简单的原因是在变量声明期间防止繁重的操作,以简化和优化性能,并在以后实际需要时标记这些操作。