diff --git a/lib/Presentation/home_page/bloc/bloc.dart b/lib/Presentation/home_page/bloc/bloc.dart new file mode 100644 index 0000000..5e871c7 --- /dev/null +++ b/lib/Presentation/home_page/bloc/bloc.dart @@ -0,0 +1,16 @@ +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:labs_petrushin/Presentation/home_page/bloc/events.dart'; +import 'package:labs_petrushin/Presentation/home_page/bloc/state.dart'; +import 'package:labs_petrushin/repositories/food_repository.dart'; + +class HomeBloc extends Bloc { + final FoodRepository repository; + + HomeBloc(this.repository) : super(const HomeState()) { + on(_onLoadData); + + void _onLoadData(HomeLoadDataEvent event, Emitter emit) { + emit(state.copyWith(data: repository.loadData())); + } + } +} \ No newline at end of file diff --git a/lib/Presentation/home_page/bloc/events.dart b/lib/Presentation/home_page/bloc/events.dart new file mode 100644 index 0000000..08edf95 --- /dev/null +++ b/lib/Presentation/home_page/bloc/events.dart @@ -0,0 +1,8 @@ + +abstract class HomeEvent { + const HomeEvent(); +} + +class HomeLoadDataEvent extends HomeEvent { + const HomeLoadDataEvent(); +} \ No newline at end of file diff --git a/lib/Presentation/home_page/bloc/state.dart b/lib/Presentation/home_page/bloc/state.dart new file mode 100644 index 0000000..a821397 --- /dev/null +++ b/lib/Presentation/home_page/bloc/state.dart @@ -0,0 +1,14 @@ +import 'package:equatable/equatable.dart'; +import 'package:labs_petrushin/Presentation/home_page/home_page.dart'; + +class HomeState extends Equatable { + final Future?>? data; + + const HomeState({this.data}); + + HomeState copyWith({Future?>? data}) => HomeState(data: data ?? this.data); + + @override + List get props => [data]; + +} \ No newline at end of file diff --git a/lib/Presentation/home_page/home_page.dart b/lib/Presentation/home_page/home_page.dart index 8263b92..f1dcb02 100644 --- a/lib/Presentation/home_page/home_page.dart +++ b/lib/Presentation/home_page/home_page.dart @@ -1,6 +1,9 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:labs_petrushin/repositories/mock_repository.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:labs_petrushin/Presentation/home_page/bloc/bloc.dart'; +import 'package:labs_petrushin/Presentation/home_page/bloc/events.dart'; +import 'package:labs_petrushin/Presentation/home_page/bloc/state.dart'; import '../../Presentation/detailPage.dart'; import '../../repositories/food_repository.dart'; part '../../domain/models/card.dart'; @@ -48,10 +51,19 @@ class _BodyState extends State { @override void initState() { - data = repo.loadData(); + WidgetsBinding.instance.addPostFrameCallback((_) { + context.read().add(const HomeLoadDataEvent()); + }); + // data = repo.loadData(); super.initState(); } + @override + void dispose() { + searchController.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { return Column( @@ -69,25 +81,32 @@ class _BodyState extends State { ) ), ), - Expanded( - child: Center( - child: FutureBuilder?>( - future: data, - builder: (context, snapshot) => - SingleChildScrollView( - child: snapshot.hasData ? Column( - mainAxisAlignment: MainAxisAlignment.center, - children: snapshot.data?.map((e) => MyCard.fromData( - e, - onLike: () => _showSnackBar(context), - )).toList() ?? [], - ) - : const CircularProgressIndicator(), - ), - ), - ), - ), - ], + BlocBuilder( + builder: (context, state) => FutureBuilder?>( + future: state.data, + builder: (context, snapshot) => snapshot.hasData + ? Expanded( + child: Center( + child: FutureBuilder?>( + future: data, + builder: (context, snapshot) => + SingleChildScrollView( + child: snapshot.hasData ? Column( + mainAxisAlignment: MainAxisAlignment.center, + children: snapshot.data?.map((e) => MyCard.fromData( + e, + onLike: () => _showSnackBar(context), + )).toList() ?? [], + ) + : const CircularProgressIndicator(), + ), + ), + ), + ) + : const CircularProgressIndicator(), + ) + ), + ], ); } diff --git a/lib/Presentation/main.dart b/lib/Presentation/main.dart index a6fbf1f..f7d578d 100644 --- a/lib/Presentation/main.dart +++ b/lib/Presentation/main.dart @@ -1,5 +1,8 @@ import 'package:flutter/material.dart'; +import 'package:labs_petrushin/Presentation/home_page/bloc/bloc.dart'; +import 'package:labs_petrushin/repositories/food_repository.dart'; import 'home_page/home_page.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; void main() { @@ -17,7 +20,15 @@ class MyApp extends StatelessWidget { colorScheme: ColorScheme.fromSeed(seedColor: Colors.red), useMaterial3: true, ), - home: const MyHomePage(title: 'Petrushin Egor Alexandrovich'), + home: RepositoryProvider( + lazy: true, + create: (_) => FoodRepository(), + child: BlocProvider( + lazy: false, + create: (context) => HomeBloc(context.read()), + child: const MyHomePage(title: 'Петрушин Егор Александрович',), + ) + ) ); } } diff --git a/lib/data/dtos/foods_dto.g.dart b/lib/data/dtos/foods_dto.g.dart deleted file mode 100644 index 3eb2e09..0000000 --- a/lib/data/dtos/foods_dto.g.dart +++ /dev/null @@ -1,20 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'foods_dto.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -FoodsDto _$FoodsDtoFromJson(Map json) => FoodsDto( - foods: (json['foods'] as List?) - ?.map((e) => FoodDataDto.fromJson(e as Map)) - .toList(), - ); - -FoodDataDto _$FoodDataDtoFromJson(Map json) => FoodDataDto( - fdcId: (json['fdcId'] as num?)?.toInt(), - brandName: json['brandName'] as String?, - description: json['description'] as String?, - image: json['image'] as String?, - ); diff --git a/pubspec.lock b/pubspec.lock index e5255b0..f962be0 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -26,10 +26,10 @@ packages: dependency: transitive description: name: args - sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a" + sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 url: "https://pub.dev" source: hosted - version: "2.5.0" + version: "2.6.0" async: dependency: transitive description: @@ -38,6 +38,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.11.0" + bloc: + dependency: transitive + description: + name: bloc + sha256: "106842ad6569f0b60297619e9e0b1885c2fb9bf84812935490e6c5275777804e" + url: "https://pub.dev" + source: hosted + version: "8.1.4" boolean_selector: dependency: transitive description: @@ -154,18 +162,34 @@ packages: dependency: transitive description: name: convert - sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.2" + copy_with_extension: + dependency: transitive + description: + name: copy_with_extension + sha256: fbcf890b0c34aedf0894f91a11a579994b61b4e04080204656b582708b5b1125 + url: "https://pub.dev" + source: hosted + version: "5.0.4" + copy_with_extension_gen: + dependency: "direct main" + description: + name: copy_with_extension_gen + sha256: "51cd11094096d40824c8da629ca7f16f3b7cea5fc44132b679617483d43346b0" + url: "https://pub.dev" + source: hosted + version: "5.0.4" crypto: dependency: transitive description: name: crypto - sha256: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27 + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.6" cupertino_icons: dependency: "direct main" description: @@ -198,6 +222,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" + equatable: + dependency: "direct main" + description: + name: equatable + sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 + url: "https://pub.dev" + source: hosted + version: "2.0.5" fake_async: dependency: transitive description: @@ -210,23 +242,31 @@ packages: dependency: transitive description: name: file - sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "7.0.1" fixnum: dependency: transitive description: name: fixnum - sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" flutter: dependency: "direct main" description: flutter source: sdk version: "0.0.0" + flutter_bloc: + dependency: "direct main" + description: + name: flutter_bloc + sha256: b594505eac31a0518bdcb4b5b79573b8d9117b193cc80cc12e17d639b10aa27a + url: "https://pub.dev" + source: hosted + version: "8.1.6" flutter_lints: dependency: "direct dev" description: @@ -348,10 +388,10 @@ packages: dependency: transitive description: name: logging - sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.3.0" macros: dependency: transitive description: @@ -392,6 +432,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" package_config: dependency: transitive description: @@ -424,6 +472,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.0" + provider: + dependency: transitive + description: + name: provider + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c + url: "https://pub.dev" + source: hosted + version: "6.1.2" pub_semver: dependency: transitive description: @@ -545,10 +601,10 @@ packages: dependency: transitive description: name: typed_data - sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.4.0" vector_math: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 09800f9..bcc4f56 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,46 +1,30 @@ name: labs_petrushin description: "A new Flutter project." -# The following line prevents the package from being accidentally published to -# pub.dev using `flutter pub publish`. This is preferred for private packages. publish_to: 'none' # Remove this line if you wish to publish to pub.dev -# The following defines the version and build number for your application. -# A version number is three numbers separated by dots, like 1.2.43 -# followed by an optional build number separated by a +. -# Both the version and the builder number may be overridden in flutter -# build by specifying --build-name and --build-number, respectively. -# In Android, build-name is used as versionName while build-number used as versionCode. -# Read more about Android versioning at https://developer.android.com/studio/publish/versioning -# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. -# Read more about iOS versioning at -# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -# In Windows, build-name is used as the major, minor, and patch parts -# of the product and file versions while build-number is used as the build suffix. -version: 1.0.0+1 environment: sdk: ^3.5.2 -# Dependencies specify other packages that your package needs in order to work. -# To automatically upgrade your package dependencies to the latest versions -# consider running `flutter pub upgrade --major-versions`. Alternatively, -# dependencies can be manually updated by changing the version numbers below to -# the latest version available on pub.dev. To see which dependencies have newer -# versions available, run `flutter pub outdated`. + dependencies: flutter: sdk: flutter - - cupertino_icons: ^1.0.8 json_annotation: ^4.8.1 dio: ^5.4.2+1 pretty_dio_logger: ^1.3.1 + equatable: ^2.0.5 + flutter_bloc: ^8.1.5 + copy_with_extension_gen: ^5.0.4 + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.8 dev_dependencies: flutter_test: sdk: flutter - json_serializable: ^6.1.5 - build_runner: ^2.1.10 + build_runner: ^2.4.9 + json_serializable: ^6.7.1 # The "flutter_lints" package below contains a set of recommended lints to # encourage good coding practices. The lint set provided by the package is @@ -59,34 +43,3 @@ flutter: # included with your application, so that you can use the icons in # the material Icons class. uses-material-design: true - - # To add assets to your application, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/to/resolution-aware-images - - # For details regarding adding assets from package dependencies, see - # https://flutter.dev/to/asset-from-package - - # To add custom fonts to your application, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts from package dependencies, - # see https://flutter.dev/to/font-from-package