_TypeError (введите '_InternalLinkedHashMap 'не является подтипом типа' Iterable <dynamic>') Flutter - PullRequest
0 голосов
/ 05 августа 2020

при извлечении одного пользователя из api я получил ошибку, указанную в заголовке, мой ответ:

{"success":true,"data":{"id":4,"user_id":"4","email":"xyz@example.com","secondaryPhone":"+2515465465465"},"message":"User retrieved successfully."}

Мой класс модели

class UsersModel({this.id, this.user_id, this.email, this.secondaryPhone});

Мой вызов api выглядит следующим образом

class UsersApi {
  Future<List<UsersModel>> fetchUsersById(String uId) async 
 {String singleUser = CallApi.url+CallApi.sinleUser+uId; 
   
 Map<String,String> headers =  
  { 'Accept' : 'application/json'};  
  var response = await http.get(singleUser ,headers:headers);  
       List<UsersModel> users= List<UsersModel>();
    if(response.statusCode == 200){
      var jsonData = jsonDecode(response.body);
      var data = jsonData["data"];
      for( var userr in data ) // error comes on this line
{        
UsersModel user = UsersModel(
id:item["id"].toString(),
user_id:item["user_id"].toString(),
email:item["email"].toString(),
secondaryPhone:item["secondaryPhone"].toString(),
);
 users.add(user);
      }
}
  return users;
}


}

любая помощь приветствуется.

1 Ответ

0 голосов
/ 14 августа 2020

Показанный вами JSON не содержит списков. Вы подразумеваете, что при выборке нескольких пользователей этот код работает нормально, вероятно, потому, что jsonData["data"] фактически возвращает List, когда вы выбираете несколько.

Чтобы решить эту проблему, вы должны выполнить проверку типа, который jsonData["data"] есть. Если это List, то делайте то, что у вас сейчас есть, если нет, то обрабатываете его по-другому.

Пример

Future<List<UsersModel>> fetchUsersById(String uId) async {
  String singleUser = CallApi.url+CallApi.sinleUser+uId;
   
 Map<String,String> headers =  
  { 'Accept' : 'application/json'};  
  var response = await http.get(singleUser ,headers:headers);  
       List<UsersModel> users= List<UsersModel>();
    if(response.statusCode == 200){
      var jsonData = jsonDecode(response.body);
      var data = jsonData["data"];

      //Handle data differently if it's a Map
      if(data is Map) {
        UsersModel user = UsersModel(
          id:item["id"].toString(),
          user_id:item["user_id"].toString(),
          email:item["email"].toString(),
          secondaryPhone:item["secondaryPhone"].toString(),
        );
        users.add(user);
        return users;
      }

      //Otherwise, do what you currently have
      for( var userr in data )
      {        
        UsersModel user = UsersModel(
          id:item["id"].toString(),
          user_id:item["user_id"].toString(),
          email:item["email"].toString(),
          secondaryPhone:item["secondaryPhone"].toString(),
        );
        users.add(user);
      }
  }
  return users;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...