首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >json列表排序中的颤振类型错误

json列表排序中的颤振类型错误
EN

Stack Overflow用户
提问于 2019-05-07 03:33:06
回答 1查看 194关注 0票数 0

在对解码后的json进行排序时得到一个错误:

已发生异常。_TypeError (动态的,动态的) => dynamic‘不是’(动态的,动态的) => int‘的一个子类型。

json看起来如下:https://imgur.com/a/BdU3THE

我猜sort()在主体中有一个compareTo,它返回int (-1,1),这是‘动态的,动态的) => int’部分,而解码的json是一个默认的动态的‘动态的,动态的) =>动态的映射,所以我需要转换一些东西。但是,我看不到代码中的哪个函数正在返回一个动态函数?或者即使这就是问题所在?

代码语言:javascript
复制
      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);
    }
EN

回答 1

Stack Overflow用户

发布于 2019-05-07 05:37:15

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

这是json:

代码语言:javascript
复制
{
  "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获取数据时,可以在这个类中找到排序方法。

您可以看到以注释开头的方法"//使用publishedAt对数组进行排序“

代码语言:javascript
复制
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],
  };
}

下面是将静态json文件从资产中获取列表的未来类,它将给出排序结果,因为我们已经在"fromJson“方法中对其进行排序了:

代码语言:javascript
复制
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);
  }

希望它有帮助:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56015160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档