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

Flutter 类型列表<;动态>;不是类型为';地图<;字符串,动态>';,flutter,dart,Flutter,Dart,我正在尝试从API获取数据。我发现错误“类型列表不是映射的子类型”。我是新手,不知道我在哪里犯了错误 这是我的回帖功能: Future<Post> fetchPost() async { final response = await http.get('http://starlord.hackerearth.com/beercraft'); if (response.statusCode == 200) { return Post.fromJson(json.dec

我正在尝试从API获取数据。我发现错误“类型列表不是映射的子类型”。我是新手,不知道我在哪里犯了错误

这是我的回帖功能:

Future<Post> fetchPost() async {
  final response = await http.get('http://starlord.hackerearth.com/beercraft');

  if (response.statusCode == 200) {
    return Post.fromJson(json.decode(response.body));
  } else {
    throw Exception('Failed to load post');
  }
}

如何解决此错误?提前感谢。

原因是您正在调用的API(
http://starlord.hackerearth.com/beercraft
)返回JSON对象的列表,但您处理它的方式就像只有一个对象一样

您需要重写代码,将其作为一个列表来处理,这应该与您的
列表视图完美配合:

Future fetchPosts()异步{
最终响应=等待http.get('http://starlord.hackerearth.com/beercraft');
如果(response.statusCode==200){
返回json.decode(response.body).map((item)=>Post.fromJson(item)).toList();
}否则{
抛出异常(“加载post失败”);
}
}
fetchPost
需要更新到
fetchPosts
才能返回
未来的
。在这里,您可以使用将响应列表中的每个项目映射到
Post
对象。
下一步是将返回的
Future
作为
FutureBuilder
中的列表处理,如下所示:

final Future<Post> post;
HomeScreen({Key key, this.post}) : super(key: key);

FutureBuilder<Post>(
          future: post,
          builder: (context, result) {
            if (result.hasData) {
              return ListView.builder(
                itemBuilder: (context, index){
                  return cartItemComponent(result.data.name, result.data.abv, result.data.ounces);
                },
              );
            } else if (result.hasError) {
              return Text("${result.error}");
            }

            // By default, show a loading spinner.
            return CircularProgressIndicator();
          },
未来的最后职位;
未来建设者(
未来:员额,
生成器:(上下文,异步快照){
if(snapshot.hasData){
返回列表视图(
子项:snapshot.data.map((post){
返回cartItemComponent(post.name、post.abv、post.盎司);
}).toList(),
);
}else if(snapshot.hasrerror){
返回文本(“${snapshot.error}”);
}
//默认情况下,显示加载微调器。
return const CircularProgressIndicator();
}
)
请注意,我只是将列表作为
小部件的列表传递给的
子项
参数,因为在这种情况下不需要任何生成器。
我只是再次使用
map
方法,使用
cartItemComponent
函数将
Post
转换为
Widget