如何使用 Null Safety 和 Instantiate 更新 Dart 的工厂构造函数?

How to Update a Factory constructor for Dart with Null Safety and Instantiate?

我有一个对我来说似乎很简单的问题;然而,我还是想不通。

我一直在通过一些过时的书籍学习 Dart。可以理解的是,我遇到了一个我无法解决的问题。我正在关注的书是 Alessandro Biessek(2019 年)在工厂构造部分下的 'Flutter for Beginners'。以下代码来自本书(第 48-49 页):

class Student extends Person {
Student(firstName, lastName) : super (firstName, lastName);
}

class Employee extends Person {
Employee(firstName, lastName) : super (firstName, lastName);
}

class Person {
  String firstName;
  String lastName;
  
  Person([this.firstName, this.lastName]);
  
  factory Person.fromType([PersonType type]){
    switch(type){
      case PersonType.employee:
        return Employee();
      case PersonType.student:
        return Student();
    }
    return Person();
  }
  
  String getfullName() => '$firstName $lastName';
}

enum PersonType { student, employee}

我的问题:

  1. 如何更新此代码以使其成为 null 安全的?
  2. 如何实例化代码?我如何成为学生或员工?我这里脑子一片空白
  3. Factory 构造函数的使用频率是多少?

我尝试过的: 1a) 我试图设置参数 firstName 和 lastName = ''。 1b) 我还尝试从构造函数和工厂构造函数中删除 [] 。 2) 我不明白如何实例化一个工厂人。但是,我尝试了以下方法来实例化它:

void main() {
Person.fromType(PersonType.employee)
  ..firstName = 'Clark'
  ..lastName = 'Kent';
}

在DartPad中没有成功

如有任何帮助,我们将不胜感激。

由于您的 class 属性 可以是 null 您需要添加 ?. 您的代码中的另一个问题是 StudentEmployee 有一个带有两个参数的构造函数,但在您的 factory Person.fromType 中您调用它时没有任何参数.

class Person {
  String? firstName;
  String? lastName;
  
  Person([this.firstName, this.lastName]);
  
  factory Person.fromType(Person person, [PersonType? type]){
    switch(type){
      case PersonType.employee:
        return Employee(person.firstName, person.lastName);
      case PersonType.student:
        return Student(person.firstName, person.lastName);
      default:
        return person;
    }
 
  }
  
  String getfullName() => '$firstName $lastName';
}
final Person person = Person('FirstName', 'LastName');
  
final Student student = Person.fromType(Person('WithoutLastName'), PersonType.student) as Student;
  
final Employee employee = Person.fromType(person, PersonType.employee) as Employee;