Ошибка «_InternalLinkedHashMap‹ String, dynamic ›» не является подтипом типа «Iterable ‹dynamic›».

Отображение A-List, полученного из стороннего API с функцией поиска, ошибка отображается только при запуске приложения. Говорится, что _InternalLinkedHashMap ‹String, dynamic› 'не является подтипом типа' Iterable

Пожалуйста, добро пожаловать *** Отредактируйте новую ошибку, появившуюся после игры с кодом, эта ошибка показала, что тип 'String' не является подтипом типа Map-dynamic, dynamic-

        Future<Null> getStoreDetails() async {
                var basicAuth = 'Basic ' +
                    base64Encode(utf8.encode('api_token_key'));
                var result;
             
                var response = await http.get(url, headers: {'authorization': basicAuth});
                if (response.statusCode == 200) {
                  var responseJson = json.decode(response.body);
                  setState(() {
             /Where the error is 
                    for (Map storedetails in responseJson) {
                      _searchResult.add(StoreDetails.fromJson(storedetails));
                    }
                  });
                } else if (response.statusCode != 200) {
                  result = "Error getting response:\nHttp status ${response.statusCode}";
                  print(result);
                }
              }
              @override
              void initState() {
                super.initState();
                getStoreDetails();
              }

Класс модели данных

class StoreDetails {
  final int businessunitid;
  String citydescription;

  StoreDetails({
    this.businessunitid,
    this.citydescription,
  });

   factory StoreDetails.fromJson(Map<String, dynamic> data) {
    return new StoreDetails(
      businessunitid: data['businessunitid'],
      citydescription: data['citydescription'],
      
    );
  }
}

Ошибка

E/flutter ( 3566): type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'Iterable<dynamic>'
E/flutter ( 3566): #0      SearchStoreState.getStoreDetails.<anonymous closure> (package:rsc_prototype/screens/searchstore_screen.dart:43:34)
E/flutter ( 3566): #1      State.setState (package:flutter/src/widgets/framework.dart:1125:30)
E/flutter ( 3566): #2      SearchStoreState.getStoreDetails (package:rsc_prototype/screens/searchstore_screen.dart:42:7)
E/flutter ( 3566): <asynchronous suspension>
E/flutter ( 3566): #3      SearchStoreState.initState (package:rsc_prototype/screens/searchstore_screen.dart:56:5)
E/flutter ( 3566): #4      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3751:58)

person user10040349    schedule 26.07.2018    source источник


Ответы (2)


Значение responseJson - это карта. Вы пытаетесь сделать for ... in на нем, и это работает только с итерациями, а карты не являются итерациями.

Вам необходимо выяснить структуру получаемого JSON. Он может содержать список, который вы хотите повторить, или вы можете захотеть повторить итерацию responseJson.values. Невозможно узнать, не зная формата и того, что вы хотите с ним делать.

Если, как вы говорите в комментарии ниже, JSON представляет собой единый объект, то ваш код, вероятно, должен быть таким:

...
setState(() {
  _searchResult.add(StoreDetails.fromJson(responseJson));
});
...

(Я недостаточно знаю о Flutter, чтобы понять, является ли асинхронная инициализация состояния хорошей практикой, но я ожидаю, что это будет опасно - например, виджет может быть уничтожен до вызова setState).

person lrn    schedule 26.07.2018
comment
{ID: 0, BusinessUnitID: 1, CompanyCode: Code, Number: 419, Name: Some Name, ShortName: ShortName, City: City City}, формат JSON похож на этот, и я хочу получить только город и бизнес-единицу для функции листинга и поиска - person user10040349; 26.07.2018
comment
только что изучил различные структуры Json из этой статьи medium.com / flutter-community / Спасибо за ответ ‹3 - person user10040349; 26.07.2018
comment
и Json у меня не список карт - person user10040349; 26.07.2018

Если вы работаете с php, это его рабочий пример, помните, что 'json_encode($udresponse['userdetails']); возвращает соответствующий формат массива, который вам нужен, и перед array_push($udresponse['userdetails'],$userdetails); добавлением каждого элемента в массив.

$udresponse["userdetails"] = array();
$query = mysqli_query($db->connect(),"SELECT * FROM employee WHERE  Employee_Id ='$UserId'") or die(mysqli_error());
if (mysqli_num_rows($query) > 0) {
    while ($row = mysqli_fetch_array($query)) {
        $userdetails= array();
        // user details
        $userdetails["customerid"]=$row["Employee_Id"];
        $userid=$row["Employee_Id"];
        $userdetails["username"]=$UserName;
        $userdetails["fullname"]=$Fullname;
        $userdetails["email"]=$Email;
        $userdetails["phone"]=$Phone;
        $userdetails["role"]=$UserRole;
        $userdetails["restaurantid"]=$RestaurantId;
        array_push($udresponse['userdetails'],$userdetails);
    }  
    $udresponse["success"] = 1;
    $udresponse["message"] = "sign in Successful";
    //echo json_encode($response);
    echo json_encode($udresponse['userdetails']);
} else {   
    $udresponse["success"] = 2;
    $udresponse["message"] = "error retrieving employee details";
    echo json_encode($udresponse);
}
person Abdul razak    schedule 15.10.2019
comment
У вас ошибка. mysqli_error() требует одного аргумента. Вместо этого рассмотрите возможность включения режима ошибки. Как получить сообщение об ошибке в MySQLi? - person Dharman; 31.10.2019
comment
Это была хорошая практика программирования, спасибо AbdelAziz AbdelLatef. - person Abdul razak; 28.11.2019