Флаттер для веб, как конвертировать Список <dynamic>в Список <Item>? - PullRequest
1 голос
/ 20 апреля 2020

Флаттер

Я получаю List<dynamic> из json.decode(res.body)

и не могу конвертировать в ожидаемый тип List<Item>

в chrome инструменте разработки он выдаст

Uncaught (in promise) Error: Type 'List<dynamic>' should be 'List<Item>' to implement expected type 'FutureOr<List<Item>>'.

вот мой код

import 'package:http/http.dart' as http;

class ApiService {
  static Future get({String url, Object params}) async {
    final res = await http.get(_root + url);
    return json.decode(res.body);
  }

  /// get 30 items of specific content type
  static Future<List<Item>> getContentList({String type, num page = 1}) async {
    final List<dynamic> ret = await ApiService.get(
      url: _typeMap[type],
    );
    // If I try `ret.cast<Item>()` it will also throw something like `... type _JsonMap ...`
    return ret;
  }
}

тело ответа - это список новостей хакера,

[{comments_count: 466,
domain: "github.com",
id: 22925087,
points: 1162,
time: 1587398440,
time_ago: "8 hours ago",
title: "Shirt Without Stripes",
type: "link",
url: "https://github.com/elsamuko/Shirt-without-Stripes",
user: "elsamuko",
}]

как я могу это исправить?

1 Ответ

0 голосов
/ 21 апреля 2020

Похоже, что тело ответа должно быть списком карт. Чтобы преобразовать его в List<Item>, вашему классу Item потребуется конструктор fromJson.

class Item {
  ...
  Item.fromJson(...)
      : ...
}

Просмотрите эту ссылку, чтобы узнать, как это реализовать: https://medium.com/flutter-community/how-to-parse-json-in-flutter-for-beginners-8074a68d7a79

Затем все, что вам нужно сделать, это сопоставить эту функцию со всеми объектами в списке.

  static Future<List<Item>> getContentList({String type, num page = 1}) async {
    final List<dynamic> ret = await ApiService.get(
      url: _typeMap[type],
    );
    return ret.map((obj) => Item.fromJson(obj)).toList();
  }
...