Флаттер - Как передать список <dynamic>в список <MyModel>из JSON? - PullRequest
1 голос
/ 05 ноября 2019

У меня есть приложение, которое извлекает данные из API, я получаю данные в виде списка, и когда я распечатываю его, я вижу данные в порядке.

[
  {
    "1": "MaxMilyin",
    "2": "409733",
    "3": "1130794"
  },
  {
    "1": "HippopotamusRex",
    "2": "346742",
    "3": "1204932"
  },
  ...
]

Когда я пытаюсь передать список всписок моей модели я получаю только:

   [Instance of 'TopTenUsersModel', Instance of 'TopTenUsersModel', ...]

Это мой класс модели, я использовал этот сайт для создания класса:

class TopTenUsersModel {

  String s1;
  String s2;
  String s3;

  TopTenUsersModel({this.s1, this.s2, this.s3});

  TopTenUsersModel.fromJson(Map<String, dynamic> json) {
    s1 = json['1'];
    s2 = json['2'];
    s3 = json['3'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['1'] = this.s1;
    data['2'] = this.s2;
    data['3'] = this.s3;
    return data;
  }
}

Этометод, которым я возвращаю данные в качестве моей модели.

static Future<List<TopTenUsersModel>> getTopTenUsers() async{

    try{

      print("INICIANDO CONEXÃO COM A API...");

      var response = await client.get(
        Constants.BASE_URL + Constants.getTopTenUsers + Constants.AUTH
      );

      //print("PRINT RESPONSE NETWORK UTIL: ${response.body}");

      // Here I can see the data ok!

      List<dynamic> list = json.decode(response.body) as List;

      // Here I get 'Instance of 'TopTenUsersModel''

      return (json.decode(response.body) as List)
          .map((item) => TopTenUsersModel.fromJson(item))
          .toList();

    } on SocketException catch (e){
        throw (e.message);
    } finally {
      client.close();
    }
  }

1 Ответ

0 голосов
/ 06 ноября 2019

Вы должны быть реализованы следующими способами

Класс модели

  class TopTenUsersModelResponse {
  final List<TopTenUsersModel> list;

  TopTenUsersModelResponse({
    this.list,
  });

  factory TopTenUsersModelResponse.fromJson(List<dynamic> parsedJson) {
    List<TopTenUsersModel> list = new List<TopTenUsersModel>();
    list = parsedJson.map((i) => TopTenUsersModel.fromJson(i)).toList();

    return new TopTenUsersModelResponse(list: list);
  }
}

заменить

 List<dynamic> list = json.decode(response.body) as List;

      // Here I get 'Instance of 'TopTenUsersModel''

      return (json.decode(response.body) as List)
          .map((item) => TopTenUsersModel.fromJson(item))
          .toList();

на

final List parsed = json.decode(response.body);
List<TopTenUsersModel> responseModelList = new TopTenUsersModelResponse.fromJson(parsed).list;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...