_CastError (тип '_InternalLinkedHashMap ‹String, dynamic›' не является подтипом типа 'List ‹dynamic›' в приведении типов)

Хотите спросить еще раз ... попробуйте реализовать API данных, хранящийся в локальной базе данных ... форма JSON API Объект, в котором есть массив JSON ... произошла ошибка при загрузке данных из API в локальную базу данных ... грубо говоря, это ошибка из-за "неправильной модели или чего-то

Служба API

class MealApiProvider {
  Future<List<Categories>> getAllMeal() async {
    var url = "https://www.themealdb.com/api/json/v1/1/categories.php";
    Response response = await Dio().get(url);
    print("Hasil Respon ${response.data}");
    return (response.data as List).map((employee) {
      print('Inserting $employee');
      DBProvider.db.insertMeals(Categories.fromJson(employee));
    }).toList();
  }
}

Модель

class DataMeal {
  final List<Categories> categories;

  DataMeal({this.categories});

  @override
  String toString() {
    return 'DataMeal{categories: $categories}';
  }

  factory DataMeal.fromJson(Map<String, dynamic> json) {
    return DataMeal(
      categories: List<Categories>.from(
        json["categories"].map(
          (categories) {
            return Categories.fromJson(categories);
          },
        ),
      ),
    );
  }

  Map<String, dynamic> toJson() => {
        "categories": List<dynamic>.from(
          categories.map(
            (x) => x.toJson(),
          ),
        ),
      };
}

Локальная БД

  initDB() async {
    Directory documentsDirectory = await getApplicationDocumentsDirectory();
    final String path = join(documentsDirectory.path, '$nameDatabase');
    print('insert database $path');

    return await openDatabase(path, version: 1, onOpen: (db) {},
        onCreate: (Database db, int version) async {
      await db.execute('CREATE TABLE $nameTable('
          'idCategory,'
          'strCategory TEXT,'
          'strCategoryThumb TEXT,'
          'strCategoryDescription TEXT'
          ')');
    });
  }

  insertMeals(DataMeal newMeal) async {
    await deleteAllMeal();
    final Database db = await database;
    final res = await db.insert("$nameTable", newMeal.toJson());
    print("inserting data $res");
    return res;
  }

Ошибка

return (response.data как список) .map ((сотрудник)

Данные ответа


person raka f    schedule 19.02.2020    source источник
comment
Эй, вы используете неправильный тип данных для массива, используйте List ‹dynamic› для массива и используйте Map ‹String, dynamic› для объекта JSON. Попробуйте, это сработает.   -  person Vrushi Patel    schedule 19.02.2020
comment
Какой код я изменил?   -  person raka f    schedule 19.02.2020
comment
Я не могу сказать, но, возможно, смогу, увидев ваш ответ.   -  person Vrushi Patel    schedule 19.02.2020
comment
пожалуйста, посмотрите изображение, которое я обновил i.stack.imgur.com/f1Ubw.png   -  person raka f    schedule 19.02.2020


Ответы (1)


Ваш ответ содержит карту в начале! Попробуй это

class MealApiProvider {
  Future<List<Categories>> getAllMeal() async {
    var url = "https://www.themealdb.com/api/json/v1/1/categories.php";
    Response response = await Dio().get(url);
    print("Hasil Respon ${response.data}");
    //***Change below line****
    return (response.data['categories'] as List).map((employee) {
      print('Inserting $employee');
      DBProvider.db.insertMeals(Categories.fromJson(employee));
    }).toList();
  }
}

вместо того

class MealApiProvider {
  Future<List<Categories>> getAllMeal() async {
    var url = "https://www.themealdb.com/api/json/v1/1/categories.php";
    Response response = await Dio().get(url);
    print("Hasil Respon ${response.data}");
    //*** I change the below line !
    return (response.data as List).map((employee) {
      print('Inserting $employee');
      DBProvider.db.insertMeals(Categories.fromJson(employee));
    }).toList();
  }
}
person Naveen Avidi    schedule 19.02.2020