ошибка типа flutter в сортировке списка json - PullRequest
0 голосов
/ 07 мая 2019

Получение ошибки при попытке сортировки декодированного json:

Произошло исключение._TypeError (тип '(динамический, динамический) => динамический' не является подтипом> типа (динамический, динамический) => int 'сравнения') "

json выглядит следующим образом: https://imgur.com/a/BdU3THE

Я полагаю, что sort (), в теле которого есть CompareTo, возвращает int (-1, 1), то есть часть 'dynamic, dynamic) => int', а декодированныйjson - это карта динамических по умолчанию 'dynamic, dynamic) => dynamic', поэтому мне нужно что-то привести. Но я не вижу, какая функция в моем коде возвращает динамику? Или даже если это проблема?

      if (localData != null && localData["articles"] != null) {

the error occurs on the next line:

      localData["articles"].toList().sort((a, b) => 
       a["publishedAt"] != null && b["publishedAt"] != null
              ? b["publishedAt"].compareTo(a["publishedAt"])
              : null);
    }

1 Ответ

1 голос
/ 07 мая 2019

Я создал один пример для вас, где есть список категорий и добавил опубликованное в поле для сортировки

Вот json:

{
  "Categories": [
    {
      "id": 1,
      "name": "Restruants",
      "publishedAt": "2019-05-07T00:36:38Z",
    },
    {
      "id": 2,
      "name": "Car Rental",
      "publishedAt": "2019-06-07T00:36:38Z",
    },
    {
      "id": 3,
      "name": "Furniture",
      "publishedAt": "2019-12-21T00:36:38Z",
    },
    {
      "id": 4,
      "name": "cars",
      "publishedAt": "2019-08-10T00:36:38Z",
    },
    {
      "id": 5,
      "name": "Maintenance",
      "publishedAt": "2019-03-15T00:36:38Z",
    },
    {
      "id": 6,
      "name": "Education",
      "publishedAt": "2019-09-17T00:36:38Z",
    },
    {
      "id": 7,
      "name": "Finess",
      "publishedAt": "2019-01-28T00:36:38Z",
    },
    {
      "id": 8,
      "name": "Electronics",
      "publishedAt": "2019-09-19T00:36:38Z",
    },
    {
      "id": 9,
      "name": "Medical",
      "publishedAt": "2019-12-25T00:36:38Z",
    },
    {
      "id": 10,
      "name": "Entirtainment",
      "publishedAt": "2019-06-14T00:36:38Z",
    }
  ]
}

Воткласс модели, где вы можете найти метод сортировки, когда мы получаем данные из json.

Вы можете увидеть метод, начинающийся с комментария ниже "// СОРТИРОВАТЬ Массив С ключом опубликованного"

class ItemModel {
  List<Category> categories;

  ItemModel({
    this.categories,
  });


  factory ItemModel.fromJson(Map<String, dynamic> json){

    var accJson = json["Categories"] as List;
    List<Category> accList = accJson.map((i) => Category.fromJson(i)).toList();


    // TO SORT ARRAY WITH publishedAt
    accList.sort((a, b) {
      return a.publishedAt.compareTo(b.publishedAt);
    });

    return ItemModel(
        categories: accList
    );
  }

  Map<String, dynamic> toJson() => {
    "Categories": new List<dynamic>.from(categories.map((x) => x.toJson())),
  };
}

class Category {
  int id;
  String name;
  String publishedAt;
  IconPath iconPath;

  Category({
    this.id,
    this.name,
    this.publishedAt,
    this.iconPath,
  });

  factory Category.fromJson(Map<String, dynamic> json) => new Category(
    id: json["id"],
    name: json["name"],
    publishedAt: json["publishedAt"],
    iconPath: iconPathValues.map[json["iconPath"]],
  );

  Map<String, dynamic> toJson() => {
    "id": id,
    "name": name,
    "publishedAt": publishedAt,
    "iconPath": iconPathValues.reverse[iconPath],
  };
}

Нижекласс Future для получения списка из статического файла json из ресурсов, и он даст вам отсортированный результат, потому что мы уже отсортировали его в методе «fromJson»:

Future<ItemModel> fetchMovieList(BuildContext context) async {
    final jsonCategory = await DefaultAssetBundle
        .of(context)
        .loadString('assets/CategoryList.json');

    Map<String, dynamic> values = Map<String, dynamic>.from(jsonDecode(jsonCategory));

    final mapJsonCategory = Map<String, dynamic>.from(values);

    print(mapJsonCategory);
    return ItemModel.fromJson(mapJsonCategory);
  }

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...