尝试对解码的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);
}
答案 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);
}
希望它会有所帮助:)