From 53ab91afde005828d7f4088bfe1046faf4b7ba7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B5=D1=80=D0=B0?= <Вера@DESKTOP-7L4BKCB> Date: Wed, 18 Dec 2024 17:20:52 +0400 Subject: [PATCH] process has started --- lib/data/dtos/potions_dto.dart | 36 -- lib/data/dtos/potions_dto.g.dart | 32 -- lib/data/dtos/recipes_dto.dart | 41 +++ lib/data/mappers/potions_mapper.dart | 23 -- lib/data/mappers/recipes_mapper.dart | 28 ++ lib/data/repositories/potter_repository.dart | 35 -- lib/data/repositories/recipe_repository.dart | 47 +++ lib/presentation/home_page/home_page.dart | 2 +- pubspec.lock | 341 +++++++++++++++++++ pubspec.yaml | 3 + 10 files changed, 461 insertions(+), 127 deletions(-) delete mode 100644 lib/data/dtos/potions_dto.dart delete mode 100644 lib/data/dtos/potions_dto.g.dart create mode 100644 lib/data/dtos/recipes_dto.dart delete mode 100644 lib/data/mappers/potions_mapper.dart create mode 100644 lib/data/mappers/recipes_mapper.dart delete mode 100644 lib/data/repositories/potter_repository.dart create mode 100644 lib/data/repositories/recipe_repository.dart diff --git a/lib/data/dtos/potions_dto.dart b/lib/data/dtos/potions_dto.dart deleted file mode 100644 index f276aef..0000000 --- a/lib/data/dtos/potions_dto.dart +++ /dev/null @@ -1,36 +0,0 @@ -import 'package:json_annotation/json_annotation.dart'; - -part 'potions_dto.g.dart'; - -@JsonSerializable(createToJson: false) -class PotionsDto { - final List? data; - - const PotionsDto({this.data}); - - factory PotionsDto.fromJson(Map json) => _$PotionsDtoFromJson(json); -} - -@JsonSerializable(createToJson: false) -class PotionDataDto { - final String? id; - final String? type; - final PotionAttributesDataDto? attributes; - - const PotionDataDto({this.id, this.type, this.attributes}); - - factory PotionDataDto.fromJson(Map json) => _$PotionDataDtoFromJson(json); -} - -@JsonSerializable(createToJson: false) -class PotionAttributesDataDto { - final String? name; - final String? characteristics; - final String? effect; - final String? image; - - const PotionAttributesDataDto({this.name, this.characteristics, this.effect, this.image}); - - factory PotionAttributesDataDto.fromJson(Map json) => - _$PotionAttributesDataDtoFromJson(json); -} \ No newline at end of file diff --git a/lib/data/dtos/potions_dto.g.dart b/lib/data/dtos/potions_dto.g.dart deleted file mode 100644 index ab1beb0..0000000 --- a/lib/data/dtos/potions_dto.g.dart +++ /dev/null @@ -1,32 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'potions_dto.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -PotionsDto _$PotionsDtoFromJson(Map json) => PotionsDto( - data: (json['data'] as List?) - ?.map((e) => PotionDataDto.fromJson(e as Map)) - .toList(), -); - -PotionDataDto _$PotionDataDtoFromJson(Map json) => - PotionDataDto( - id: json['id'] as String?, - type: json['type'] as String?, - attributes: json['attributes'] == null - ? null - : PotionAttributesDataDto.fromJson( - json['attributes'] as Map), - ); - -PotionAttributesDataDto _$PotionAttributesDataDtoFromJson( - Map json) => - PotionAttributesDataDto( - name: json['name'] as String?, - characteristics: json['characteristics'] as String?, - effect: json['effect'] as String?, - image: json['image'] as String?, - ); \ No newline at end of file diff --git a/lib/data/dtos/recipes_dto.dart b/lib/data/dtos/recipes_dto.dart new file mode 100644 index 0000000..fa022c4 --- /dev/null +++ b/lib/data/dtos/recipes_dto.dart @@ -0,0 +1,41 @@ +import 'package:json_annotation/json_annotation.dart'; + +part 'recipe_dto.g.dart'; + +@JsonSerializable(createToJson: false) +class RecipesDto { + final List? hits; // API возвращает список рецептов под ключом "hits". + + const RecipesDto({this.hits}); + + factory RecipesDto.fromJson(Map json) => + _$RecipesDtoFromJson(json); +} + +@JsonSerializable(createToJson: false) +class RecipeDataDto { + final RecipeAttributesDataDto? recipe; // API возвращает объект "recipe" внутри каждого "hit". + + const RecipeDataDto({this.recipe}); + + factory RecipeDataDto.fromJson(Map json) => + _$RecipeDataDtoFromJson(json); +} + +@JsonSerializable(createToJson: false) +class RecipeAttributesDataDto { + final String? label; + final double? calories; // API возвращает "calories" как число. + final String? url; + final String? image; + + const RecipeAttributesDataDto({ + this.label, + this.calories, + this.url, + this.image, + }); + + factory RecipeAttributesDataDto.fromJson(Map json) => + _$RecipeAttributesDataDtoFromJson(json); +} diff --git a/lib/data/mappers/potions_mapper.dart b/lib/data/mappers/potions_mapper.dart deleted file mode 100644 index b0319b3..0000000 --- a/lib/data/mappers/potions_mapper.dart +++ /dev/null @@ -1,23 +0,0 @@ -import 'package:leonteva_pmu/data/dtos/potions_dto.dart'; -import 'package:leonteva_pmu/domain/models/card.dart'; - -const String imagePlaceholder = - 'https://cdn-icons-png.flaticon.com/512/4036/4036418.png'; - -extension PotionDataDtoToModel on PotionDataDto { - CardData toDomain() => CardData( - attributes?.name ?? 'UNKNOWN', - imageUrl: attributes?.image ?? imagePlaceholder, - descriptionText: _makeDescriptionText(attributes?.characteristics, attributes?.effect), - ); - - String _makeDescriptionText(String? characteristics, String? effect) { - return characteristics != null && effect != null - ? '$characteristics - $effect' - : characteristics != null - ? 'characteristics: $characteristics' - : effect != null - ? 'effect: $effect' - : ''; - } -} \ No newline at end of file diff --git a/lib/data/mappers/recipes_mapper.dart b/lib/data/mappers/recipes_mapper.dart new file mode 100644 index 0000000..478d443 --- /dev/null +++ b/lib/data/mappers/recipes_mapper.dart @@ -0,0 +1,28 @@ +import 'package:leonteva_pmu/data/dtos/recipes_dto.dart'; +import 'package:leonteva_pmu/domain/models/card.dart'; + +const String imagePlaceholder = + 'https://cdn-icons-png.flaticon.com/512/4036/4036418.png'; + +extension RecipeDataDtoToModel on RecipeDataDto { + CardData toDomain() => CardData( + recipe?.label ?? 'UNKNOWN', // Используем поле label из recipe. + imageUrl: recipe?.image ?? imagePlaceholder, // Используем поле image. + descriptionText: _makeDescriptionText( + recipe?.calories?.toString(), // Преобразуем double в строку. + recipe?.url, // Используем поле url. + ), + ); + + String _makeDescriptionText(String? calories, String? url) { + if (calories != null && url != null) { + return 'Calories: $calories\nURL: $url'; + } else if (calories != null) { + return 'Calories: $calories'; + } else if (url != null) { + return 'URL: $url'; + } else { + return 'No description available'; + } + } +} diff --git a/lib/data/repositories/potter_repository.dart b/lib/data/repositories/potter_repository.dart deleted file mode 100644 index 87aa97c..0000000 --- a/lib/data/repositories/potter_repository.dart +++ /dev/null @@ -1,35 +0,0 @@ -import 'package:dio/dio.dart'; -import 'package:leonteva_pmu/data/dtos/potions_dto.dart'; -import 'package:leonteva_pmu/data/mappers/potions_mapper.dart'; -import 'package:leonteva_pmu/data/repositories/api_interface.dart'; -import 'package:leonteva_pmu/domain/models/card.dart'; -import 'package:pretty_dio_logger/pretty_dio_logger.dart'; - -class PotterRepository extends ApiInterface { - static final Dio _dio = Dio() - ..interceptors.add(PrettyDioLogger( - requestHeader: true, - requestBody: true, - )); - - static const String _baseUrl = 'https://api.potterdb.com'; - - @override - Future?> loadData({String? q, OnErrorCallback? onError}) async { - try { - const String url = '$_baseUrl/v1/potions'; - - final Response response = await _dio.get>( - url, - queryParameters: q != null ? {'filter[name_cont]': q} : null, - ); - - final PotionsDto dto = PotionsDto.fromJson(response.data as Map); - final List? data = dto.data?.map((e) => e.toDomain()).toList(); - return data; - } on DioException catch (e) { - onError?.call(e.response?.statusMessage); - return null; - } - } -} \ No newline at end of file diff --git a/lib/data/repositories/recipe_repository.dart b/lib/data/repositories/recipe_repository.dart new file mode 100644 index 0000000..2897971 --- /dev/null +++ b/lib/data/repositories/recipe_repository.dart @@ -0,0 +1,47 @@ +import 'package:dio/dio.dart'; +import 'package:leonteva_pmu/data/dtos/recipes_dto.dart'; +import 'package:leonteva_pmu/data/mappers/recipes_mapper.dart'; +import 'package:leonteva_pmu/data/repositories/api_interface.dart'; +import 'package:leonteva_pmu/domain/models/card.dart'; +import 'package:pretty_dio_logger/pretty_dio_logger.dart'; + +class PotterRepository extends ApiInterface { + static final Dio _dio = Dio() + ..interceptors.add(PrettyDioLogger( + requestHeader: true, + requestBody: true, + responseHeader: true, + responseBody: true, + error: true, + )); + + static const String _baseUrl = 'https://api.edamam.com'; + static const String _appId = ''; // Укажите ваш APP_ID. + static const String _appKey = ''; // Укажите ваш APP_KEY. + + @override + Future?> loadData({String? q, OnErrorCallback? onError}) async { + try { + final String url = '$_baseUrl/search'; + + final Response response = await _dio.get( + url, + queryParameters: { + 'q': q ?? '', // Параметр запроса для поиска рецептов. + 'app_id': _appId, + 'app_key': _appKey, + }, + ); + + final RecipesDto dto = + RecipesDto.fromJson(response.data as Map); + final List? data = + dto.hits?.map((e) => e.toDomain()).toList(); // Преобразуем DTO в модель. + return data; + } on DioException catch (e) { + // Обработка ошибки и передача сообщения через onError. + onError?.call(e.response?.statusMessage ?? 'Unknown error'); + return null; + } + } +} diff --git a/lib/presentation/home_page/home_page.dart b/lib/presentation/home_page/home_page.dart index d7f0fa9..f54e2aa 100644 --- a/lib/presentation/home_page/home_page.dart +++ b/lib/presentation/home_page/home_page.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:leonteva_pmu/data/repositories/potter_repository.dart'; +import 'package:leonteva_pmu/data/repositories/recipe_repository.dart'; import 'package:leonteva_pmu/presentation/details_page/details_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:leonteva_pmu/domain/models/card.dart'; diff --git a/pubspec.lock b/pubspec.lock index 69e5907..ba2f9fd 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,35 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: "88399e291da5f7e889359681a8f64b18c5123e03576b01f32a6a276611e511c3" + url: "https://pub.dev" + source: hosted + version: "78.0.0" + _macros: + dependency: transitive + description: dart + source: sdk + version: "0.3.3" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: "62899ef43d0b962b056ed2ebac6b47ec76ffd003d5f7c4e4dc870afe63188e33" + url: "https://pub.dev" + source: hosted + version: "7.1.0" + args: + dependency: transitive + description: + name: args + sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 + url: "https://pub.dev" + source: hosted + version: "2.6.0" async: dependency: transitive description: @@ -17,6 +46,70 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.1" + build: + dependency: transitive + description: + name: build + sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0 + url: "https://pub.dev" + source: hosted + version: "2.4.2" + build_config: + dependency: transitive + description: + name: build_config + sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + build_daemon: + dependency: transitive + description: + name: build_daemon + sha256: "294a2edaf4814a378725bfe6358210196f5ea37af89ecd81bfa32960113d4948" + url: "https://pub.dev" + source: hosted + version: "4.0.3" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + sha256: "99d3980049739a985cf9b21f30881f46db3ebc62c5b8d5e60e27440876b1ba1e" + url: "https://pub.dev" + source: hosted + version: "2.4.3" + build_runner: + dependency: "direct dev" + description: + name: build_runner + sha256: "74691599a5bc750dc96a6b4bfd48f7d9d66453eab04c7f4063134800d6a5c573" + url: "https://pub.dev" + source: hosted + version: "2.4.14" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021" + url: "https://pub.dev" + source: hosted + version: "8.0.0" + built_collection: + dependency: transitive + description: + name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + sha256: "28a712df2576b63c6c005c465989a348604960c0958d28be5303ba9baa841ac2" + url: "https://pub.dev" + source: hosted + version: "8.9.3" characters: dependency: transitive description: @@ -25,6 +118,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.0" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + url: "https://pub.dev" + source: hosted + version: "2.0.3" clock: dependency: transitive description: @@ -33,6 +134,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.1" + code_builder: + dependency: transitive + description: + name: code_builder + sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e" + url: "https://pub.dev" + source: hosted + version: "4.10.1" collection: dependency: transitive description: @@ -41,6 +150,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.19.0" + convert: + dependency: transitive + description: + name: convert + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + crypto: + dependency: transitive + description: + name: crypto + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + url: "https://pub.dev" + source: hosted + version: "3.0.6" cupertino_icons: dependency: "direct main" description: @@ -49,6 +174,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.8" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "64b717484993e85315d0c04081b6fca9ef8bac8c2cb794b2e15810250b335913" + url: "https://pub.dev" + source: hosted + version: "3.0.0" dio: dependency: "direct main" description: @@ -73,6 +206,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.1" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" flutter: dependency: "direct main" description: flutter @@ -91,6 +240,38 @@ packages: description: flutter source: sdk version: "0.0.0" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 + url: "https://pub.dev" + source: hosted + version: "4.0.0" + glob: + dependency: transitive + description: + name: glob + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + graphs: + dependency: transitive + description: + name: graphs + sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 + url: "https://pub.dev" + source: hosted + version: "3.2.2" http_parser: dependency: transitive description: @@ -99,6 +280,22 @@ packages: url: "https://pub.dev" source: hosted version: "4.1.1" + io: + dependency: transitive + description: + name: io + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b + url: "https://pub.dev" + source: hosted + version: "1.0.5" + js: + dependency: transitive + description: + name: js + sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf + url: "https://pub.dev" + source: hosted + version: "0.7.1" json_annotation: dependency: "direct main" description: @@ -107,6 +304,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.9.0" + json_serializable: + dependency: "direct dev" + description: + name: json_serializable + sha256: "8f52361c07497a7f2c16c13aac159f9be6fb12b1d67719eac98a21d9a205d571" + url: "https://pub.dev" + source: hosted + version: "6.9.2" leak_tracker: dependency: transitive description: @@ -139,6 +344,22 @@ packages: url: "https://pub.dev" source: hosted version: "5.1.0" + logging: + dependency: transitive + description: + name: logging + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + macros: + dependency: transitive + description: + name: macros + sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656" + url: "https://pub.dev" + source: hosted + version: "0.1.3-main.0" matcher: dependency: transitive description: @@ -163,6 +384,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.15.0" + mime: + dependency: transitive + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + package_config: + dependency: transitive + description: + name: package_config + sha256: "92d4488434b520a62570293fbd33bb556c7d49230791c1b4bbd973baf6d2dc67" + url: "https://pub.dev" + source: hosted + version: "2.1.1" path: dependency: transitive description: @@ -171,6 +408,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.9.0" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" + source: hosted + version: "1.5.1" pretty_dio_logger: dependency: "direct main" description: @@ -179,11 +424,59 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.0" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "7b3cfbf654f3edd0c6298ecd5be782ce997ddf0e00531b9464b55245185bbbbd" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + shelf: + dependency: transitive + description: + name: shelf + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 + url: "https://pub.dev" + source: hosted + version: "1.4.2" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: cc36c297b52866d203dbf9332263c94becc2fe0ceaa9681d07b6ef9807023b67 + url: "https://pub.dev" + source: hosted + version: "2.0.1" sky_engine: dependency: transitive description: flutter source: sdk version: "0.0.0" + source_gen: + dependency: transitive + description: + name: source_gen + sha256: "35c8150ece9e8c8d263337a265153c3329667640850b9304861faea59fc98f6b" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + source_helper: + dependency: transitive + description: + name: source_helper + sha256: "86d247119aedce8e63f4751bd9626fc9613255935558447569ad42f9f5b48b3c" + url: "https://pub.dev" + source: hosted + version: "1.3.5" source_span: dependency: transitive description: @@ -208,6 +501,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.2" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 + url: "https://pub.dev" + source: hosted + version: "2.1.1" string_scanner: dependency: transitive description: @@ -232,6 +533,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.3" + timing: + dependency: transitive + description: + name: timing + sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe" + url: "https://pub.dev" + source: hosted + version: "1.0.2" typed_data: dependency: transitive description: @@ -256,6 +565,14 @@ packages: url: "https://pub.dev" source: hosted version: "14.3.0" + watcher: + dependency: transitive + description: + name: watcher + sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104" + url: "https://pub.dev" + source: hosted + version: "1.1.1" web: dependency: transitive description: @@ -264,6 +581,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" + url: "https://pub.dev" + source: hosted + version: "0.1.6" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + yaml: + dependency: transitive + description: + name: yaml + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.dev" + source: hosted + version: "3.1.2" sdks: dart: ">=3.6.0 <4.0.0" flutter: ">=3.18.0-18.0.pre.54" diff --git a/pubspec.yaml b/pubspec.yaml index 633979d..6481294 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -31,6 +31,7 @@ dependencies: dio: ^5.7.0 pretty_dio_logger: ^1.4.0 json_annotation: ^4.9.0 + flutter: sdk: flutter @@ -39,6 +40,8 @@ dependencies: cupertino_icons: ^1.0.8 dev_dependencies: + build_runner: ^2.4.14 + json_serializable: ^6.9.2 flutter_test: sdk: flutter