使用 fromJson 实现 Flutter null 安全

Sca*_*aux 3 dart flutter dart-null-safety

最近迁移到 Flutter null 安全功能,我有很多类需要更新。

对于我的模型,我使用fromJsonjson 对象反序列化数据。late这迫使我为每个非可选字段添加关键字。

这是正确的做法吗?

class ServerSession {
  late String sessionId;
  late String refreshToken;
  late String accessToken;

  ServerSession({required this.sessionId, required this.refreshToken, required this.accessToken});

  ServerSession.fromJson(Map<String, dynamic> json) {
    sessionId = json['session_id'] ?? json['sessionId'];
    refreshToken = json['refresh_token'] ?? json['refreshToken'];
    accessToken = json['access_token'] ?? json['accessToken'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['sessionId'] = this.sessionId;
    data['refreshToken'] = this.refreshToken;
    data['accessToken'] = this.accessToken;
    return data;
  }
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*ore 8

不它不是。您应该使用初始化列表来初始化类的字段。您可以在语言教程中阅读有关初始化程序列表的更多信息。

class ServerSession {
  String sessionId;
  String refreshToken;
  String accessToken;

  ServerSession({required this.sessionId, required this.refreshToken, required this.accessToken});

  ServerSession.fromJson(Map<String, dynamic> json) :
    sessionId = json['session_id'] ?? json['sessionId'],
    refreshToken = json['refresh_token'] ?? json['refreshToken'],
    accessToken = json['access_token'] ?? json['accessToken'];

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['sessionId'] = this.sessionId;
    data['refreshToken'] = this.refreshToken;
    data['accessToken'] = this.accessToken;
    return data;
  }
}
Run Code Online (Sandbox Code Playgroud)

我个人会使用对象的“普通”构造函数并创建fromJson一个工厂构造函数,尽管这两种方法都有效。

class ServerSession {
  String sessionId;
  String refreshToken;
  String accessToken;

  ServerSession({required this.sessionId, required this.refreshToken, required this.accessToken});

  factory ServerSession.fromJson(Map<String, dynamic> json) {
    return ServerSession(
      sessionId: json['session_id'] ?? json['sessionId'],
      refreshToken: json['refresh_token'] ?? json['refreshToken'],
      accessToken: json['access_token'] ?? json['accessToken']
    );
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['sessionId'] = this.sessionId;
    data['refreshToken'] = this.refreshToken;
    data['accessToken'] = this.accessToken;
    return data;
  }
}

Run Code Online (Sandbox Code Playgroud)