Dart:哪种做法更好?使用 'late' 或构造函数初始化列表

Dart: Which is a better practice? Using 'late' or constructor initializer list

我正在为 Dart class 建模,考虑到新的空安全类型。我相信有两种有效的方法来初始化 non-nullable 属性,根据参数计算。

对于此示例,我们将使用收藏夹 class。

这个class在构造函数中使用初始化列表。

class Favourite {
  int favouriteId;

  Favourite({required this.favouriteId});

  Favourite.mapFromJson(dynamic json)
      : this.favouriteId = json["favouriteId"];
}

此 class 使用 'late' 关键字。

class Favourite {
  late int favouriteId;

  Favourite({required this.favouriteId});

  Favourite.mapFromJson(dynamic json) {
    this.favouriteId = json["favouriteId"];
  }
}

你什么时候会用一个而不是另一个?使用 'late' 感觉有风险。如果我添加另一个命名构造函数,编译器就不会抱怨 'favouriteId' 没有被初始化。

还有其他选择吗?

谢谢!

都没有。

使用初始化字段本身的默认构造函数和处理反序列化 json 对象的工厂构造函数:

class Favourite {
  final int favouriteId;

  Favourite({required this.favouriteId});

  factory Favourite.fromMap(Map<String, dynamic> map) {
    final favouriteId = json['favouriteId'];
    assert(favouriteId != null && favouriteId is int);
    
    return Favourite(
      favouriteId: favouriteId,
    );
  }
}

如果处理不当,late 关键字可能会让人头疼,因此除非万不得已,一般情况下不要使用它。

如果你确定json总是有一个“favouriteId”,你可以这样写:

class Favourite {
  int favouriteId;

  Favourite({required this.favouriteId});

  Favourite.mapFromJson(Map<String, dynamic?> json):
    assert(() {
      final favouriteId = json["favouriteId"];
      return favouriteId != null && favouriteId is int;
    }()),
    favouriteId = json["favouriteId"] as int;
}

void main() {
  
  dynamic m = {"favouriteId":2};
  final favourite = Favourite.mapFromJson(m);
  print("favourite id: ${favourite.favouriteId}");
  
}