【问题标题】: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] 中调用resourcesunit... 有没有办法调用resourcesunit 的值,因为它们在对象内部的对象中?

【问题讨论】:

    标签: json list dictionary flutter


    【解决方案1】:

    如果您为 LoginRespon 类创建了工厂构造函数,那么为什么要传递这些命名参数?

    您可以直接使用您的工厂构造函数并传递解码后的响应。例如。如下:

    Map<String, dynamic> res = json.decode(response.body);
    mydata.add(
       LoginRespon.fromJson(res);
    );
    

    您的工厂将负责将正确的值传递给您在 LoginRespon 类的 .fromJson 方法中声明的变量。

    如果您没有设置工厂构造函数,那么您将不得不按照您在此代码示例中创建的方式创建 LoginRespon 对象,即通过将值传递给命名参数并且这会起作用,但即使那样你将无法将值传递给变量 resourceunit,因为它们在类声明中不存在,您必须改为传递 Data 对象(其中包含 resourceunit 的值分别)。

    【讨论】:

    • 我已经尝试过了,我收到错误消息说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的类中
    • 直到你有任何带有资源名称的参数,它才会被定义。
    猜你喜欢
    • 1970-01-01
    • 2011-06-04
    • 2014-05-03
    • 2015-06-02
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    相关资源
    最近更新 更多