_CastError (тип '_InternalLinkedHashMap 'не является подтипом типа' List <dynamic>'в приведении типа) - PullRequest
0 голосов
/ 19 февраля 2020

Хочу спросить еще раз ... попробуйте реализовать API данных, хранящийся в локальной базе данных ... форма JSON API Объект, в котором есть JSON Array ... произошла ошибка, когда желая загрузить данные из 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;
  }

Ошибка

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

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

1 Ответ

0 голосов
/ 19 февраля 2020

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

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();
  }
}
...