Необработанное исключение flutter: тип ‘_InternalLinkedHashMap ‹String, dynamic›’ не является подтипом типа ‘Iterable ‹dynamic›’

Хотя этот вопрос задавали несколько раз, но те, кого я видел, мне не помогли. Так вот,

У меня есть фиктивный файл 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

См. также:  Flutter / Dart - Парсинг JSON на модель
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 2
  1. Fahim Hoque

    Результат — это карта, а не список, так как результатом являются данные, а данные — это список, поэтому сначала извлеките данные из карты, а затем выполните итерацию по списку.

    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);
    
      var resultList = result["data"];
    
      List<RecipeModel> recipes = [];
      for (var u in resultList) {
        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;
    }
    

    Если у вас есть сомнения относительно типа получаемых данных, просто проверьте runtimeType.

    print(result.runtimeType)

  2. Fahim Hoque

    Измените это:

    for (var u in result)
    

    К этому:

    for (var u in result["data"])
    
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: