import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:json_annotation/json_annotation.dart';
part 'http.g.dart';
@JsonSerializable()
class Album {
final int userId;
final int id;
final String title;
Album({this.userId, this.id, this.title});
factory Album.fromJson(Map<String, dynamic> json) => _$AlbumFromJson(json);
Map<String, dynamic> toJson() => _$AlbumToJson(this);
}
Future<Album> fetchAlbum() async {
var resp = await http.get('https://jsonplaceholder.typicode.com/albums/1');
var A = Album.fromJson(jsonDecode(resp.body)); // Error line
print(A.title);
print(A.toJson());
}
错误- At var A = Album.fromJson(jsonDecode(resp.body));
is The argument type 'dynamic' can't be assigned to the parameter type 'Map<String, dynamic>'.dartargument_type_not_assignable
。
jsonDecode
返回类型为dynamic
,而相册工厂方法需要Map<String, dynamic>
。
它显示编译时错误,但我可以在调试控制台中获得所需的输出。
我们该如何解决这个问题呢?
发布于 2020-08-17 17:47:17
在这里添加@Ulas的评论作为答案-
我们可以使用带有jsonDecode的as
关键字来返回特定的类型,而不是dynamic
-
var A = Album.fromJson(jsonDecode(resp.body) as Map<String, dynamic>);
发布于 2020-08-17 17:33:51
因为jsonDecode
返回一个dynamic
类型,所以你会遇到这个问题。您必须将该dynamic
类型转换为Map<String,dynamic>
。
而不是:
Album.fromJson(jsonDecode(resp.body));
执行以下操作:
Album.fromJson(Map<String,dynamic>.from(jsonDecode(resp.body)));
发布于 2020-08-17 17:34:08
var A = Album.fromJson(jsonDecode(resp.body as Map<String, dynamic>)); // no error
添加一些try-catch块。当你发送一个请求时,分配的东西可能会出错:)
https://stackoverflow.com/questions/63447998
复制相似问题