带有继承类的颤振飞镖JsonSerializable

Posted

技术标签:

【中文标题】带有继承类的颤振飞镖JsonSerializable【英文标题】:flutter dart JsonSerializable with inherited class 【发布时间】:2020-09-20 12:10:42 【问题描述】:

我有以下两个类,其中一个类从另一个类扩展,如下所示:

@JsonSerializable(nullable: true)
class Response 
  final String responseCode;
  final String responseMessage;
  final String errorLog;
  Response(this.errorLog, this.responseCode, this.responseMessage);
  factory Response.fromJson(Map<String, dynamic> json) =>
      _$ResponseFromJson(json);

.................................................. ..........

 @JsonSerializable(nullable: false)
class Verify extends Response 
  Data data;
  Verify(
    this.data,
  );
  factory Verify.fromJson(Map<String, dynamic> json) => _$VerifyFromJson(json);
  Map<String, dynamic> toJson() => _$VerifyToJson(this);

每当我尝试从验证类中读取 response 类属性时,它始终为空。

那么请问如何实现呢?

【问题讨论】:

datacontractjsonserializer 是一个 .NET 组件,可以将 .NET 对象直接序列化为 JSON 数据。由于您使用的是颤振和飞镖,而不是 c# 或任何其他 .Net 语言,我删除了标签。 【参考方案1】:

我已经通过在验证类构造函数中将参数传递给 super 来解决这个问题

@JsonSerializable()
class VerifyResponse extends Response 
  Data data;

  VerifyResponse(
    this.data,
    String responseCode,
    String responseMessage,
  ) : super(responseCode: responseCode, responseMessage: responseMessage);

  factory VerifyResponse.fromJson(Map<String, dynamic> json) =>
      _$VerifyResponseFromJson(json);

  Map<String, dynamic> toJson() => _$VerifyResponseToJson(this);

对于响应类,它保持不变

@JsonSerializable()
class Response 
  final String responseCode;
  final String responseMessage;

  Response(this.responseCode, this.responseMessage);

  factory Response.fromJson(Map<String, dynamic> json) =>
      _$ResponseFromJson(json);

这有点烦人,但就是这样。

【讨论】:

【参考方案2】:

您应该从响应类中删除 'final' 关键字

@JsonSerializable(nullable: true)
    class Response 
      String responseCode;
      String responseMessage;
      String errorLog;
      Response(this.errorLog, this.responseCode, this.responseMessage);
      factory Response.fromJson(Map<String, dynamic> json) =>
           _$ResponseFromJson(json);

【讨论】:

删除基类成员中的“final”关键字为我修复了它。谢谢! 为什么?删除final有什么意义。这只意味着这个值将从合同中获取【参考方案3】:

它通过将super(); 显式添加到子类的构造函数来工作。

@JsonSerializable()
class VerifyResponse extends Response 
  Data data;

  VerifyResponse(
    this.data,
    String responseCode,
    String responseMessage,
    //No need to list all parent class properties
    ) : super();

  factory VerifyResponse.fromJson(Map<String, dynamic> json) =>
      _$VerifyResponseFromJson(json);

  Map<String, dynamic> toJson() => _$VerifyResponseToJson(this);

【讨论】:

以上是关于带有继承类的颤振飞镖JsonSerializable的主要内容,如果未能解决你的问题,请参考以下文章

VSCode 飞镖分析器停止识别颤振/飞镖代码

带有颤振回调的报警服务

颤振/飞镖:如何在飞镖 FFI 中使用异步回调?

在你的颤振项目中找不到颤振 sdk 中的飞镖?

为啥颤振分析与飞镖分析不同?

构建颤振项目时如何将飞镖和颤振设置为默认值