Как создавать объекты с помощью фабричного конструктора? - PullRequest
1 голос
/ 02 мая 2020

Я конвертировал свои json данные, используя https://app.quicktype.io/, и вот результат

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"
}
}

Я хочу определить каждое значение в моих json данных, используя LoginRespon модель ... и я делаю это

List<LoginRespon> mydata = [];
Map<String, dynamic> res = json.decode(response.body);
mydata.add(LoginRespon(
              status: res['status'],
              pesan: res['pesan'],
              resources:...?
              unit:...?
              ));

, используя этот код, который я запутался, как вызывать resources и unit внутри res[data] ... есть ли способ вызвать значения resources и unit, потому что они находятся внутри объекта внутри объекта?

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Если у вас есть конструктор фабрики, созданный для класса LoginRespon, тогда почему вы передаете эти именованные параметры?

Вы можете напрямую использовать конструктор фабрики и передать декодированный ответ. Например. следующим образом:

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

Ваша фабрика позаботится о передаче правильных значений переменным, как вы объявили в методе .from Json класса LoginRespon.

Если вы это сделали если у вас не установлен фабричный конструктор, вам придется создавать объекты LoginRespon так, как вы создали в этом примере кода, то есть путем передачи значений в именованные параметры, и это будет работать, но даже тогда вы не сможете передать значения переменных resource и unit, поскольку они не существуют в объявлении класса, и вместо этого вам нужно будет передать объект Data (который содержит значения resource и unit соответственно).

0 голосов
/ 02 мая 2020

Ну, вы можете просто вложить это

res['data']['resource']

mydata.add(LoginRespon(
          status: res['status'],
          pesan: res['pesan'],
          resources:res['data']['resource']
          unit:res['data']['unit']
          ));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...