我想设置一个默认值AvailableService
。对于原语来说它足够简单。我将如何使用自定义对象来做到这一点
class Submenu extends Equatable {
@JsonKey(defaultValue: "")
final String name;
@JsonKey(defaultValue: new AvailableService(false,false,false,false))
final AvailableService availableService;
}
自定义对象:
AvailableService {
bool supportsDelivery;
bool supportsTableService;
bool supportsCollection;
bool supportsChat;
}
编译时错误是
Arguments of a constant creation must be constant expressions.
Try making the argument a valid constant, or use 'new' to call the constructor
一般来说,作为注释参数,您只能传递常量,因此您不能传递使用 new 创建的对象,而只能使用 const 构造函数(您应该将所有可用服务字段定义为final,并定义一个 const 构造函数)。
然而,在 json_Serialized 中,defaultValue 目前有一些额外的限制:
- 您甚至不能使用使用创建的自定义对象常量构造函数(或者你会得到错误“它必须是一个字面意思”)。有一个公开请求要求删除此限制:#741 - 常量作为默认值 https://github.com/google/json_serializable.dart/issues/741
- 作为 defaultValue,仅允许使用文字;然后你可以通过地图文字 (ie:
@JsonKey(defaultValue: {"supportsDelivery" : false, "supportsTableService" : false, /* etc */})
),但即使这种可能性目前也仅适用于具有 Map 类型的字段的默认值,而不适用于具有自定义类型的字段(如AvailableService)。在这种情况下,您不会收到错误,但永远不会使用 defaultValue(通过查看 .g.dart 文件中生成的代码,您可以理解原因)。对于这个问题也有公开的请求:#676 - 允许默认值编码为 JSON https://github.com/google/json_serializable.dart/issues/676 and #789 - 如何为嵌套 JSON 对象设置默认值? https://github.com/google/json_serializable.dart/issues/789
因此,目前,在跟进上述请求之前,我找到的唯一解决方法是处理fromJson()
工厂:
factory AvailableService.fromJson(Map<String, dynamic> json) =>
json != null
? _$AvailableServiceFromJson(json)
: AvailableService(false, false, false, false);
简而言之,JsonKey.defaultValue
现在仅支持文字-甚至不接受常量-并且只能用于基本类型字段(或List、Map、Set)的默认值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)