Flutter ';列表<;动态>';不是类型为';地图<;字符串,动态>';颤振

Flutter ';列表<;动态>';不是类型为';地图<;字符串,动态>';颤振,flutter,dart,flutter-web,Flutter,Dart,Flutter Web,在这里,我试图创建一个未来的listview生成器,得到一条错误消息:_TypeError(type'List'不是type'Map'的子类型)flift。我需要在列表视图中获取帖子中的所有数据。使用JSON到dart转换器quicktype.io创建模型类 未来电话 Future<Posts> getPosts() async { try { final response = await http.get(Uri.https('jsonplacehold

在这里,我试图创建一个未来的listview生成器,得到一条错误消息:_TypeError(type'List'不是type'Map'的子类型)flift。我需要在列表视图中获取帖子中的所有数据。使用JSON到dart转换器quicktype.io创建模型类

未来电话

Future<Posts> getPosts() async {
  try {
    final response =
        await http.get(Uri.https('jsonplaceholder.typicode.com', 'posts'));

    var data = jsonDecode(response.body);
    return Posts.fromJson(data);
  } catch (e) {
    print(e);
  }
}
Future getPosts()异步{
试一试{
最后答复=
等待http.get(Uri.https('jsonplaceholder.typicode.com','posts');
var data=jsonDecode(response.body);
return Posts.fromJson(数据);
}捕获(e){
印刷品(e);
}
}
模型

List postsFromJson(String str)=>List.from(json.decode(str.map)(x)=>Posts.fromJson(x));
字符串postsToJson(List data)=>json.encode(List.from(data.map)((x)=>x.toJson());
班级职务{
职位({
这个.userId,
这个身份证,
这个名字,
这个,身体,,
});
int用户标识;
int-id;
字符串标题;
弦体;
factory Posts.fromJson(映射json)=>Posts(
userId:json[“userId”],
id:json[“id”],
标题:json[“标题”],
body:json[“body”],
);
映射到JSON()=>{
“userId”:userId,
“id”:id,
“头衔”:头衔,
“身体”:身体,
};
}

我认为您应该使用:

return postsFromJson(data);

并使该函数返回一个列表,因为在响应体中它返回一个对象列表,因此仅使用Posts.fromJson()会出现此错误,因为Posts.fromJson()需要一个映射,而您给了它一个列表。如果您只需要一个项目,您可以访问列表中的该项目并将其提供给Posts.fromJson()函数

我认为您的API返回的帖子列表不仅仅是一篇帖子。首先,我建议将您的类名从Post重命名为Post,然后下面的代码可以解决您的问题:

Future<List<Posts>> getPosts() async {
  try {
    final response =
        await http.get(Uri.https('jsonplaceholder.typicode.com', 'posts'));

    var data = jsonDecode(response.body);
    return data.map<Posts>((data) => Posts.fromJson(json.decode(data))).toList();
  } catch (e) {
    print(e);
  }
}
Future getPosts()异步{
试一试{
最后答复=
等待http.get(Uri.https('jsonplaceholder.typicode.com','posts');
var data=jsonDecode(response.body);
return data.map((data)=>Posts.fromJson(json.decode(data))).toList();
}捕获(e){
印刷品(e);
}
}
更改此选项:

var data = jsonDecode(response.body);
为此:

var data = (jsonDecode(response.body) as List<dynamic>).cast<Map<String, dynamic>>();
var data=(jsonDecode(response.body)作为列表).cast();
var data = (jsonDecode(response.body) as List<dynamic>).cast<Map<String, dynamic>>();