Хотя этот вопрос задавали несколько раз, но те, кого я видел, мне не помогли. Так вот,
У меня есть фиктивный файл json в папке с ресурсами: recipe.json
Вот recipe.dart
, который действует как мой класс модели:
class RecipeModel {
final String id;
final String name;
final String videoLink;
final String author;
final String category;
final String time;
RecipeModel({
required this.id,
required this.name,
required this.videoLink,
required this.author,
required this.category,
required this.time,
});
factory RecipeModel.fromJson(Map<String, dynamic> json) {
return RecipeModel(
id: json['id'],
name: json['name'],
videoLink: json['videoLink'],
author: json['author'],
category: json['category'],
time: json['time'],
);
}
}
А вот HomeScreen.dart
:
Future<List<RecipeModel>> getRecipeData() async {
// var response = await http.get(
// Uri.https("jsonplaceholder.typicode.com", 'users'),
// );
String response = await DefaultAssetBundle.of(context)
.loadString('assets/json/recipe.json');
var result = json.decode(response);
List<RecipeModel> recipes = [];
for (var u in result) {
RecipeModel recipe = RecipeModel(
id: u['id'] ?? "",
name: u['name'] ?? "",
videoLink: u['videoLink'] ?? "",
author: u['author'] ?? "",
category: u['category'] ?? "",
time: u['time'] ?? "",
);
recipes.add(recipe);
}
print(recipes.length);
return recipes;
}
@override
void initState() {
super.initState();
getRecipeData();
}
Как видите, я хочу получить данные сразу после загрузки страницы и сохранить указанные данные в списке, который затем можно использовать в gridview
. Но каждый раз, когда загружается экран, я получаю эту ошибку:
Unhandled Exception: type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'Iterable<dynamic>
Я следил за некоторыми учебниками, в которых полностью игнорировалось все, что связано с моделями, которые мне не нужны. Что мне здесь не хватает? Что мне нужно сделать, чтобы получить результат в списке, который я затем могу использовать внутри gridview?
мои данные json выглядят примерно так:
{
"data":
[
{.....},
{.....}
]
}
Результат — map
, а не list
, так как результатом является data
, а data
— это список, поэтому сначала извлеките data
из map
, а затем перебирайте список. — person Fahim Hoque schedule 28.04.2021
Результат — это карта, а не список, так как результатом являются данные, а данные — это список, поэтому сначала извлеките данные из карты, а затем выполните итерацию по списку.
Если у вас есть сомнения относительно типа получаемых данных, просто проверьте runtimeType.
print(result.runtimeType)
Измените это:
К этому: