例外:类型'String'不是类型转换中类型'int'的子类型

时间:2020-06-26 15:15:07

标签: flutter

我试图列出用户,但我收到错误消息,字符串不是类型转换中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。

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

API中的idString,因此您需要将模型中的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,
);