在 dart 中使用初始化构造函数的问题

问题描述 投票:0回答:2

我尝试使用传递给构造函数的值初始化下面的类变量,但它不起作用。 我尝试了直接在构造函数声明方法,是正确的,但是我想知道这个方法的问题

void main() {
  var humanInstance = new Human(1001, 'david', 'jemi', 'us');
  humanInstance.sleep();
}

class Human {
  int id;
  String firstName;
  String lastName;
  String nationality;

   Human(int id, String firstName, String lastName, String nationality){
    this.id = id;
    this.firstName = firstName;
    this.lastName = lastName;
    this.nationality = nationality;
   }

  void sleep() {
    print("$firstName is sleeping now...");
  }
}

我得到了这些错误:

tempCodeRunnerFile.dart:7:7: Error: Field 'id' should be initialized because its type 'int' doesn't allow null.
  int id;
      ^^
tempCodeRunnerFile.dart:8:10: Error: Field 'firstName' should be initialized because its type 'String' doesn't allow null.
  String firstName;
         ^^^^^^^^^
tempCodeRunnerFile.dart:9:10: Error: Field 'lastName' should be initialized because its type 'String' doesn't allow null.
  String lastName;
         ^^^^^^^^
tempCodeRunnerFile.dart:10:10: Error: Field 'nationality' should be initialized because its type 'String' doesn't allow null.
  String nationality;
         ^^^^^^^^^^^
dart class oop constructor
2个回答
-1
投票

为了让你的程序工作,你必须声明变量

late
:

void main() {
  var humanInstance = Human(1001, 'david', 'jemi', 'us');
  humanInstance.sleep();
}

class Human {
  late int id;
  late String firstName;
  late String lastName;
  late String nationality;

   Human(int id, String firstName, String lastName, String nationality){
    this.id = id;
    this.firstName = firstName;
    this.lastName = lastName;
    this.nationality = nationality;
   }

  void sleep() {
    print("$firstName is sleeping now...");
  }
}

-1
投票

在 Dart 中,如果实例变量没有显式初始化,则实例变量会隐式初始化为 null,但这种初始化仅适用于可为 null 的变量。但是,在 Human 类中,您声明了不可为 null 的变量 id、firstName、lastName 和国籍,它们不能为 null。因此,Dart 要求您在使用它们之前显式初始化它们。 Dart 提供了直接在构造函数参数中初始化实例变量的快捷方式。

class Human {
  int id;
  String firstName;
  String lastName;
  String nationality;

  // Constructor with instance variable initialization shortcut
  Human(this.id, this.firstName, this.lastName, this.nationality);

  void sleep() {
    // Using instance variables
    print("$firstName is sleeping now...");
  }
}

在 Dart 中,如果某个字段有一个合理的默认值并且对于所有实例都相同,则可以在声明实例变量时直接使用该默认值。这样,您不需要在构造函数中显式初始化它。让我们将其应用到您的 Human 类中:

void main() {
  var humanInstance = Human(1001, 'david', 'jemi', 'us');
  humanInstance.sleep();
}

class Human {
  int id;
  String firstName;
  String lastName;
  String nationality;

  // Constructor
  Human(this.id, this.firstName, this.lastName, [this.nationality = 'unknown']);

  void sleep() {
    print("$firstName is sleeping now...");
  }
}

还有另一个解决方案,您可以为字段设置默认值:

class Human {
  int id = 0;
  String firstName ='';
  String lastName = '';
  String nationality = '';

  // Constructor
  Human(int id, String firstName, String lastName, String nationality) {
    // Initializing instance variables within the constructor
    this.id = id;
    this.firstName = firstName;
    this.lastName = lastName;
    this.nationality = nationality;
  }

  void sleep() {
    // Using instance variables
    print("$firstName is sleeping now...");
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.