json列表上的flutter typeerror排序

时间:2019-05-07 03:33:06

标签: json sorting flutter typeerror

尝试对解码的json排序时出错:

  

发生异常。   _TypeError(类型'((dynamic,dynamic)=>动态'不是'compare'类型'('dynamic,dynamic)=> int'的子类型)“

json看起来像这样: https://imgur.com/a/BdU3THE

我猜sort()在主体中具有compareTo,它返回int(-1,1),即'dynamic,dynamic)=> int'部分,而解码后的json是一个动态的Map by默认为'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 个答案:

答案 0 :(得分:0)

我为您创建了一个示例,其中有“类别”列表,并添加了“ publishedAt”字段以对其进行排序

  

这是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);
  }

希望它会有所帮助:)