我试图列出用户,但我收到错误消息,字符串不是类型转换中int类型的子类型。我无法检测出代码的哪一部分是导致问题的原因。
模型
class User {
final int id;
final String email;
bool auth;
User({this.id, this.email,});
factory User.fromJSON(Map<String, dynamic> jsonMap) {
return User(
id: jsonMap['id'] as int,
email: jsonMap['email'] as String,
);}
Map toMap() {
var map = new Map<String, dynamic>();
map["id"] = id;
map["email"] = email;
return map;}
@override
String toString() {
var map = this.toMap();
map["auth"] = this.auth;
return map.toString();
}}
实际部分
Future<List<User>> fetchUsers(http.Client client) async {
final response = await http.get("http://a6df36670036.ngrok.io/api/users/?format=json");
return compute(parseUsers, response.body);
}
List<User> parseUsers(String responseBody) {
final parsed = jsonDecode(responseBody).cast<Map<String, dynamic>>();
return parsed.map<User>((json) => User.fromJSON(json)).toList();
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
),
body: FutureBuilder<List<User>>(
future: fetchUsers(http.Client()),
builder: (context, snapshot) {
if (snapshot.hasError) print(snapshot.error);
return snapshot.hasData
? UsersList(users: snapshot.data)
: Center(child: CircularProgressIndicator());
},
),
);
}
}
class UsersList extends StatelessWidget {
final List<User> users;
UsersList({Key key, this.users}) : super(key: key);
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: users.length,
itemBuilder: (context, index) {
return Text(users[index].email);
},
);
}
}
我认为它是由模型的id部分引起的,但我不确定它是否实际上是id。
有人可以帮助我吗?
答案 0 :(得分:1)
API中的id
是String
,因此您需要将模型中的ID更改为String
class User {
final String id;
final String email;
bool auth;
User({this.id, this.email,});
factory User.fromJSON(Map<String, dynamic> jsonMap) {
return User(
id: jsonMap['id'] as String,
email: jsonMap['email'] as String,
);}
Map toMap() {
var map = new Map<String, dynamic>();
map["id"] = id;
map["email"] = email;
return map;}
@override
String toString() {
var map = this.toMap();
map["auth"] = this.auth;
return map.toString();
}}
答案 1 :(得分:0)
在用户模型类内部,当您尝试从JSON文件获取int值时,而不是这样做
id: jsonMap['id'] as int,
这样做
id: int.parse(jsonMap['id'])
对于您的情况,下面的代码应将id值作为一个整数
return User(
id: jsonMap['id'] as int,
email: jsonMap['email'] as String,
);