假设有一个abstract
Car
类和一个派生的Cabrio
类。
他从REST API接收到一个包含数据的JSON
abstract class Car {
int id;
String name;
String description;
Car({
this.id,
this.name,
this.description,
});
factory Car.fromJson(Map<String, dynamic> json, String type) {
Car car;
if (type == 'cabrio') car = Cabrio.fromJson(json);
// other possible if-statements
car.id = int.parse(json['id']);
car.name = json['name'];
car.description = json['description'];
return car;
}
class Cabrio extends Car {
String roofMaterial;
String someOtherProp;
Cabrio({
id,
name,
this.roofMaterial,
this.someOtherProp
}) : super(
id: id,
name: name,
description: description);
factory Cabrio.fromJson(Map<String, dynamic> json) =>
Cabrio(
roofMaterial: json['roof_material'],
someOtherProp: json['some_other_prop']
);
}
dynamic dyn = jsonDecode(response.body);
Cabrio cabrio = Car.fromJson(dyn[0], 'cabrio');
cabrio.roofMaterial // null
cabrio.someOtherProp // null
return cabrio;
为什么cabrio.roofMaterial
或cabrio.someOtherProp
是null
?
我为什么采取这种方法
我不喜欢看到
id: json['id']
这种方法是为了防止这种冗余
我知道的
- 根据调试器,派生类
Cabrio
的属性由其fromJson
中的json值正确设置 - 在
car.name = json['name']
检查car
对象时,派生类的属性(如cabrio.roofMaterial
)已经是null
我认为是个问题
位于
if (type == 'cabrio') car = Cabrio.fromJson(json, type);
我正在将一个cabrio
对象“推入"一个Car
对象(它的属性比Cabrio
少)。但这应该不会错,因为它只是一个父类类型
1条答案
按热度按时间xzlaal3s1#
在本例中,您需要在调用
Car.fromJson(...)
后进行显式类型转换,以确保您处理的类型是具有额外字段的Cabrio
,而不是Car
的示例final cabrio = Car.fromJson(json, 'cabrio') as Cabrio;
我花了一些时间将您的代码更新为Dart的更新版本,并进行了必要的更改,以确保这些字段不再为空
https://gist.github.com/MarkOSullivan94/60ce6625538e16f373c5c1d6254952e9