无法创建 Dart class 对象

Unable to make a Dart class object

我的代码

class Book {
  String title;
  String author;
  int numOfPages;

  Book(String title, String author, int pages) {
    this.title = title;
    this.author = author;
    this.numOfPages = pages;
  }
}

void main() {
  Book bk = Book("Modern Operating Systems", "S.Tannabeaum", 1250);
  print(bk.title);
}

嘿,我是飞镖和编程的新手。实际上,我想在这里创建一个 class 及其构造函数和其中的三个实例。当我想从这个 class 制作一个对象时,我遇到了这个错误!

My code's error message!

你的代码有两个问题。首先,Dart 中的构造函数有两个“阶段”,首先初始化对象,然后在将对象返回给构造函数的调用者之前运行构造函数主体。

这意味着你在这里先创建一个Book对象,而没有设置三个变量。是的,您稍后在构造函数主体中设置这些变量,但那时为时已晚。

下一个问题是,如果您没有在 Dart 中为变量设置值,它将始终默认为值 null。在 Dart 2.12 中,我们默认获得不可空类型 (NNBD),这意味着 Dart 中的所有类型都不允许 null 值,除非指定。您可以通过在类型名称后键入 ? 来指定 null 值的有效性。例如。 String? 允许变量指向 String 对象,或 null.

在这种情况下,我们不需要指定可空类型,因为问题主要是您需要将变量的初始化从构造函数主体移动到对象的初始化阶段,如下所示:

class Book {
  String title;
  String author;
  int numOfPages;

  Book(String title, String author, int pages)
      : this.title = title,
        this.author = author,
        this.numOfPages = pages;
}

同样可以改写成下面这样也是推荐的做法:

class Book {
  String title;
  String author;
  int numOfPages;

  Book(this.title, this.author, this.numOfPages);
}

因为我们在这里只是直接引用我们想要赋予一个值的每个字段。然后,Dart 将使用构造函数中的参数自动分配值。

如果你的构造函数有很多参数,使用命名参数可能更具可读性。这里的 required 关键字表示我们最多提供一个给定的命名参数。如果未指定,则命名参数是可选的(这意味着我们大多数情况下提供默认值或允许 null 使我们的参数有效):

class Book {
  String title;
  String author;
  int numOfPages;

  Book({
    required this.title,
    required this.author,
    required this.numOfPages,
  });
}

void main() {
  final book = Book(
    title: "Modern Operating Systems",
    author: "S.Tannabeaum",
    numOfPages: 1250,
  );
  
  print(book.title); // Modern Operating Systems
}