未初始化 final class 变量的构造函数

Constructor with not initialized final class variables

我有这个class:

class Entry {
  final String id;
  final List<ListEntry> listEntries;

  Entry({this.listEntries}):
        id = Uuid().v4();

  Entry.withId({this.id, this.listEntries});
}
// create new class instance
var e = Entry();

现在,当我在 e.listEntries 上调用任何方法时,我将得到一个 NPE,因为它没有被初始化。如果未提供构造函数参数,是否可以将其默认为空列表?

您可以使用工厂构造函数:

class Entry {
  final String id;
  final List<String> listEntries;

  factory Entry({List<String> listEntries}) {
    return Entry._(listEntries ?? []);
  }

  Entry._(this.listEntries):
        id = Uuid().v4();

  Entry.withId({this.id, this.listEntries});
}

您可以在初始化列表中初始化字段,而不是使用 this.ListEntries(初始化形式)。

class Entry {
  final String id;
  final List<ListEntry> listEntries;

  Entry({List<ListEntry> listEntries})
      : this.withId(id: Uuid().v4(), listEntries: listEntries);

  Entry.withId({this.id, this.listEntries}) 
      : listEntries = listEntries ?? [];
}
// create new class instance
var e = Entry();

这里我重用了Entry.withId构造函数,所以我只需要写一次。