Flutter 类型列表<;动态>;不是类型为';地图<;字符串,动态>';
我正在尝试从API获取数据。我发现错误“类型列表不是映射的子类型”。我是新手,不知道我在哪里犯了错误 这是我的回帖功能: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
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