如何使用工厂构造函数创建对象?
Posted
技术标签:
【中文标题】如何使用工厂构造函数创建对象?【英文标题】:How to create objects using the factory constructor? 【发布时间】:2020-08-16 16:16:32 【问题描述】:我已经使用 https://app.quicktype.io/ 转换了我的 json 数据,这是结果
import 'dart:convert';
LoginRespon loginResponFromJson(String str) => LoginRespon.fromJson(json.decode(str));
String loginResponToJson(LoginRespon data) => json.encode(data.toJson());
class LoginRespon
String status;
Data data;
LoginRespon(
this.status,
this.data,
);
factory LoginRespon.fromJson(Map<String, dynamic> json) => LoginRespon(
status: json["status"],
data: Data.fromJson(json["data"]),
);
Map<String, dynamic> toJson() =>
"status": status,
"data": data.toJson(),
;
class Data
String resource;
String unit;
Data(
this.resource,
this.unit,
);
factory Data.fromJson(Map<String, dynamic> json) => Data(
resource: json["resource"],
unit: json["unit"],
);
Map<String, dynamic> toJson() =>
"resource": resource,
"unit": unit,
;
这是我的原始 json 数据...在我转换之前
"status":200,
"data":
"resource":"abc",
"unit":"a"
我想使用 LoginRespon
模型在我的 json 数据中定义每个值...我正在这样做
List<LoginRespon> mydata = [];
Map<String, dynamic> res = json.decode(response.body);
mydata.add(LoginRespon(
status: res['status'],
pesan: res['pesan'],
resources:...?
unit:...?
));
通过使用该代码,我很困惑如何在res[data]
中调用resources
和unit
... 有没有办法调用resources
和unit
的值,因为它们在对象内部的对象中?
【问题讨论】:
【参考方案1】:如果您为 LoginRespon 类创建了工厂构造函数,那么为什么要传递这些命名参数?
您可以直接使用您的工厂构造函数并传递解码后的响应。例如。如下:
Map<String, dynamic> res = json.decode(response.body);
mydata.add(
LoginRespon.fromJson(res);
);
您的工厂将负责将正确的值传递给您在 LoginRespon 类的 .fromJson 方法中声明的变量。
如果您没有设置工厂构造函数,那么您将不得不按照您在此代码示例中创建的方式创建 LoginRespon 对象,即通过将值传递给命名参数并且这会起作用,但即使那样你将无法将值传递给变量 resource
和 unit
,因为它们在类声明中不存在,您必须改为传递 Data
对象(其中包含 resource
和 unit
的值分别)。
【讨论】:
我已经尝试过了,我收到错误消息说The named parameter 'resources' isn't defined.
是否有另一种方法,因为resources
在对象的对象内
好的,我刚刚查看了您的 LoginRespon 类,它甚至没有称为资源和单元的字段,它有一个数据字段,因此要么更改该实例变量,要么将数据对象传递给它而不是资源和单位!
是的...资源和单元在Data
....的类中。有什么我应该添加的吗?
我已经通过传递 Data
对象进行了尝试,其中包含资源和单位的值...非常感谢您的解释和解决方案【参考方案2】:
你可以嵌套它
res['data']['resource']
mydata.add(LoginRespon(
status: res['status'],
pesan: res['pesan'],
resources:res['data']['resource']
unit:res['data']['unit']
));
【讨论】:
我试过了...但是参数resources
总是没有定义..还有其他方法,因为资源和单元在Data
的类中
直到你有任何带有资源名称的参数,它才会被定义。以上是关于如何使用工厂构造函数创建对象?的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript 创建对象 (工厂模式构造函数模式原型模式组合使用构造函数模式与原型模式)