Отображение A-списка, полученного из стороннего 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)





Ценность responseJson - это карта. Вы пытаетесь сделать на нем for ... in, и это работает только с итерациями, а карты не являются итерациями.
Вам необходимо выяснить структуру получаемого JSON. Он может содержать список, который вы хотите повторить, или вы можете захотеть повторить итерацию responseJson.values. Невозможно узнать, не зная формата и того, что вы хотите с ним делать.
Если, как вы говорите в комментарии ниже, JSON представляет собой отдельный объект, то ваш код, вероятно, должен быть таким:
...
setState(() {
_searchResult.add(StoreDetails.fromJson(responseJson));
});
...
(Я недостаточно знаю о Flutter, чтобы знать, является ли асинхронная инициализация состояния хорошей практикой, но я ожидаю, что это будет опасно - например, виджет может быть уничтожен до вызова setState).
только что изучил различные структуры Json из этой статьи medium.com/flutter-community/… Спасибо за ответ <3
и Json у меня не список карт
Если вы работаете с 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);
}
У вас ошибка. mysqli_error() требует одного аргумента. Вместо этого рассмотрите возможность включения режима ошибки. Как получить сообщение об ошибке в MySQLi?
Это была хорошая практика программирования, спасибо AbdelAziz AbdelLatef.
{"ID": 0, "BusinessUnitID": 1, "CompanyCode": "Code", "Number": 419, "Name": "Some Name", "ShortName": "ShortName", "City": "Город" Город "}, формат JSON похож на этот, и я хочу получить только город и идентификатор бизнес-единицы для функции листинга и поиска.